LibreOffice(26)デベロッパーガイドのJavaの例:FirstConnection.java

2014-02-20

旧ブログ

t f B! P L

前の関連記事:LibreOffice(25)JavaのマクロをNetBeans7でデバッグする


NetBeans7で古いDeveloper's Guideの日本語訳の最初のJavaの例FirstConnection.javaをうまく動かせました。

getRemoteServiceManager()メソッドはどこにいった?


LibreOffice(24)NetBeans7でJavaのマクロを作成を参考にしてDeveloper's GuideのFirst Contactに載っているJavaの例FirstUnoContact.javaをNetBeans7でビルドしてみましたがやっぱり結果はLibreOffice(23)FirstStepsのMakefileの出力ログと同じでrunしてもやっぱりなにも出力されません。

そこでOpenOffice.org 2.0より前のDeveloper's Guideの日本語訳である2.3.4 最初のコネクションに載っているFirstConnection.javaをビルドしたところうまく動きました。

FirstConnection.javaは長いコードですけど何をしているのかがよくわかってFirstUnoContact.javaより勉強になります。

それにFirstConnection.javaにはFirstUnoContact.javaにはないgetRemoteServiceManager()メソッドがでてきます。

このgetRemoteServiceManager()メソッドはOpenOffice.org3.1のDeveloper's Guideを読んでいるとよくでてきます。

例えばExample: Adding a New Spreadsheetを読むとThe method getRemoteServiceManager() retrieves a connection. Refer to chapter First Steps for additional information. と書いてあります。

でもFirst StepsにでてくるFirstUnoContact.javaにはもうgetRemoteServiceManager()メソッドが定義されていません。

これは最初にDeveloper's Guideに読み進めていくのにかなりの障壁になりましたね。

いまは理解が進んだので大丈夫ですけど。

マニュアル自体はバージョン管理されていないのでわかりにくいですね。

NetBeans7でFirstConnection.javaをビルドする


FirstConnection.javaのソースは2.3.4 最初のコネクションにあります。

LibreOfficeとの通信方法はLibreOffice(4)PyCharmからLibreOfficeを動かす(オートメーション)のsocket接続と全く同じです。

23行目にでてくるポート番号はPythonのオートメーションと同じ2002にします。
import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.beans.XPropertySet;
public class FirstConnection extends java.lang.Object {
    private XComponentContext xRemoteContext = null;
    private XMultiComponentFactory xRemoteServiceManager = null;
    public static void main(String[] args) {
        FirstConnection firstConnection1 = new FirstConnection();
        try {
            firstConnection1.useConnection();
        }
        catch (java.lang.Exception e) {
            e.printStackTrace();
        }
        finally {
            System.exit(0);
        }
    }
    protected void useConnection() throws java.lang.Exception {
        try {
            xRemoteServiceManager = this.getRemoteServiceManager("uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager");
            String available = (null != xRemoteServiceManager ? "available" : "not available");
            System.out.println("remote ServiceManager is " + available);
            //
            // do something with the service manager...
            //
        }
        catch (com.sun.star.connection.NoConnectException e) {
                System.err.println("No process listening on the resource");
                e.printStackTrace();
                throw e;
        }
         catch (com.sun.star.lang.DisposedException e) { //works from Patch 1
            xRemoteContext = null;
            throw e;
        }          
    }
    protected XMultiComponentFactory getRemoteServiceManager(String unoUrl) throws java.lang.Exception {
        if (xRemoteContext == null) {
            // First step: create local component context, get local servicemanager and ask it to create a UnoUrlResolver object with an XUnoUrlResolver interface
            XComponentContext xLocalContext = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
            XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
            Object urlResolver  = xLocalServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", xLocalContext );
            // query XUnoUrlResolver interface from urlResolver object
            XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(XUnoUrlResolver.class, urlResolver);
            // Second step: use xUrlResolver interface to import the remote StarOffice.ServiceManager, retrieve its property DefaultContext and get the remote servicemanager
            Object initialObject = xUnoUrlResolver.resolve(unoUrl);
            XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, initialObject);
            Object context = xPropertySet.getPropertyValue("DefaultContext");            
            xRemoteContext = (XComponentContext)UnoRuntime.queryInterface(XComponentContext.class, context);
        }
        return xRemoteContext.getServiceManager();
    }
}
NetBeans7のメニューから、ファイル→新規プロジェクト。

1. プロジェクトを選択


カテゴリ Java、プロジェクト Javaアプリケーション、を選択して「次>」へ。

2. 名前と場所


プロジェクト名はFirstConnectionにします。

「メイン・クラスの作成」にチェックしておくとjavaファイルを作ってくれるので手間がちょっと省けます。


プロジェクトウィンドウからソース・パッケージのなかにあるFirstConnection.javaをダブルクリックして開きます。

なかみを上述のFirstConnection.javaのソースに置き換えます。


行頭にがついてimportするパッケージがないといわれているのでライブラリにjarファイルを追加します。

LibreOffice(24)NetBeans7でJavaのマクロを作成と全く同じようにしてunoil.jar、juh.jar、jurt.jar、ridl.jarの4つのファイルをライブラリに追加します。

まだ1行目の行頭にがでています。


プロジェクトウィンドウをみるとFirstConnection.javaは勝手に作成されたfirstconectionパッケージの下に入っているのでそれを書けということです。

黄色い電球マークをクリックしてでてくる「パッケージ宣言をfirstconnectionに変更」をクリックすると
package firstconnection;
と1行目に入れてくれてエラーが消えます。

実行→プロジェクト(FirstConnection)をビルド、をするとdistフォルダにFirstConnectin.jarが生成されます。

LibreOfficeと通信する


LibreOffice(4)PyCharmからLibreOfficeを動かす(オートメーション)で作ったLibreOffice_socket.batでLibreOfficeを通信可能な状態で起動します。

その状態でNetBeans7のメニューから、実行→プロジェクト(FirstConnection)を実行、をします。


NetBeans7の下にあるFirstConnection (run)に「remote ServiceManager is available」と表示されました。

これでFirstConnectin成功です。

参考にしたサイト


First Contact - Apache OpenOffice Wiki
Developer's Guideの最初のJavaの例FirstUnoContact.java。

2.3.4 最初のコネクション
古いDeveloper's Guideの日本語訳の最初のJavaの例FirstConnection.java。

Javaを使ったSDKのサンプル
ここにもFirstConnection.javaが載っています。

次の関連記事:LibreOffice(27)Java-UNO BootstrapはWindows7 64bitでは動かない?

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ