*外野から攻めてみる [#f9c71262] JXTAについて調べているときに、[[IBMの記事>http://www-6.ibm.com/jp/developerworks/java/040514/j_j-jxta2.html]]を見つけました。JXTAの概念、JXTA2に採用された新しいテクノロジーなどが、分かりやすく紹介されています。 この記事の中で、サイレントスタートのための仕組みが解説されています。JXTAのプログラムを起動するときには、初回にかなり沢山の設定ファイルをユーザーに入力してもらう必要がありました。‥‥が、エンドユーザーに提供するアプリケーションでそんなことできるわけありません。とりあえず起動してもなんとなく動いてる状態が理想なのです。 複雑な設定処理を回避するために、この記事では初期設定ファイルを自動的に作成するサイレントスタートプログラムのサンプルを掲載しています。記事によると、[[JXTA SHELL>駅長/JXTA勉強会/JXTA SHELL]]を起動するためのスターターのようです。 ‥‥しかしこれ、最新のJXTA APIではさっぱり動きません(ーー;。初期設定関係のAPIがごっそり変更になっていまして(記事でもそのようなことが書いています)、古いコードのこの記事は全然参考にならないのですよねぇ〜。 ‥‥しかしこれ、最新のJXTA APIではさっぱり動きません(ーー;。初期設定関係のAPIがごっそり変更になっていまして(記事でもそのようなことが書いています)、古いコードのこの記事は全然参考にならないのですよねぇ~。 ということで、APIのソースコードをデバッグでステップ実行しながら追いかけた結果、とりあえず今はこうすればいい‥‥らしい、というものをでっち上げました。以下、書き換えたプログラムコードです。 *初期設定の自動生成サンプル [#d4d88b9c] 001: /* 002: * ShellStarter.java 003: * 004: * Copyright 2004 どっとステーション駅長 005: */ 006: 007: package com.ibm.devworks.jxta2.shell; 008: 009: import java.io.File; 010: import java.net.URI; 011: import java.net.URISyntaxException; 012: 013: import net.jxta.exception.ConfiguratorException; 014: import net.jxta.ext.config.Configurator; 015: import net.jxta.ext.config.Profile; 016: import net.jxta.impl.peergroup.Boot; 017: 018: /** 019: * 自動構成機能を付加したシェルスターター。 020: * 021: * @author どっとステーション駅長 022: * @see <a 023: * href="http://www-6.ibm.com/jp/developerworks/java/040514/j_j-jxta2.html">IBM 024: * DevloperWorks記事 </a> 025: * @see <a 026: * href="http://ssp.shillest.net/specwiki/pukiwiki.php?%B1%D8%C4%B9%2FJXTA%CA%D9%B6%AF%B2%F1">開発メモ 027: * </a> 028: */ 029: public class ShellStarter { 030: private static final String JXTA_HOME_PROP = "JXTA_HOME"; 031: private static final String TLS_PRINCIPAL_PROP = "net.jxta.tls.principal"; 032: private static final String TLS_PASSWORD_PROP = "net.jxta.tls.password"; 033: private static final String ADDR_SEP = ":"; 034: private static final String PORT_PRE = "97"; 035: private static final String PORT_POST_TCP = "1"; 036: private static final String PORT_POST_HTTP = "0"; 037: private static final String TCP_PRE = "tcp://"; 038: private static final String USER_NAME = "dwuser"; 039: private static final String USER_PASS = "dwuser12345"; 040: 041: 042: public ShellStarter() { 043: } 044: 045: /** 046: * JXTAの構成を自動作成します。 047: * 048: * @param pearName 049: * このpearの名前。 050: * @param tcpAddress 051: * @param tcpPort 052: * @param httpPort 053: * @param rdvNode 054: * @param isRdv 055: */ 056: public void configure(String pearName, String tcpAddress, int tcpPort, 057: int httpPort, String rdvNode, boolean isRdv) throws ConfiguratorException { 058: // 環境変数設定 059: String JXTA_HOME =".jxtashell_" +pearName +File.separator; 060: System.setProperty(JXTA_HOME_PROP, JXTA_HOME); // JXTA_HOME JXTA設定ファイルの保管場所 061: System.setProperty(TLS_PRINCIPAL_PROP, USER_NAME); // ユーザー名 062: System.setProperty(TLS_PASSWORD_PROP, USER_PASS); // パスワード 063: 064: // 設定が既に存在すれば何もせずに終了 065: File jxtaHome =new File(JXTA_HOME); 066: Configurator.setHome(jxtaHome); 067: System.out.println("JXTAHOME:" +jxtaHome); 068: System.out.println("JXTAHOME:isDirectory:" +jxtaHome.isDirectory()); 069: System.out.println("JXTAHOME:exists:" +jxtaHome.exists()); 070: if(jxtaHome.exists()) return; 071: 072: // JXTA設定オブジェクトの作成 073: Configurator conf; 074: if (isRdv){ 075: // ランデブーピアのデフォルト定義 076: conf = new Configurator(Profile.RENDEZVOUS); 077: } 078: else{ 079: // エッジピアのデフォルト定義 080: conf = new Configurator(Profile.EDGE); 081: } 082: 083: // ピア名・ユーザー名・パスワードを設定 084: conf.setName(pearName); 085: conf.setDescription("ShellStarter-Sample"); 086: conf.setSecurity(USER_NAME, USER_PASS); 087: 088: // 初期ランデブーノードの登録 089: int rdvNodeNum = Integer.parseInt(rdvNode); 090: if (rdvNodeNum < 10) { 091: try { 092: URI u = new URI(TCP_PRE + tcpAddress + ADDR_SEP + PORT_PRE + rdvNode 093: + PORT_POST_TCP); 094: conf.addRendezVous(u); 095: } catch (URISyntaxException e) { 096: throw new ConfiguratorException(e); 097: } 098: } 099: 100: // TODO マルチキャストを無効にする 101: 102: // 設定の保管 103: conf.save(); 104: } 105: 106: public static void main(String[] args) throws Exception { 107: ShellStarter starter = new ShellStarter(); 108: boolean isRdv = false; 109: 110: // 引数解析 111: if ((args.length == 5) && (args[4].equalsIgnoreCase("rdv"))) 112: isRdv = true; 113: else if (args.length != 5) { 114: System.out 115: .println("Usage: ShellStarter <peer name> <ip address>" 116: +" <node number> <rdv node number> <rdv | edge>"); 117: System.exit(1); 118: } 119: 120: // JXTA構成処理を呼び出す 121: int tcpPort = Integer.parseInt(PORT_PRE + args[2] + PORT_POST_TCP); 122: int httpPort = Integer.parseInt(PORT_PRE + args[2] + PORT_POST_HTTP); 123: String pearName = args[0]; 124: String tcpAddress = args[1]; 125: String rdvNode = args[3]; 126: starter.configure(pearName, tcpAddress, tcpPort, httpPort, rdvNode, isRdv); 127: 128: // シェルの起動 129: Boot.main(args); 130: } 131: 132: } *初期化処理の概要 [#p75d00c1] えーと、オリジナルソースの影響をそこかしこに受けている初期化ルーチンです。本当はもうちょっとリファクタリングして、初期化プロセスだけを抜き出すべきなのですが、面倒なので今はこのままで(^^; 初期化処理は以下のパートに分かれます。 -JXTA設定ファイルを読み込むための環境変数を設定する。 -JXTA設定ファイルの場所をJXTA APIに通知する。 -JXTA設定ファイルの存在を確認し、存在しなければ以下の処理を行う。 --定義の基礎プロファイルから設定オブジェクトを作成する。 --足りない設定を定義する。 --設定オブジェクトよりJXTA設定ファイルをセーブする。 APIと環境変数両方使って、設定ファイルの場所を通知してやらないといけないのがなんとなく納得できないのですが(ーー;、とりあえずここまで修正することで、サイレントスタートが可能になりました。jxta.org.impl.*なオブジェクト(API以外の部分)も、シェル本体であるBootを除いて排除できています。 設定情報の作成で重要なのは、定義作成クラスであるnet.jxta.ext.config.Configuratorと、主要な定義を保持しているnet.jxta.ext.config.Profileです。Profileから基本的な定義を選択した上でConfiguratorオブジェクトを作成し、更に足りない情報を設定していく流れですね。 唯一元IBMの記事にある「マルチキャストの無効化」の方法が掴めませんでしたが、複数同時起動とその通信はなんとなく出来ているっぽいので調査は保留しました。誰か知っている人はこっそり教えてください(^^; *さて次は [#yc330e63] 「ハローワールドはしない」と言いましたが、そう言いつつやっぱりやります(^^;。ただ、JXTAらしく仮想ネットワークを経由したものになります。とゆーかやっぱりゴーストにしゃべらせたいよね♪さてさて‥‥。 *参考URL [#e94def03] http://www-6.ibm.com/jp/developerworks/java/040514/j_j-jxta2.html *コメント欄 [#x9d06e4b] #comment(below) *作業用 [#w4d09006] #newpage(駅長/) #norelated [[駅長/JXTA勉強会]]