前の関連記事: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 件のコメント:
コメントを投稿