前の関連記事: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が載っています。
0 件のコメント:
コメントを投稿