<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
'hiUnoExtensionsUnoExtension'ディレクトリには、 サンプルUNO拡張機能プロジェクトが格納されている。
'build.xml'、'build.gradle'というファイル、'source'、'java'、'resource'というディレクトリ、'MANIFEST.MF.addition'の説明は、先ほどと同じだ。. . .
. . . それから?
残りは説明が難しい部分だ。'HiUnoExtensionsImplementation.java'は、UNOインターフェースのインプリメンテーションクラスだ。
. . .
. . . とにかく、今のところは、UNOインターフェースと呼ばれる概念があって、Javaインターフェースにマッピングされるのだと受け入れてもらおう。'HiUnoExtensionsImplementation.java'は、UNOインターフェースからマッピングされたJavaインターフェースのインプリメンテーションだ。
よかろう。
'HiUnoExtensionsUnoExtensionGlobalServicesProvider.java'は、UNOインターフェースインプリメンテーションをグローバルUNOサービスとしてLibreOfficeに登録するために必要なクラスだ。そうしたクラスは、'グローバルUNOサービス'プロバイダーと呼ばれる。
. . .
. . . ともかく、今のところ、お願いだから、グローバルUNOサービスと呼ばれる概念があるのだと受け入れてくれ。UNOインターフェースインプリメンテーションをすべてグローバルUNOサービスとして登録しなければいけないわけではないが、UNOインターフェースインプリメンテーションをグローバルUNOサービスとして登録したい場合は、一つの'グローバルUNOサービス'プロバイダが必要になる。
複数のグローバルUNOサービスに対して、一つの'グローバルUNOサービス'プロバイダーなのか?
そうだ。一つのUNO拡張機能に複数のUNOインターフェースインプリメンテーションを含めることができ、その一部をグローバルUNOサービスとして登録できるが、そのUNO拡張機能には一つだけの'グローバルUNOサービス'プロバイダーがあることになる。
'グローバルUNOサービス'プロバイダーには何を記述しなければならないのか?
グローバルUNOサービスとして登録する各UNOインターフェースインプリメンテーションに、UNOサービス名を関連づけなければならない。'unoUtilitiesToDisclose'プロジェクトの'GlobalUnoServicesProviderUtility.java'には、'グローバルUNOサービス'プロバイダーから使われるスタティックメソッド群が格納されている。つまり、あらゆる'グローバルUNOサービス'プロバイダーが使う共通のコードが、それらの'グローバルUNOサービス'プロバイダーからこのクラスに分離されている。
なるほど。
'resource'ディレクトリの中の'manifest.xml'ファイルは、UNO拡張機能ファイルのマニフェストファイルだ。
UNO拡張機能ファイル?
UNO拡張機能は、zipファイルとしてアーカイブされるが、これがUNO拡張機能ファイルだ。
このマニフェストファイルには、何を記述しなければならないのか?
どのUNOデータタイプレジストリファイルがUNO拡張機能に含まれるかを記述しなければならず、また、UNOコンポーネント設定ファイル(後で説明する)の名前も指定しなければならない。
UNOデータタイプレジストリファイルというのは何だ?
UNOはプログラミング言語に依存しないので、UNOインターフェースといったUNOデータタイプは、プログラミング言語に依存しない形でLibreOfficeに登録されなければならない。UNOデータタイプレジストリファイルは、UNOデータタイプの定義を、この「プログラミング言語に依存しない形」で格納する。
UNOデータタイプレジストリファイルはどのように作られるのか?
UNO独自のソースファイルからUNOのツールを使って作ることができる。
ふーむ . . .
'thebiasplanet.hiunoextensionsunoextension.uno.components'というファイルは、先ほどのマニフェストファイルで名指しされたUNOコンポーネント設定ファイルだ。UNOコンポーネント設定ファイルは、UNO格納機能に含まれるUNOインターフェースインプリメンテーションを指定する。また、この設定ファイルでは、グローバルUNOインターフェースサービスとして登録するUNOインターフェースインプリメンテーションにUNOサービス名を関連づけもする。
. . . その情報は、既に、'グローバルUNOサービス'プロバイダーで指定したのではなかったか?
うーん、 . . . 冗長ではないかと責めているのであれば、私は、冗長だと思う。
ふーむ、そう求められているのであれば致し方ない。
'unoIdl'というディレクトリは、UNOIDL(UNO Interface Definition Language)ファイル群のルートディレクトリだ。
. . .
. . . UNOIDLは、UNOの構造物を定義する定義言語だ。例えば、UNOインターフェースは、まず、UNOIDLファイルにUNOIDLで定義される。このUNOインターフェースが、JavaインターフェースのクラスファイルとUNOデータタイプ「マージされていない」レジストリファイルに変換される。実のところ、先に言った「UNO独自のソースファイル」というのは、UNOIDLファイルのことだ。
UNOデータタイプ「マージされていない」レジストリファイル?
まず、UNOデータタイプ「マージされていない」レジストリファイルをUNOデータタイプ毎に作る。次に、これらのUNOデータタイプ「マージされていない」レジストリファイル群を、UNOデータタイプ「マージされた」レジストリファイルにマージする。これが、先ほど言ったUNOデータタイプレジストリファイルだ。
ははあ。
'unoIdl'というディレクトリ配下の'thebiasplanet'といったディレクトリは、UNOモジュールを示している。UNOモジュールは、Javaパッケージに相当するものだと考えることができる。実際、UNOモジュールはJavaパッケージにマッピングされる。
'XHiUnoExtensions.idl'は、UNOインターフェースが定義されているUNOIDLファイルだ。
'HiUnoExtensions.idl'については、 . . .
. . . それについては、何だ?
参考文書にある記述は紛らわしいので、自分の用語で説明しよう。'HiUnoExtensions.idl'は、'グローバルUNOサービス'インスタンスファクトリーが定義されたUNOIDLファイルだ。
君の説明はわかるが、参考文書にある記述はどうなっているのか?
「UNO新スタイルサービス」が定義されていると言っている。
UNO新スタイルサービスというのは何だ?
参考文書における「UNO新スタイルサービス」と「UNO旧スタイルサービス」という用語の使用法は紛らわしく、ここでは説明できない(UNOの基本概念を学ぶ時に説明しよう)。ただ、ともかく、「UNO新スタイルサービス」は、一種のUNOサービスのように聞こえるが、このUNOIDLファイルで定義されているのはUNOサービス自体ではなく、UNOサービスのインスタンスファクトリーだ。
このUNOIDLでは、具体的に何が記述されるのか?
このUNOIDLファイルでは「コンストラクタ」と呼ばれるものが定義される。このUNOIDLファイルは、これらの「コンストラクタ」群をスタティックメソッド群として持つJavaクラスファイルに変換される。これらのスタティックメソッドを呼ぶことで、グローバルUNOサービスのインスタンスを作ることができる。
すると、「コンストラクタ」というのは、Javaで言うところのコンストラクタではなく、ファクトリーメソッドなわけだ。このUNOIDLファイルから変換されてできたJavaクラスは、UNOサービスのインスタンスファクトリーであって、UNOサービスではない。
それが、私の言っていることだ。実際、このグローバルUNOサービスを登録して使用するのに、このUNOIDLファイルを作る必要はない。このタイプのUNOサービスインスタンスファクトリーを使用するつもりがないのであれば。
しかし、グローバルUNOサービスをインスタンス化するのに、何らかのUNOサービスインスタンスファクトリーが必要ではないのか?
必要だ、しかし、グローバルUNOサービスマネージャーと呼ばれる汎用のUNOサービスインスタンスファクトリーがあり、このグローバルUNOサービスマネージャーからグローバルUNOサービスをインスタンス化できる。「汎用の」と言ったのは、このグローバルUNOサービスマネージャーは、複数のUNOサービスをインスタンス化できるという意味だ。対して、このUNOIDLファイルから変換されて出来るUNOサービスインスタンスファクトリーは、特定一つのUNOサービスだけをインスタンス化できる特定のUNOサービス専用のUNOサービスインスタンスファクトリーだ。
分かった。
- Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide