Hello サービスの実装やっと Hello サービス本体の実装を行います。"Hello.java" ファイルをクラスファイルとして com.sun.star.comp.demo パッケージに作成します。また,Talker クラスを作成します。 Hello.javacom.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 クラスに実装します。 ほかのクラスファイルについて説明します。
クラスの宣言まず,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 クラスを利用していますが,こんなに簡単な場合にはわざわざ別のクラスを作成する必要はないでしょう。しかし,大きなサービスを作成するときにはこのような仕組みは必須でしょうから,ここでは例としてこのように作成します。 XServiceInfoHello クラスに実装した 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}; } これらのメソッドは次のようなものです。
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 ができました。 ここで,全体をしめします。 つぎは 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 クラスの実装 に移ります。 |