2017年4月22日土曜日

8: 最初のUNO拡張機能(LibreOffice拡張機能またはApache OpenOffice拡張機能)をビルドする、パート2

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

Main body START

サンプルUNO拡張機能プロジェクト

-Hypothesizer

'hiUnoExtensionsUnoExtension'ディレクトリには、 サンプルUNO拡張機能プロジェクトが格納されている。

'build.xml'、'build.gradle'というファイル、'source'、'java'、'resource'というディレクトリ、'MANIFEST.MF.addition'の説明は、先ほどと同じだ。. . .

-Rebutter

. . . それから?

-Hypothesizer

残りは説明が難しい部分だ。'HiUnoExtensionsImplementation.java'は、UNOインターフェースのインプリメンテーションクラスだ。

-Rebutter

. . .

-Hypothesizer

. . . とにかく、今のところは、UNOインターフェースと呼ばれる概念があって、Javaインターフェースにマッピングされるのだと受け入れてもらおう。'HiUnoExtensionsImplementation.java'は、UNOインターフェースからマッピングされたJavaインターフェースのインプリメンテーションだ。

-Rebutter

よかろう。

-Hypothesizer

'HiUnoExtensionsUnoExtensionGlobalServicesProvider.java'は、UNOインターフェースインプリメンテーションをグローバルUNOサービスとしてLibreOfficeに登録するために必要なクラスだ。そうしたクラスは、'グローバルUNOサービス'プロバイダーと呼ばれる。

-Rebutter

. . .

-Hypothesizer

. . . ともかく、今のところ、お願いだから、グローバルUNOサービスと呼ばれる概念があるのだと受け入れてくれ。UNOインターフェースインプリメンテーションをすべてグローバルUNOサービスとして登録しなければいけないわけではないが、UNOインターフェースインプリメンテーションをグローバルUNOサービスとして登録したい場合は、一つの'グローバルUNOサービス'プロバイダが必要になる。

-Rebutter

複数のグローバルUNOサービスに対して、一つの'グローバルUNOサービス'プロバイダーなのか?

-Hypothesizer

そうだ。一つのUNO拡張機能に複数のUNOインターフェースインプリメンテーションを含めることができ、その一部をグローバルUNOサービスとして登録できるが、そのUNO拡張機能には一つだけの'グローバルUNOサービス'プロバイダーがあることになる。

-Rebutter

'グローバルUNOサービス'プロバイダーには何を記述しなければならないのか?

-Hypothesizer

グローバルUNOサービスとして登録する各UNOインターフェースインプリメンテーションに、UNOサービス名を関連づけなければならない。'unoUtilitiesToDisclose'プロジェクトの'GlobalUnoServicesProviderUtility.java'には、'グローバルUNOサービス'プロバイダーから使われるスタティックメソッド群が格納されている。つまり、あらゆる'グローバルUNOサービス'プロバイダーが使う共通のコードが、それらの'グローバルUNOサービス'プロバイダーからこのクラスに分離されている。

-Rebutter

なるほど。

-Hypothesizer

'resource'ディレクトリの中の'manifest.xml'ファイルは、UNO拡張機能ファイルのマニフェストファイルだ。

-Rebutter

UNO拡張機能ファイル?

-Hypothesizer

UNO拡張機能は、zipファイルとしてアーカイブされるが、これがUNO拡張機能ファイルだ。

-Rebutter

このマニフェストファイルには、何を記述しなければならないのか?

-Hypothesizer

どのUNOデータタイプレジストリファイルがUNO拡張機能に含まれるかを記述しなければならず、また、UNOコンポーネント設定ファイル(後で説明する)の名前も指定しなければならない。

-Rebutter

UNOデータタイプレジストリファイルというのは何だ?

-Hypothesizer

UNOはプログラミング言語に依存しないので、UNOインターフェースといったUNOデータタイプは、プログラミング言語に依存しない形でLibreOfficeに登録されなければならない。UNOデータタイプレジストリファイルは、UNOデータタイプの定義を、この「プログラミング言語に依存しない形」で格納する。

-Rebutter

UNOデータタイプレジストリファイルはどのように作られるのか?

-Hypothesizer

UNO独自のソースファイルからUNOのツールを使って作ることができる。

-Rebutter

ふーむ . . .

-Hypothesizer

'thebiasplanet.hiunoextensionsunoextension.uno.components'というファイルは、先ほどのマニフェストファイルで名指しされたUNOコンポーネント設定ファイルだ。UNOコンポーネント設定ファイルは、UNO格納機能に含まれるUNOインターフェースインプリメンテーションを指定する。また、この設定ファイルでは、グローバルUNOインターフェースサービスとして登録するUNOインターフェースインプリメンテーションにUNOサービス名を関連づけもする。

-Rebutter

. . . その情報は、既に、'グローバルUNOサービス'プロバイダーで指定したのではなかったか?

-Hypothesizer

うーん、 . . . 冗長ではないかと責めているのであれば、私は、冗長だと思う。

-Rebutter

ふーむ、そう求められているのであれば致し方ない。

-Hypothesizer

'unoIdl'というディレクトリは、UNOIDL(UNO Interface Definition Language)ファイル群のルートディレクトリだ。

-Rebutter

. . .

-Hypothesizer

. . . UNOIDLは、UNOの構造物を定義する定義言語だ。例えば、UNOインターフェースは、まず、UNOIDLファイルにUNOIDLで定義される。このUNOインターフェースが、JavaインターフェースのクラスファイルとUNOデータタイプ「マージされていない」レジストリファイルに変換される。実のところ、先に言った「UNO独自のソースファイル」というのは、UNOIDLファイルのことだ。

-Rebutter

UNOデータタイプ「マージされていない」レジストリファイル?

-Hypothesizer

まず、UNOデータタイプ「マージされていない」レジストリファイルをUNOデータタイプ毎に作る。次に、これらのUNOデータタイプ「マージされていない」レジストリファイル群を、UNOデータタイプ「マージされた」レジストリファイルにマージする。これが、先ほど言ったUNOデータタイプレジストリファイルだ。

-Rebutter

ははあ。

-Hypothesizer

'unoIdl'というディレクトリ配下の'thebiasplanet'といったディレクトリは、UNOモジュールを示している。UNOモジュールは、Javaパッケージに相当するものだと考えることができる。実際、UNOモジュールはJavaパッケージにマッピングされる。

'XHiUnoExtensions.idl'は、UNOインターフェースが定義されているUNOIDLファイルだ。

'HiUnoExtensions.idl'については、 . . .

-Rebutter

. . . それについては、何だ?

-Hypothesizer

参考文書にある記述は紛らわしいので、自分の用語で説明しよう。'HiUnoExtensions.idl'は、'グローバルUNOサービス'インスタンスファクトリーが定義されたUNOIDLファイルだ。

-Rebutter

君の説明はわかるが、参考文書にある記述はどうなっているのか?

-Hypothesizer

「UNO新スタイルサービス」が定義されていると言っている。

-Rebutter

UNO新スタイルサービスというのは何だ?

-Hypothesizer

参考文書における「UNO新スタイルサービス」と「UNO旧スタイルサービス」という用語の使用法は紛らわしく、ここでは説明できない(UNOの基本概念を学ぶ時に説明しよう)。ただ、ともかく、「UNO新スタイルサービス」は、一種のUNOサービスのように聞こえるが、このUNOIDLファイルで定義されているのはUNOサービス自体ではなく、UNOサービスのインスタンスファクトリーだ。

-Rebutter

このUNOIDLでは、具体的に何が記述されるのか?

-Hypothesizer

このUNOIDLファイルでは「コンストラクタ」と呼ばれるものが定義される。このUNOIDLファイルは、これらの「コンストラクタ」群をスタティックメソッド群として持つJavaクラスファイルに変換される。これらのスタティックメソッドを呼ぶことで、グローバルUNOサービスのインスタンスを作ることができる。

-Rebutter

すると、「コンストラクタ」というのは、Javaで言うところのコンストラクタではなく、ファクトリーメソッドなわけだ。このUNOIDLファイルから変換されてできたJavaクラスは、UNOサービスのインスタンスファクトリーであって、UNOサービスではない。

-Hypothesizer

それが、私の言っていることだ。実際、このグローバルUNOサービスを登録して使用するのに、このUNOIDLファイルを作る必要はない。このタイプのUNOサービスインスタンスファクトリーを使用するつもりがないのであれば。

-Rebutter

しかし、グローバルUNOサービスをインスタンス化するのに、何らかのUNOサービスインスタンスファクトリーが必要ではないのか?

-Hypothesizer

必要だ、しかし、グローバルUNOサービスマネージャーと呼ばれる汎用のUNOサービスインスタンスファクトリーがあり、このグローバルUNOサービスマネージャーからグローバルUNOサービスをインスタンス化できる。「汎用の」と言ったのは、このグローバルUNOサービスマネージャーは、複数のUNOサービスをインスタンス化できるという意味だ。対して、このUNOIDLファイルから変換されて出来るUNOサービスインスタンスファクトリーは、特定一つのUNOサービスだけをインスタンス化できる特定のUNOサービス専用のUNOサービスインスタンスファクトリーだ。

-Rebutter

分かった。

Main body END

References

  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>