前の関連記事:LibreOffice(14)デベロッパーガイド2 サービスマネジャとファクトリー
サービスマネジャからUNOオブジェクトを得る方法がわかったので今度はサービスマネジャを得る方法です。
サービスマネジャはルートオブジェクトから得られる
3.3.2 サービス・マネージャーとコンポーネント・コンテキスト
Service Manager and Component Context
ルートオブジェクトはすべてのオブジェクトに含まれているものです。
オブジェクトが生成されるときにルートオブジェクトがそのオブジェクトに引き継がれます。
インターフェイスがすべてXInterfaceを継承しているのとちょっと似ていますね。
でもインターフェイスと違って明示的に引き継がれなくても暗黙に引き継がれていきます。
サービスマネジャはこのルートオブジェクトから得られます。
StarOffice6.0とOpenOffice.org1.0までとそれ以降ではルートオブジェクトを指すものが変わりました。
LibreOffice(13)デベロッパーガイド1 ほとんどの例はJavaでサービスにold-style serviceとnew-style serviceがあったのと同様にルートオブジェクトも互換性の維持のために古い概念と新しい概念の両方が使えるようになっています。
ということでルートオブジェクトの古い概念と新しい概念の両方を理解しないといけません。
古い概念:ルートオブジェクト=サービスマネジャ
古い概念ではルートオブジェクトはサービスマネジャそのものでした。
ルートオブジェクトがサービスマネジャなのではLibreOffice(14)デベロッパーガイド2 サービスマネジャとは?ででてきたcom.sun.star.lang.XMultiServiceFactoryを使う方法です。
UNOオブジェクトにはルートオブジェクトがあってそれがサービスマネジャなのですから、サービスマネジャはすべてのUNOオブジェクトから得られるということになります。
しかしこのXMultiServiceFactoryはいまは使わないように推奨されています。
新しい概念:ルートオブジェクトにコンテクストを導入=コンポーネントコンテクスト
コンテクスト、っていうのは適当な日本語がない言葉なんですよね。
もう30年近く前に「contextに相当する日本語はない」っていう授業を塾で受けた記憶があるのでコンピュータ用語でもないはずです。
相当する言葉がないということはそういう概念もないということなのでわかりにくいですね。
こういう日本語にない言葉はロングマン英英辞典で調べろ、と習いました。
con‧text [uncountable and countable]状態を理解する判断材料、といったところでしょうか。
1 the situation, events, or information that are related to something and that help you to understand it
2 the words that come just before and after a word or sentence and that help you understand its meaning:
context - Definition from Longman English Dictionary Online
現在のUNOではルートオブジェクトがコンポーネントコンテクストに変更になりました。
UNOコンポーネントのコンテクストなのでコンポーネントコンテクストです。
コンポーネントコンテクストはUNOコンポーネントがコンポーネントの状態を理解する判断材料が含まれています。
コンポーネントコンテクストを順に伝えていくことにより各UNOコンポーネントは協調して仕事ができます。
このことをコンテクストの伝播(Context Propagation)といいます。
サービスマネジャはコンポーネントコンテクストから生成されるものになった
ルートオブジェクトがサービスマネジャからコンポーネントコンテクストに替わり、サービスマネジャはコンポーネントテクストから生成されるものということになりました。
サービスマネジャが1つのコンポーネントコンテクストから生成されるのは1回きりです。
同じコンポーネントコンテクストからは複数のサービスマネジャが生成されることはありません。
(Component Context コンポーネント・コンテキストより引用)
コンポーネントコンテクストとサービスマネジャの関係のUML図です。
コンポーネントコンテクストはcom.sun.star.uno.XComponentContextインターフェイスを備えています。
コンポーネントコンテクスト.getServiceManager()
これでコンポーネントコンテクストからサービスマネジャが得られます。
コンポーネントコンテクストから生成されたサービスマネジャがUNOオブジェクトを生成するときに使うインターフェイスはcom.sun.star.lang.XMultiComponentFactoryです。
ということで前回みたように以下でサービス名からUNOオブジェクトが得られます。
コンポーネントコンテクスト.getServiceManager().createInstanceWithContext(サービス名, コンポーネントコンテクスト)
コンポーネントコンテクスト.getServiceManager().createInstanceWithArgumentsAndContext(サービス名, 引数, コンポーネントコンテクスト)
今のところはComponent Contextから生成されるsingletonはService Managerだけ
(2014.4.29追記。どこをどう読み間違えたのかシングルトンがサービスマネジャだけというのは間違いでした。OpenOffice.org 1.0.2までの話でそれ以降は複数あります(ComponentContext API ComponentContext API)。LibreOffice(46)インターフェイス名からその属性とメソッド名一覧を取得ではcom.sun.star.reflection.TypeDescriptionManagerをシングルトンで使いました。)
<<singleton>>(シングルトン)というのは「1回しか生成されないインスタンス」という意味です。(Singletons Singletons)
上のUML図でother SingletonsはComponent Contextと集約(初歩のUML:第2回)でつながっています。
ということはコンポーネントコンテクストからはサービスマネジャ以外にも生成するシングルトンが複数あるということです、、、
XMultiServiceFactoryを使うとコンポーネントコンテクストの伝播が破壊される
サービスマネジャがコンポーネントコンテクストのシングルトンなのでコンポーネントコンテクストとサービスマネジャは1対1に対応しています。
しかしサービスマネジャからルートオブジェクトであるコンポートコンテクストは生成できません。
ところが古い概念ではルートオブジェクト=サービスマネジャになっているのでXMultiServiceFactoryを使うときにサービスマネジャがデフォルト値でルートオブジェクト(つまりコンポーネントコンテクスト)を上書きしてしまいます。
そのためルートオブジェクトのコンポーネントコンテクストの伝播が破壊されることになってしまいます。
ということでXMultiServiceFactoryは使わないように推奨されています。
参考にしたサイト
Apache OpenOffice Developer's Guide - Apache OpenOffice Wiki
PDF版の表紙にOpenOffice.org 3.1 Developer's Guideと書いてあります。
Developer's Guide
OpenOffice Developer's Guideの日本語版。OpenOffice.org 2.0より前のもののようです。
LibreOffice: Namespace List
LibreOffice 4.2 SDK APIの入り口com.sun.star。このブログではAPIリファレンスといいます。
context - Definition from Longman English Dictionary Online
ロングマン英英辞典のcontextの解説。
【改訂版】初歩のUML:第2回 クラス図の詳細化とその目的 - ITmedia エンタープライズ
UML図の集約(aggregation)の解説。
0 件のコメント:
コメントを投稿