Top > OOoSDK > java > Tutorial > Hello > service

Hello サービスの実装

やっと Hello サービス本体の実装を行います。"Hello.java" ファイルをクラスファイルとして com.sun.star.comp.demo パッケージに作成します。また,Talker クラスを作成します。

Hello.java.png

Hello.java

com.sun.star.comp.demo パッケージに "Hello.java" として Hello クラスを作成しておいてください。

パッケージ

まずは,パッケージの指定です。IDE を使っている人は自動で挿入されていると思います。

package com.sun.star.comp.demo;

インポート

今回,必要なファイルをインポートします。

import com.sun.star.demo.XHello;

import com.sun.star.lib.uno.helper.ComponentBase;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.comp.loader.FactoryHelper;

最初の com.sun.star.demo.XHello は今回作成したクラスになります。前のページの demo.rdb ファイルから javameker を使って自動生成したものです。このインターフェースを Hello クラスに実装します。

ほかのクラスファイルについて説明します。

com.sun.star.lib.uno.helper.ComponentBaseこのクラスを拡張して Hello クラスを作成します。
com.sun.star.uno.XComponentContext
com.sun.star.lang.XServiceInfoサービスの情報を提供するためのインターフェースです。このインターフェースも Hello クラスに実装します。
com.sun.star.lang.XMultiServiceFactory
com.sun.star.lang.XSingleServiceFactory
com.sun.star.registry.XRegistryKey
com.sun.star.comp.loader.FactoryHelperこの FactoryHelper を使ってサービスを実装します。

クラスの宣言

まず,Hello クラスを次のようにして始めます。

public class Hello extends ComponentBase implements XServiceInfo, XHello {

Hello クラスを ComponentBase の拡張として作成し,XServiceInfo および XHello インターフェースを実装します。

コンストラクタ

コンストラクタ付近についてです。特に変わったところはありませんが,引数に注意しておいてください。

	private Talker talker = null;
	
	public Hello(XComponentContext xContext) {
		talker = new Talker();
	}

後ほど作成する Talker クラスのオブジェクトを作成しています。

sayHello() メソッド

この Hello サービスのメソッド sayHello() の定義を行います。

	public String sayHello() {
		return talker.sayHello();
	}

定義するメソッド sayHello() の戻り値は String 型です。コンストラクタで作成した Talker クラスのオブジェクト talker のメソッド sayHello() の戻り値を利用します。

ここでは,Talker クラスを利用していますが,こんなに簡単な場合にはわざわざ別のクラスを作成する必要はないでしょう。しかし,大きなサービスを作成するときにはこのような仕組みは必須でしょうから,ここでは例としてこのように作成します。

XServiceInfo

Hello クラスに実装した XServiceInfo インターフェースのメソッドを次のように実装します。

	//
	static final String SERVICENAME = "com.sun.star.demo.Hello";
	
	public String getImplementationName() {
		return getClass().getName();
	}
	
	public boolean supportsService(String serviceName) {
		if (serviceName.equals(SERVICENAME))
			return true;
		return false;
	}
	
	public String[] getSupportedServiceNames() {
		return new String[] {SERVICENAME};
	}

これらのメソッドは次のようなものです。

String getImplementationName()サービスの実装名を戻します。
boolean supportsService( [in]string ServiceName )サービスがサポートされているかどうかを判断します。
sequence<string> getSupportedServiceNames()サポートしているサービス名をすべて戻します。

XServiceInfo はオブジェクトが必ず実装する必要があります。

UNO コンポーネントが一つだけのサービスを持つときは,このような実装方法で行えますが,複数のサービスを持つときにはより複雑になります。(DevG_4.5)

ファクトリ

UNO コンポーネントはファクトリーを戻すことができるようにする必要があります。これはサービスの実装のために必要です。

	public static XSingleServiceFactory __getServiceFactory(String implName, 
			XMultiServiceFactory multiFactory, XRegistryKey regKey) {
		XSingleServiceFactory xSingleServiceFactory = null;
		
		if (implName.equals(Hello.class.getName())) {
			xSingleServiceFactory = 
				FactoryHelper.getServiceFactory(
						Hello.class, 
						Hello.SERVICENAME, multiFactory, regKey);
		}
		return xSingleServiceFactory;
	}

インポートした com.sun.star.comp.loader.FactoryHelper を使用しています。

レジストリデータベースへの登録

UNO コンポーネントは OpenOffice.org が持っているレジストリデータベースに登録される必要があります。サービスを見つけるために使用されます。特定のメソッドを定義しておくことでそのサービスが登録されます。

まずは,UNO のインストール時にレジストリへ登録される必要があります。これには,Helper のメソッドを使用します。定義するのは,__writeRegistryServiceInfo メソッドです。

	public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
		return FactoryHelper.writeRegistryServiceInfo(Hello.class.getName(), SERVICENAME, regKey);
	}

全体

これで Hello.java ができました。

ここで,全体をしめします。fileHello.java

つぎは Talker クラスの実装 に移ります。

package com.sun.star.comp.demo;


import com.sun.star.demo.XHello;

import com.sun.star.lib.uno.helper.ComponentBase;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.comp.loader.FactoryHelper;



public class Hello extends ComponentBase implements XServiceInfo, XHello {
	private Talker talker = null;
	
	public Hello(XComponentContext xContext) {
		talker = new Talker();
	}
	
	public String sayHello() {
		return talker.sayHello();
	}
	
	// XServiceInfo
	static final String SERVICENAME = "com.sun.star.demo.Hello";
	
	public String getImplementationName() {
		return getClass().getName();
	}
	
	public boolean supportsService(String serviceName) {
		if (serviceName.equals(SERVICENAME))
			return true;
		return false;
	}
	
	public String[] getSupportedServiceNames() {
		return new String[] {SERVICENAME};
	}
	
	//
	public static XSingleServiceFactory __getServiceFactory(String implName, 
			XMultiServiceFactory multiFactory, XRegistryKey regKey) {
		XSingleServiceFactory xSingleServiceFactory = null;
		
		if (implName.equals(Hello.class.getName())) {
			xSingleServiceFactory = 
				FactoryHelper.getServiceFactory(
						Hello.class, 
						Hello.SERVICENAME, multiFactory, regKey);
		}
		return xSingleServiceFactory;
	}
	
	public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
		return FactoryHelper.writeRegistryServiceInfo(Hello.class.getName(), SERVICENAME, regKey);
	}
	
}

それでは,つぎは

Talker クラスの実装 に移ります。


Attach file: fileHello.java.png 349 download [Information] fileHello.java 633 download [Information]

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes