2017年6月24日土曜日

19: 第2のサンプルUNO拡張機能(LibreOffice拡張機能またはApache OpenOffice拡張機能)を別の構造で開発する、パート1

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

Main body START

第2のサンプルUNO拡張機能を開発する目的は何か?

-Hypothesizer

第1のUNO拡張機能を開発し理解したので、このUNO拡張機能の構造を変更し、いくつかの実験もしてみたい。実際には、我々は、第1のUNO拡張機能を変更するのではなく、第2のUNO拡張機能を別の構造で開発する。

-Rebutter

いいだろう。

-Hypothesizer

我々の目的は以下の事をすることだ。

  1. UNOデータタイプの定義を専用のプロジェクトに分離し、このプロジェクトのUNOデータタイプ「マージされた」レジストリファイルとJarファイルをLibreOfficeに直接登録する。
  2. UNOユーティリティJarファイルをLibreOfficeに直接登録する。
  3. コアユーティリティプロジェクトを作り、そのJarファイルをLibreOfficeに直接登録する。
  4. グローバルUNOサービスを、'グローバルUNOサービス'インスタンスファクトリなしで、作成・利用する実験をする。
  5. UNOサービスとして登録しないUNOコンポーネントを作成・利用する実験をする。
  6. UNO旧スタイルサービスを作り、このUNO旧スタイルサービスの'グローバルUNOサービス'インスタンスファクトリを作り、この'グローバルUNOサービス'インスタンスファクトリによってこのUNO旧スタイルサービスのインスタンスを生成する実験をする。
  7. Java内で生成されたUNOオブジェクトのインスタンスを、'UnoRuntime.queryInterface'メソッドを使わずに、あるUNOインターフェースに直接キャストする実験をする。
  8. UNO旧スタイルサービスのシングルトンファクトリを作る実験をする。

実は、最終形の構造物はここにある。

-Rebutter

オーケー。上記項目についてここでコメントすることはせず、1つ1つ実際にやっていこう。

UNOデータタイププロジェクトを作り、このプロジェクトのUNOデータタイプ「マージされた」レジストリファイルとJarファイルをLibreOfficeに直接登録する

-Hypothesizer

項目1にしたがって、我々は、UNOデータタイププロジェクト、'unoAdditionalDataTypesToDisclose'を作る。

このプロジェクトディレクトリを開発ディレクトリ(共通Gradleスクリプト群またはAntビルドファイル群が格納されているディレクトリ)直下に作る。

-Rebutter

つまり、このプロジェクトディレクトリを、第1のサンプルUNO拡張機能プロジェクトとディレクトリ階層上同レベルに作るわけだ。

-Hypothesizer

そうだ。我々は、プロジェクトディレクトリを常にこの同じレベルに作る。

次に、プロジェクト別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ビルドスクリプトについての説明から分かるだろうから。

-Rebutter

オーケー。

-Hypothesizer

次に、プロジェクトディレクトリ直下に'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
-Rebutter

うーん、基本的に、構造は、第1サンプルのものと同じだ。

-Hypothesizer

そうだ。しかし、我々は、後で、いくつかのメソッドを追加する。また、後で、UNOインターフェースもいくつか追加する。

-Rebutter

なるほど。

-Hypothesizer

これは最終形ではないが、ここでプロジェクトをビルドする。ターミナルを開いて、カレントディレクトリをプロジェクトディレクトリに移し、'gradle'コマンドまたは'ant'コマンドを実行する。

-Rebutter

ははあ、コマンドが正常終了した。

-Hypothesizer

ターゲットディレクトリに、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に登録されているはずだ。

-Rebutter

UNOデータタイプ「マージされた」レジストリファイルについて、何らかのファイルに設定を入れる必要はないのか?

-Hypothesizer

ない。シンボリックリンクを作るだけで登録される。他方で、Jarファイルのオリジナルのパスをファイル、'fundamentalrc'または'fundamental.ini'に設定するのであれば、Jarファイルのシンボリックリンクを作る必要はない。

-Rebutter

なるほど。

-Hypothesizer

LibreOfficeがアップデートされるとき、これらの設定が失われる可能性があることに注意しょう。LinuxシェルスクリプトやWindowsバッチファイルでこれらの設定をしたほうがよいかもしれない。

-Rebutter

我々がアップデートした時は、これらの設定が失われたのか?

-Hypothesizer

そう。Linuxでは、'fundamentalrc'がデフォルトのファイルで置き換わり、Windowsでは、すべての設定が失われた。

-Rebutter

ふーむ。

-Hypothesizer

とにかく、UNOデータタイプをUNO拡張機能から独立して登録することで、任意のUNO拡張機能がこうしたUNOデータタイプにアクセスできるようになる。

-Rebutter

ははあ。

UNOユーティリティJarファイルをLibreOfficeに直接登録する

-Hypothesizer

項目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ファイルのオリジナルのパスを追加すればよい。

-Rebutter

分かった。

コアユーティリティプロジェクトを作り、そのJarファイルをLibreOfficeに直接登録する

-Hypothesizer

項目3にしたがって、別のプロジェクトであるコアユーティリティプロジェクト、'coreUtilitiesToDisclose'を作成する。

-Rebutter

このプロジェクトは何だ?

-Hypothesizer

これは、UNOを使用しないユーティリティクラスを格納するプロジェクトだ。

-Rebutter

ふーむ、 . . .

-Hypothesizer

もちろん、技術的には、これらのクラスをUNOユーティリティプロジェクトに含めることはできる。しかし、管理上の観点から、これらは、UNOユーティリティプロジェクトから分離する。これらは、UNOを全然使用しないプロジェクトから使われる可能性があるから。

-Rebutter

なるほど。

-Hypothesizer

'source'ディレクトリ配下に、Javaクラスのソースファイル、'java/thebiasplanet/coreutilities/messaging/Publisher.java'を作った。これは、メッセージを組み立て、メッセージボックスを表示するスタティックメソッドクラスだ。このクラスの詳細を説明するのはやめておこう。それはここの論点ではないから。

プロジェクト別Gradleビルドスクリプトの説明もやめておこう。特別なことは何もないから。

-Rebutter

いいだろう。

-Hypothesizer

いつもの方法でプロジェクトをビルドするが、Jarファイルを別の方法で登録する。

-Rebutter

ふむ?

-Hypothesizer

LibreOfficeのプログラムプロセスで、メニュー項目、'Tools'('ツール')-'Options...'('オプション...')をクリックする−>新たに開いたダイアログボックスで、左側の'LibreOffice'-'Advanced'('詳細')を選択する−>右側で、'Class Path...'('クラスパス')ボタンをクリックする−>新たに開いたダイアログボックスで、'Add Archive...'('アーカイブを追加')をクリックする−>Jarファイルを選択する−>'OK'ボタンをクリックする−'OK'ボタンをクリックする。LibreOfficeプログラムプロセスは再起動しなければならない。

-Rebutter

Jarファイルを、UNOユーティリティJarファイルと同じ方法で登録できないのか?

-Hypothesizer

できる。ただし、先の方法で登録したJarファイルのJavaクラスファイルは後の方法で登録したJarファイルのJavaクラスファイルにアクセスできるが、反対はできないことに注意しよう。すべてUNOクラスは先の方法で登録されているので、後の方法で登録されたJarファイルのJavaクラスは、UNOの機能に全くアクセスできない。

-Rebutter

すると、後の方法で登録されたJarファイルのJavaクラスは、より広い範囲のJavaクラスからアクセス可能なわけだ。

-Hypothesizer

それが、コアユーティリティJarファイルを後の方法で我々が登録する理由だ。

Main body END

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