<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
第1のUNO拡張機能を開発し理解したので、このUNO拡張機能の構造を変更し、いくつかの実験もしてみたい。実際には、我々は、第1のUNO拡張機能を変更するのではなく、第2のUNO拡張機能を別の構造で開発する。
いいだろう。
我々の目的は以下の事をすることだ。
- UNOデータタイプの定義を専用のプロジェクトに分離し、このプロジェクトのUNOデータタイプ「マージされた」レジストリファイルとJarファイルをLibreOfficeに直接登録する。
- UNOユーティリティJarファイルをLibreOfficeに直接登録する。
- コアユーティリティプロジェクトを作り、そのJarファイルをLibreOfficeに直接登録する。
- グローバルUNOサービスを、'グローバルUNOサービス'インスタンスファクトリなしで、作成・利用する実験をする。
- UNOサービスとして登録しないUNOコンポーネントを作成・利用する実験をする。
- UNO旧スタイルサービスを作り、このUNO旧スタイルサービスの'グローバルUNOサービス'インスタンスファクトリを作り、この'グローバルUNOサービス'インスタンスファクトリによってこのUNO旧スタイルサービスのインスタンスを生成する実験をする。
- Java内で生成されたUNOオブジェクトのインスタンスを、'UnoRuntime.queryInterface'メソッドを使わずに、あるUNOインターフェースに直接キャストする実験をする。
- UNO旧スタイルサービスのシングルトンファクトリを作る実験をする。
実は、最終形の構造物はここにある。
オーケー。上記項目についてここでコメントすることはせず、1つ1つ実際にやっていこう。
項目1にしたがって、我々は、UNOデータタイププロジェクト、'unoAdditionalDataTypesToDisclose'を作る。
このプロジェクトディレクトリを開発ディレクトリ(共通Gradleスクリプト群またはAntビルドファイル群が格納されているディレクトリ)直下に作る。
つまり、このプロジェクトディレクトリを、第1のサンプルUNO拡張機能プロジェクトとディレクトリ階層上同レベルに作るわけだ。
そうだ。我々は、プロジェクトディレクトリを常にこの同じレベルに作る。
次に、プロジェクト別GradleビルドスクリプトまたはAntビルドファイルを、このプロジェクトディレクトリ直下に作る。Gradleビルドスクリプトの内容は以下のとおりだ。
// # Change the value
ext.TARGET_NAME = "thebiasplanet.unoadditionaldatatypes.uno"
apply ("from": "../commonBuild01.gradle")
// # Change the value
defaultTasks ("makeJar")
ext ({
// Add this if necessary
//CHECKSTYLE = "ON"
// Add this if necessary
//JAR_DEPLOY_DIRECTORY_NAME = ""
// Add this if necessary
//WAR_DEPLOY_DIRECTORY_NAME = ""
// # Change this if necessary
INCLUDED_JAR_FILE_NAMES = []
// # Change this if necessary
OTHER_CLASSES_PATHS = [JAVA_FILES_BASE_DIRECTORY_NAME, CLASSES_BASE_DIRECTORY_NAME, LIBREOFFICE_CLASSES_BASE_DIRECTORY_NAME + "/unoil.jar", LIBREOFFICE_CLASSES_BASE_DIRECTORY_NAME + "/jurt.jar", LIBREOFFICE_CLASSES_BASE_DIRECTORY_NAME + "/ridl.jar", LIBREOFFICE_CLASSES_BASE_DIRECTORY_NAME + "/juh.jar"]
REFERENCED_PROJECT_DIRECTORY_NAMES = []
})
apply ("from": "../commonBuild02.gradle")
デフォルトタスクが'makeJar'であることに注意しよう。
Antビルドファイルについての説明はもうしない。Gradleビルドスクリプトについての説明から分かるだろうから。
オーケー。
次に、プロジェクトディレクトリ直下に'source'ディレクトリを作り、'source'ディレクトリ配下に、UNOインターフェースのUNOIDLファイル、'unoIdl/thebiasplanet/uno/heyunoextensionsunoextension/XHeyUnoExtensions.idl'を作る。
このUNOインターフェースUNOIDLファイルの内容は以下のとおりだ。
// # Change the defined variable name START
#ifndef __thebiasplanet_uno_heyunoextensionsunoextension_XHeyUnoExtensions_idl__
#define __thebiasplanet_uno_heyunoextensionsunoextension_XHeyUnoExtensions_idl__
// # Change the defined variable name END
#include <com/sun/star/uno/XInterface.idl>
// # Add necessary idls START
#include <com/sun/star/lang/IllegalArgumentException.idl>
// # Add necessary idls END
// # Change the module name
module thebiasplanet { module uno { module heyunoextensionsunoextension {
// # Change the interface name and the parent interface
interface XHeyUnoExtensions: com::sun::star::uno::XInterface
{
// # Add methods START
string sayHey ( [in] string p_name)
raises (com::sun::star::lang::IllegalArgumentException);
// # Add methods END
};
}; }; };
#endif
うーん、基本的に、構造は、第1サンプルのものと同じだ。
そうだ。しかし、我々は、後で、いくつかのメソッドを追加する。また、後で、UNOインターフェースもいくつか追加する。
なるほど。
これは最終形ではないが、ここでプロジェクトをビルドする。ターミナルを開いて、カレントディレクトリをプロジェクトディレクトリに移し、'gradle'コマンドまたは'ant'コマンドを実行する。
ははあ、コマンドが正常終了した。
ターゲットディレクトリに、UNOデータタイプ「マージされた」レジストリファイル、'thebiasplanet.unoadditionaldatatypes.uno.rdb'とJarファイル、'thebiasplanet.unoadditionaldatatypes.uno.jar'があるはずだ。
以下のようにして、これらのファイルへのシンボリックリンクをいくつかのLibreOfficeディレクトリに作る。
Linux上:
ターミナルを開き、以下のコマンドを実行する('???'を環境に応じて設定し、必要であれば、LibreOfficeのディレクトリを変更する)。
cd /usr/lib/libreoffice/program/types
sudo ln -s /???/unoAdditionalDataTypesToDisclose/target/thebiasplanet.unoadditionaldatatypes.uno.rdb ./thebiasplanet.unoadditionaldatatypes.uno.rdb
cd ../classes
sudo ln -s /???/unoAdditionalDataTypesToDisclose/target/thebiasplanet.unoadditionaldatatypes.uno.jar ./thebiasplanet.unoadditionaldatatypes.uno.jar
Windows上:
コマンドプロンプトを管理者として開き('スタート'メニューのコマンドプロンプトアイコンを右クリックし、'管理者として実行'をクリックする)、以下のコマンドを実行する('?' と'???'を環境に応じて設定し、必要であれば、LibreOfficeのドライブ文字とディレクトリを変更する)。
D:
cd \LibreOffice\program\types
mklink .\thebiasplanet.unoadditionaldatatypes.uno.rdb ?:\???\unoAdditionalDataTypesToDisclose\target\thebiasplanet.unoadditionaldatatypes.uno.rdb
cd ..\classes
mklink .\thebiasplanet.unoadditionaldatatypes.uno.jar ?:\???\unoAdditionalDataTypesToDisclose\target\thebiasplanet.unoadditionaldatatypes.uno.jar
LibreOfficeの'program'ディレクトリ配下のファイル(Linuxでは'fundamentalrc'、Windowsでは'fundamental.ini')を開き、'URE_MORE_JAVA_TYPES'パラメータにJarファイルのシンボリックリンクパス('${BRAND_BASE_DIR}/program/classes/thebiasplanet.unoadditionaldatatypes.uno.jar')を追加する。ファイルパスはスペースで区切られることに注意しよう。
LibreOfficeのプログラムプロセスを再起動すれば、これらのファイルがLibreOfficeに登録されているはずだ。
UNOデータタイプ「マージされた」レジストリファイルについて、何らかのファイルに設定を入れる必要はないのか?
ない。シンボリックリンクを作るだけで登録される。他方で、Jarファイルのオリジナルのパスをファイル、'fundamentalrc'または'fundamental.ini'に設定するのであれば、Jarファイルのシンボリックリンクを作る必要はない。
なるほど。
LibreOfficeがアップデートされるとき、これらの設定が失われる可能性があることに注意しょう。LinuxシェルスクリプトやWindowsバッチファイルでこれらの設定をしたほうがよいかもしれない。
我々がアップデートした時は、これらの設定が失われたのか?
そう。Linuxでは、'fundamentalrc'がデフォルトのファイルで置き換わり、Windowsでは、すべての設定が失われた。
ふーむ。
とにかく、UNOデータタイプをUNO拡張機能から独立して登録することで、任意のUNO拡張機能がこうしたUNOデータタイプにアクセスできるようになる。
ははあ。
項目2にしたがって、我々は、UNOユーティリティJarファイルに先ほどと同じことをする。
Linux上:
ターミナルを開き、以下のコマンドを実行する('???'を環境に応じて設定し、必要であれば、LibreOfficeのディレクトリを変更する)。
cd /usr/lib/libreoffice/program/classes
sudo ln -s /???/unoUtilitiesToDisclose/target/thebiasplanet.unoutilities.jar ./thebiasplanet.unoutilities.jar
WIndows上:
コマンドプロンプトを管理者として開き('スタート'メニューのコマンドプロンプトアイコンを右クリックし、'管理者として実行'をクリックする)、以下のコマンドを実行する('?' と'???'を環境に応じて設定し、必要であれば、LibreOfficeのドライブ文字とディレクトリを変更する)。
D:
cd \LibreOffice\program\classes
mklink .\thebiasplanet.unoutilities.jar ?:\???\unoUtilitiesToDisclose\target\thebiasplanet.unoutilities.jar
LibreOfficeの'program'ディレクトリ配下のファイル(Linuxでは'fundamentalrc'、Windowsでは'fundamental.ini')を開き、'URE_MORE_JAVA_TYPES'パラメータにJarファイルのシンボリックリンクパス('${BRAND_BASE_DIR}/program/classes/thebiasplanet.unoutilities.jar')を追加する。シンボリックリンクを作らないのであれば、Jarファイルのオリジナルのパスを追加すればよい。
分かった。
項目3にしたがって、別のプロジェクトであるコアユーティリティプロジェクト、'coreUtilitiesToDisclose'を作成する。
このプロジェクトは何だ?
これは、UNOを使用しないユーティリティクラスを格納するプロジェクトだ。
ふーむ、 . . .
もちろん、技術的には、これらのクラスをUNOユーティリティプロジェクトに含めることはできる。しかし、管理上の観点から、これらは、UNOユーティリティプロジェクトから分離する。これらは、UNOを全然使用しないプロジェクトから使われる可能性があるから。
なるほど。
'source'ディレクトリ配下に、Javaクラスのソースファイル、'java/thebiasplanet/coreutilities/messaging/Publisher.java'を作った。これは、メッセージを組み立て、メッセージボックスを表示するスタティックメソッドクラスだ。このクラスの詳細を説明するのはやめておこう。それはここの論点ではないから。
プロジェクト別Gradleビルドスクリプトの説明もやめておこう。特別なことは何もないから。
いいだろう。
いつもの方法でプロジェクトをビルドするが、Jarファイルを別の方法で登録する。
ふむ?
LibreOfficeのプログラムプロセスで、メニュー項目、'Tools'('ツール')-'Options...'('オプション...')をクリックする−>新たに開いたダイアログボックスで、左側の'LibreOffice'-'Advanced'('詳細')を選択する−>右側で、'Class Path...'('クラスパス')ボタンをクリックする−>新たに開いたダイアログボックスで、'Add Archive...'('アーカイブを追加')をクリックする−>Jarファイルを選択する−>'OK'ボタンをクリックする−'OK'ボタンをクリックする。LibreOfficeプログラムプロセスは再起動しなければならない。
Jarファイルを、UNOユーティリティJarファイルと同じ方法で登録できないのか?
できる。ただし、先の方法で登録したJarファイルのJavaクラスファイルは後の方法で登録したJarファイルのJavaクラスファイルにアクセスできるが、反対はできないことに注意しよう。すべてUNOクラスは先の方法で登録されているので、後の方法で登録されたJarファイルのJavaクラスは、UNOの機能に全くアクセスできない。
すると、後の方法で登録されたJarファイルのJavaクラスは、より広い範囲のJavaクラスからアクセス可能なわけだ。
それが、コアユーティリティJarファイルを後の方法で我々が登録する理由だ。