前の関連記事: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にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
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(); } } |
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に変更」をクリックすると
1 |
package firstconnection; |
実行→プロジェクト(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 件のコメント:
コメントを投稿