2021年6月13日日曜日

61: JavaでUNOコンポーネントを作成する

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

例えば、リスナー、Swing GUIコンポーネント、マクロ言語では実装困難な機能コンポーネント、等

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Javaプログラミング言語

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、自らのUNOコンポーネントをJavaにて作成する方法を知る。

オリエンテーション


UNOインターフェイスを作成・登録し、当該マッピングイメージ群を生成する方法についての記事があります。

C++にてUNOコンポーネントを作成する方法についての記事があります。


本体

ト書き
Hypothesizer 7、Objector 61A、Objector 61Bが、コンピューターの前にいる。


1: 動機


Hypothesizer 7
UNOコンポーネントを作成しようとする根源的動機は、そのインスタンス(UNOオブジェクト)を別のプログラミング言語環境から操作できるようにすることです。

Objector 61A
おう?自信たっぷりの言い方だな!それが本当に唯一の動機か?

Hypothesizer 7
それが「根源的」な動機だと申し上げたのです、サー。

Objector 61A
ただムカデが大好きだという理由でなぜ俺はUNOコンポーネントを作成すべきじゃないんだ?

Hypothesizer 7
正しく根拠付けられた動機について私は話しているのです。

Objector 61A
ムカデの何が悪いんだ?

Hypothesizer 7
私はムカデが「悪い」とは申しませんでした。あなたの動機は正しく根拠付けられていないと申し上げたのです。

Objector 61B
悪いわよ。足が多すぎる。

Hypothesizer 7
彼らなりの理由があるのでしょう、多分、マダム。

Objector 61B
でも、あの足たちがシンクロして動くさま!身の毛がよだつわ(Creepy)!

Hypothesizer 7
彼らは、這う(creep)ように想定された生き物なのですよ。

Objector 61B
とにかく、私は、「そのインスタンスを別のプログラミング言語環境から操作できるように」したくなどないわ。ただ、あるリスナーを作りたいだけなの。

Hypothesizer 7
マダム、そのリスナークラスがUNOコンポーネントでなければならないのは、そのインスタンスは別のプログラミング言語環境から操作できるというように想定されているからです。

Objector 61B
私は別のプログラミング言語環境など持ってないわ、1つのJava環境しかないもの . . .

Hypothesizer 7
大抵の場合、あなたのJavaプログラムは、あるLibreOfficeまたはApache OpenOfficeインスタンスにアタッチされて、それを操作しますが、そのインスタンスが、基本的に言って、C++環境です。

Objector 61B
それで?

Hypothesizer 7
大抵の場合、当該ブロードキャスターはそのC++環境内にあり、そのブロードキャスターが当該リスナーを操作します。

Objector 61B
「当該ブロードキャスター」って何?

Hypothesizer 7
当該ブロードキャスターとは、当該リスナーを登録なさった先のオブジェクトのことです。

Objector 61B
私、登録したかしら?

Hypothesizer 7
. . . しなければなりません。

Objector 61A
だが、ブロードキャスターは元のJava環境内にいるかもしれないだろう?

Hypothesizer 7
そういうケースもあるかもしれません、しかし、そのブロードキャスターはそのリスナーにUNOオブジェクトであることを求めます、リスナーが他のプログラミング言語環境からのものであってもよいようにするために、そのことを、私は「根源的な動機」と呼んでいるのです。

Objector 61A
「UNOオブジェクト」?UNOコンポーネントと言いたかったんだろ?

Hypothesizer 7
UNOオブジェクトでよいのです。私が用語群をいかに厳格に使用するかをご理解ください、オフィシャルドキュメントは用語群、特に「コンポーネント」、を放埒に使い、「コンポーネント」の出現ごとに何を意味しているのか、私には特定できないようになっていますが。

Objector 61B
いずれにせよ、リスナーだけが、私がUNOコンポーネントとして欲しいものでしょう?

Hypothesizer 7
あなたが何を欲するかを私は知りませんが、1つの典型的なケースは、Java UNOコンポーネントが、あなたのマクロ言語では実装できない機能を実装するというものです。

Objector 61B
何でそれは実装できないの?

Hypothesizer 7
Basicは、とても貧弱なので、多くの種類のものを実装できません(例えば、ネットワーク操作、マルチスレッド処理、等)し、XML操作やJSON操作のようなものは、あえてやられれば実装できますが、とても面倒なことになるでしょう、それに相応する便利なライブラリがありませんから。

そして、1つの有用なオプションは、GUIコンポーネント群をJava Swingで作成するというものです。

Objector 61B
GUIコンポーネントなら、Basicで作成できるけど。

Hypothesizer 7
Basicダイアログボックスのことでしょうか?

Objector 61B
そうよ。

Hypothesizer 7
それらは貧弱だと、申し上げなければなりません。

Objector 61B
富裕だとは私は言わないけどね。

Objector 61A
Python GUIを使えないのかね、tkinterのような?

Hypothesizer 7
使えないと推測します、Linuxでは。

Objector 61A
じゃあ、Windowsではオーケーなのか?

Hypothesizer 7
多分。

Objector 61A
JavaFXは使えないのか?

Hypothesizer 7
駄目です、Linuxでは。

Objector 61A
なぜ、Linuxではだめなのか?

Hypothesizer 7
なぜなら、JavaFX、やtkinter、のイベントループがLibreOfficeまたはApache OpenOffice自体のイベントループに干渉するからです。

Objector 61A
それは、Swingでは起こらないと?

Hypothesizer 7
私が知る限り、Swingは、LibreOffice JVM内で問題なく動作します。


2: 準備


Hypothesizer 7
しばしば、あなたのUNOコンポーネントは、あなたのUNOインターフェイス群のいくつかを実装します。

Objector 61B
私の「UNOインターフェイス群」? . . . それどこにあるの?

Hypothesizer 7
ああ、既存のブロードキャスターへのリスナーを欲しいだけという方は、ご自分のUNOインターフェイス群を全く持ってないということになるでしょうが、それは問題ありません。

Objector 61B
「問題ありません」とい言われても、のけ者にされた気分だわ . . .

Hypothesizer 7
あなたには全然必要ありません。

Objector 61B
欲しいのよ!

Hypothesizer 7
えーと、もしも、お一つご所望であれば、前記事にしたがって、お一つ作成し、そのJavaマッピングイメージを生成することができます。

Objector 61B
. . . えーと、やっぱりいらないわ。


3: コード


Hypothesizer 7
以下は、UNOコンポーネントを作成する典型的なコードです。

@Java ソースコード
package theBiasPlanet.unoUtilitiesTests.localUnoObjectsTest1;

import com.sun.star.lang.XUnoTunnel;
import com.sun.star.lib.uno.helper.WeakBase;

public class TestUnoComponent extends WeakBase implements XUnoTunnel {
	public TestUnoComponent () {
	}
	
	@Override
	public long getSomething (byte [] a_datumIdentification) {
		return 0;
	}
}

Objector 61B
. . . 「WeakBase」?

Hypothesizer 7
'com.sun.star.lib.uno.helper.WeakBase'は、ヘルパークラスで、いくつかのUNOインターフェイス('com.sun.star.uno.XWeak'および'com.sun.star.lang.XTypeProvider'、具体的に言えば)を既に実装済みのものであり、それを使用すべきでないとする何らの理由も私は見出しません、しかし、もしも、C++またはJavaのブロードキャスターへのリスナーを欲しいだけというのであれば、あなたは特にそれを必要としないでしょう。

Objector 61B
. . . 「それを必要としない」と言われても、それじゃあ私はどうすればよいの?

Hypothesizer 7
あなたのUNOコンポーネントは、当該リスナーUNOインターフェイス(複数でもよい)をただ実装すればよいのです。

Objector 61A
'WeakBase'に実装されてるそれらのインターフェイスは何なんだ?

Hypothesizer 7
'XWeak'は、そのインスタンスをウィークにポインティングできるようにするためのものです。

'XTypeProvider'は、それを、マクロ言語からアクセス可能であるようにするためのものです。

Objector 61A
「ウィークにポインティング」?

Hypothesizer 7
ある以前の記事にて詳述されているとおり、'ウィークにポインティング'されるというのは、インスタンスの利用カウントが、そのインスタンスが実際にアクセスされる直前にインクリメントされ、そのアクセスが完了した直後にディクリメントされるということです。

Objector 61B
全然分からないけど . . .

Hypothesizer 7
もしも、C++ UNOプログラミングを全然やられないのであれば、実際には、どうでもよいことでしょう。

いずれにせよ、'XWeak'を実装することには何の害もないでしょう、もしも、ウィークポインティングを全く使用なさらないとしても。


4: UNOサービスを作成することについての注意


Hypothesizer 7
UNOサービスは、荒く言って、UNOサービス群マネージャーに登録されたUNOコンポーネントのことであり、UNOサービス群マネージャーは、UNOオブジェクトのファクトリーです。

Objector 61A
ということは、上のようなUNOコンポーネントを作ればよいということだろ?

Hypothesizer 7
当該UNOコンポーネントは上記のように作成することができますが、それはいくつか特定のUNOインターフェイス群を実装する必要があります。

Objector 61A
どのインターフェイス群だ?

Hypothesizer 7
それは、UNOサービスを作成することについての将来の記事にて詳述されますが、ここで私が申し上げたいのは、上記は、UNOコンポーネントを作成すること一般の方法ですが、UNOサービスとして登録されるUNOコンポーネントには、いくつかの追加要件があるということです。


5: 使用法


Hypothesizer 7
当該UNOコンポーネントのクラスファイルは、勿論、クラスパスに入れられなければなりません、何らかの方法で。

Objector 61A
「何らかの方法で」 . . .

Hypothesizer 7
もしも、あなたのプログラムが独立プログラム(LibreOfficeまたはApache OpenOfficeのJVMプログラムでないことを意味します)であれば、それを、普通のJavaプログラムにおけるのと同様に、通常通り、入れればよいのです。

もしもそうでなければ、2の方法があります: 1) 当該パスを、Linuxでは'%the LibreOffice or Apache OpenOffice product directory%/program/fundamentalrc'、Windowsでは'%the LibreOffice or Apache OpenOffice product directory%\program\fundamental.ini'内の'URE_MORE_JAVA_TYPES'項目に追加する 2) 当該クラスファイルを、拡張機能JarファイルまたはマクロJarファイルに含める(注意として、それはその拡張機能またはマクロからのみ可視)。

Objector 61A
反対に、当該クラスを'URE_MORE_JAVA_TYPES'項目の既存パスに入れてもいいんだろう?

Hypothesizer 7
えーと、特にお勧めはしませんが、それが不可能だとは申しません。

Objector 61A
ふーむ . . .

Hypothesizer 7
いずれにせよ、UNOコンポーネントのインスタンスをそのJava環境にて生成するには、そのクラスのコンストラクタを呼べばよいだけです。

Objector 61B
へえ?そのインスタンスはどうやって使えるの?

Hypothesizer 7
それは、そのJava環境では、普通のJavaオブジェクトとして使えます。

Objector 61B
はあ?「UnoRuntime.queryInterface」とかやらないといけないんじゃないの?

Hypothesizer 7
いいえ、その必要はありません: そのUNOオブジェクトはその環境内に生存しているので、UNOプロキシはそこでは使われません。

Objector 61B
ふーん . . .

Hypothesizer 7
もしも、そのUNOオブジェクトを別の環境から操作されるのであれば、勿論、それをリモートUNOオブジェクトとして操作する必要があります。

Objector 61B
別のプログラム言語からってこと?

Hypothesizer 7
同一プログラミング言語からもです、もしも、別環境からであれば。

Objector 61B
はあ?「同一プログラミング言語」だけど、「別環境」?

Hypothesizer 7
コンソールJavaクライアントは別環境です、もしも、当該UNOオブジェクトがLibreOffice JVM内に生存していれば。 . . . 注意として、私が「別のプログラミング言語環境」と言うとき、私が意味しているのは、'別の(プログラミング言語環境)'であって、'(別のプログラミング言語)環境ではありません。

Objector 61B
そのコンソールJavaクライアントは、当該UNOコンポーネントクラスをクラスパスに入れとかないといけないんでしょう、もちろん?

Hypothesizer 7
勿論、違います。そのコンソールクライアントは、対応するUNOインターフェイス群を使いますが、そのUNOコンポーネントは使いません。

Objector 61B
はあ?変なの!

Hypothesizer 7
変では全然ありません: それが、UNOの仕組みです。

Objector 61B
そのUNOコンポーネントは、どうすれば別の環境からインスタンス化できるの?

Hypothesizer 7
通常、UNOサービスを作成されることになりますが、それは、将来の記事にて取り扱われます。


参考資料


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