LibreOffice(67)Writing UNO componentsのThumbs Exampleその3

2015-02-15

旧ブログ

t f B! P L

前の関連記事:LibreOffice(66)Writing UNO componentsのThumbs Exampleその2


今度はorg.openoffice.test.ImageShrinkサービス、XimageShrinkFilterインターフェイス、XImageShrinkインターフェイスの実装であるImageShrink.javaをビルドして、それらを拡張機能ファイルにして拡張機能マネージャでLibreOfficeに登録できるようにします。

ImageShrink.javaをビルドしてJavaコンポーネントファイルImageShrink.uno.jarを生成する


ImageShrink.javaは/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/testにあります。 Implementing Your Own Interfacesに解説があります。

(この解説ページにでてくる最初の「// XImageShrink implementation」は「// XFilter implementation」の誤植のようです。)

(com.sun.star.document.XFilterはidlファイルでインクルードしておけば実装ではimportしなくても使える?)
make -C org/openoffice/comp/test   
make[1]: ディレクトリ `/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/test' に入ります
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/org/openoffice/comp/test
"/usr/bin/javac"  -classpath "/opt/libreoffice4.3/ure-link/share/java/juh.jar:/opt/libreoffice4.3/ure-link/share/java/jurt.jar:/opt/libreoffice4.3/ure-link/share/java/ridl.jar:/opt/libreoffice4.3/ure-link/share/java/unoloader.jar:/opt/libreoffice4.3/sdk/../program/classes/unoil.jar::/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample" -d /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample ImageShrink.java
rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.jar
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample
"/usr/bin/jar" cvfm /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.jar /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.Manifest -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/comp/test/ImageShrink.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrink.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrinkFilter.class -C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/ImageShrink.class
27行目でImageShrink.javaをコンパイルしています。
"/usr/bin/javac"  
-classpath "
/opt/libreoffice4.3/ure-link/share/java/juh.jar:
/opt/libreoffice4.3/ure-link/share/java/jurt.jar:
/opt/libreoffice4.3/ure-link/share/java/ridl.jar:
/opt/libreoffice4.3/ure-link/share/java/unoloader.jar:
/opt/libreoffice4.3/sdk/../program/classes/unoil.jar::
/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample" 
-d /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample
ImageShrink.java
LibreOffice(22)FirstStepsのMakefileで使うJDKのコマンドのFirstStepsの例と違って各IDLタイプのクラスがある/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExampleへのクラスパスは必須になります。

今度は30行目でImageShrink.uno.jarを生成します。
/usr/bin/jar" cvfm 
/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.jar
/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink.uno.Manifest 
-C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/comp/test/ImageShrink.class 
-C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrink.class 
-C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/XImageShrinkFilter.class 
-C /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample org/openoffice/test/ImageShrink.class 
ImageShrink.javaをコンパイルしたImageShrink.classに加えてjavamakerで作成したidlタイプのclassファイル、XImageShrink.class、XImageShrinkFilter.class、ImageShrink.classも取り込んでいます。

ImageShrink.uno.ManifestはLibreOffice(22)FirstStepsのMakefileで使うJDKのコマンドでのFirstUnoContact.mfと同様に/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/test/Makefileの中のルールで作成されています。
UNO-Type-Path: ImageShrink.uno.jar
RegistrationClassName: org.openoffice.comp.test.ImageShrink
UNO-Type-PathについてはPossible Structures for Java Componentsに解説がありました。

Java UNO runtimeのUnoClassLoaderに新たなUNOタイプ(=UNO IDLタイプ)の場所を教えるためにUNO-Type-PathにUNOタイプがあるjarファイルを指定すればよいようです。

Makefileではファイル名を指定していますが、解説では自身のファイルは「<>」で指定できると書いてありますね。

でもPassive Component Registrationには拡張機能マネージャに登録するためには「<>」使うなと書いてあります。

そのうち確認してみます。

このマニフェストファイルのRegistrationClassNameの値に設定されているorg.openoffice.comp.test.ImageShrinkにある__getServiceFactory() メソッドでサービスマネージャはUNOオブジェクトをインスタンス化します。

ということでRegistrationClassNameの値には、jarファイルに複数含まれているclassファイルのうち__getServiceFactory() メソッドが含まれているクラスファイル名を設定します。(Component Architecture

idlファイルで定義したImageShrinkサービスがorg.openoffice.test.ImageShrinkでその実装ファイルがorg.openoffice.comp.test.ImageShrinkで、そこに__getServiceFactory() メソッドが含まれているのでRegistrationClassNameの値にorg.openoffice.comp.test.ImageShrinkを設定して、サービスマネージャがインスタンス化するのはidlファイルで定義されたorg.openoffice.test.ImageShrinkということになる?(ちょっと今のところ私には確証がありません。)

Component ArchitectureにjarファイルのUNOコンポーネントのイメージ図が載っています。

Simple Component in Javaには__writeRegistryServiceInfo()メソッドがサービスマネージャに実装がどこにあるかを教えて、その実装にある__getServiceFactory()メソッドを使ってサービスマネージャがサービスの実装をインスタンス化すると書いてあります。

しかしImageShrink.javaの中ではOOo3.4以降はPassive Component Registrationが導入されたため__writeRegistryServiceInfo()メソッドが不要になったとのことでこのメソッドはコメントアウトされています。

とりあえずこれでImageShrink.uno.jarファイルが/home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExampleにできあがりました。

Possible Structures for Java Componentsを読む限り、このImageShrink.uno.jarファイルが「コンポーネントファイル」になるようです。

ImageShrink.uno.jarは実装されているサービスがorg.openoffice.test.ImageShrinkひとつでそれがImageShrinkクラスで実装されているのでPossible Structures for Java Componentsに書いてあるOne Implementation per Component Fileのa flat structureタイプに該当すると思います。

ImageShrink.uno.jarから拡張機能ファイルImageShrink.oxtを作成する


今度は作成したJavaコンポーネントファイルをLibreOfficeで使えるようにするための作業をします。

 Running and Debugging Java Componentsによると以前はregcompというツールを使っていましたがOpenOffice.org 2.0以降はunopkgツールに変更になったそうです。 

Thumbs ExampleのMakefileでもunopkgを使っており、unopkgの解説はExtensions(拡張機能)になります。

拡張機能ファイルの拡張子はoxtです。

以前は.uno.pkgとか.zipといった拡張子が使われていたそうで、OpenOffice4.0からはこれらのファイルは使えなくなりました。(File Format

OpenOffice.org 3.4以降はPassive Component Registrationが導入されたためoxtファイルに含めるファイルも変更になっています。
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink/META-INF
rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin
cp /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/ComponentThumbsExample/ImageShrink.uno.rdb /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample
"/usr/bin/zip" /home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt ImageShrink.components
  adding: ImageShrink.components (deflated 42%)
cd /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample && "/usr/bin/zip" -u ../../bin/ImageShrink.oxt ImageShrink.uno.rdb ImageShrink.uno.jar
  adding: ImageShrink.uno.rdb (deflated 90%)
  adding: ImageShrink.uno.jar (deflated 17%)
cd /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink && "/usr/bin/zip" -u ../../../bin/ImageShrink.oxt META-INF/manifest.xml
  adding: META-INF/manifest.xml (deflated 53%)
rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/class/ImageShrink.uno.rdb
36行目でまずoxtファイルにフォルダごと含めるmanifest.xmlを入れるためのフォルダMETA-INFを~/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExample/ImageShrink/を作成しています。

既存のImageShrink.oxtがあれば37行目で削除しています。

15行目で作成したImageShrink.uno.rdbを39行目で~/libreoffice4.3_sdk/LINUXexample.out/class/ComponentThumbsExampleコピーしています。
(oxtファイルが完成したあと47行目でこの使い終わったファイルは削除していますね。単に重複したファイルを残すのを避けるため?)

40行目からoxtファイルの作成に取り掛かっています。

oxtファイルは必要なファイルを単にzipでまとめたものです。

まずは予め/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/testに用意されているImageShrink.componentsファイルをzip圧縮してImageShrink.oxtにしています。
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://openoffice.org/2010/uno-components">
  <component loader="com.sun.star.loader.Java2" uri="ImageShrink.uno.jar">
    <implementation name="org.openoffice.comp.test.ImageShrink">
      <service name="org.openoffice.test.ImageShrink"/>
    </implementation>
  </component>
</components>
ImageShrink.componentsファイルはこのようなxmlファイルです。

(UNOコンポーネントファイル(ここでは=Javaコンポーネントファイル)と区別するためにこの拡張子がcomponentのファイルは.componentファイルといいます。)

.component Filesが.componentsファイルの解説と思ったら、これはservices.rdbを.componentファイルに変換するスクリプトの解説で、.componentsファイルの解説はAn XML Formatでした。

component loaderはJavaコンポーネントはcom.sun.star.loader.Java2になっています。

C++コンポーネントではcom.sun.star.loader.SharedLibraryと第5章のAdvanced UNOImplementation Loaderに書いてあります。(PythonはPython Loader - Apache OpenOffice Wiki)

component loader以外の要素は自明ですね。

42行目でImageShrink.oxtにさらにImageShrink.uno.rdbとImageShrink.uno.jarを追加しています。

45行目でmanifest.xmlを追加してImageShrink.oxtの完成です。

このmanifest.xmlは/opt/libreoffice4.3/sdk/examples/DevelopersGuide/Components/Thumbs/org/openoffice/comp/test/Makefileのルールで生成されています。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
  <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-typelibrary;type=RDB"
                       manifest:full-path="ImageShrink.uno.rdb"/>
  <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-components"
                       manifest:full-path="ImageShrink.components"/>
</manifest:manifest>
このmanifest.xmlはoxtファイルに含まれるファイルの目録になります。

含まれるファイルの形式による書き方の例はFile Formatにあります。
ImageShrink.oxt
├── ImageShrink.components
├── ImageShrink.uno.jar
├── ImageShrink.uno.rdb
└── META-INF
    └── manifest.xml
ImageShrink.oxtにはImageShrink.components、ImageShrink.uno.jar、ImageShrink.uno.rdbの3つのファイルが入っているのにmanifest.xmlにはImageShrink.componentsとImageShrink.uno.rdbの2つしか載っていません。

これはPassively Registered UNO Componentsの項目にあるようにPassive Component RegistrationしてあるUNOコンポーネントファイルは、UNOコンポーネントファイルを登録してある.componentsファイルをmanifest.xmlファイルに載せていればよいからです。

拡張機能マネージャーでoxtファイルをLibreOfficeに登録する


できあがったImageShrink.oxtファイルは拡張機能としてLibreOfficeの拡張機能マネージャに登録できます。

試しにImageShrink.oxtファイルをWindowsにもってきてそこのLbireOfficeに登録してみます。

ちなみにこのTumbs Exampleには動作するコードは何も入っていないので単に登録できるかを確認できるだけです。

LibreOfficeのいずれかのアプリを起動します。


ツール→拡張機能マネージャー。


「追加」ボタンをクリックしてImageShrink.oxtファイルを選択します。


とりあえず「このユーザーのみ」にしておきます。


ImageShrink.oxtが拡張機能マネージャに登録されましたね。

unopkgツールでoxtファイルをLibreOfficeの拡張機能マネージャに登録する


LibreOffice(61)linuxBeanでJavaの例をmakeでsetsdkenv_unixを実行したときにAutomatic deployment of UNO components (YES/NO) [YES]: でYESを選択したときはMakefileでoxtファイルを拡張機能マネージャに登録してしまいます。
rm -f /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc/devguide_ImageShrink_register_component.flag
mkdir -p /home/pq/libreoffice4.3_sdk/LINUXexample.out/misc
"/opt/libreoffice4.3/sdk/../program/unopkg" add -f "/home/pq/libreoffice4.3_sdk/LINUXexample.out/bin/ImageShrink.oxt"
まずdevguide_ImageShrink_register_component.flagファイルを削除しています。

このファイルはこの拡張マネージャに登録するルールのターゲットファイルになっているもので、このルールの最後でまた生成されます。

50行目の/opt/libreoffice4.3/program/unopkg add -f でImageShrink.oxtをLibreOfficeの拡張マネージャに登録しています。

unopkgunopkgに使い方の解説があります。

unopkgを実行するときはLibreOfficeを終了した状態が望ましいようです。


Thumbs Exampleをmakeしたあと拡張マネージャをみてみるとちゃんとImageShrink.oxtが登録されていました。

参考にしたサイト


Writing UNO Components - Apache OpenOffice Wiki
デベロッパーズガイドの第3章。

Passive Component Registration - Apache OpenOffice Wiki
OOo3.4以降はこの仕組みで__writeRegistryServiceInfo()メソッドが不要になりました。

LibreOffice 4.3 API Documentation
SDKにかかわるツールや例などがあります。

次の関連記事:LibreOffice(68)Writing UNO componentsのThumbs Exampleその4

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ