// Client.java import org.omg.CosNaming.*; import java.io.*; public class Client { public static void main(String[] args) { try { // ORB の初期化 org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // ネーミングサービスのルートコンテキストのリファレンスを取得 org.omg.CORBA.Object obj = orb.resolve_initial_references("NameService"); // ルートコンテキストのリファレンスを NamingContextExt 型に変換 NamingContextExt rootCtx = NamingContextExtHelper.narrow(obj); Bank.Account account; System.out.println("------------------- Case 1 -------------------"); // Bank のネーミングコンテキストを取得してから Account オブジェクトの // リファレンスを取得する方法 // Bank のネーミングコンテキストを取得する obj = rootCtx.resolve(rootCtx.to_name("Bank")); NamingContextExt bankCtx = NamingContextExtHelper.narrow(obj); // JacORB で登録した Account オブジェクトを取得する // NamingContextExt の to_nmae() メソッドを利用して文字列から名前を作成している obj = bankCtx.resolve(bankCtx.to_name("OGIS-RI.Account")); account = Bank.AccountHelper.narrow(obj); // Account オブジェクトの情報を表示する infoAccount(account); // VisiBrokerORB で登録した Account オブジェクトを取得する // NamingContextExt の resolve_str() メソッドを利用して // 文字列から直接リファレンスを取得している obj = bankCtx.resolve_str("Nagata.Account"); account = Bank.AccountHelper.narrow(obj); // Account オブジェクトの情報を表示する infoAccount(account); System.out.println(""); System.out.println("------------------- Case 2 -------------------"); // Account オブジェクトの名前階層を直接指定して取得する方法 // 取得したいオブジェクトの名前を作成する NameComponent[] name = { new NameComponent("Bank", "") ,new NameComponent("OGIS-RI", "Account") }; // JacORB で登録した Account オブジェクトを取得する obj = rootCtx.resolve(name); account = Bank.AccountHelper.narrow(obj); // Account オブジェクトの情報を表示する infoAccount(account); // VisiBrokerORB で登録した Account オブジェクトを取得する // NamingContextExt の to_name メソッドを利用して文字列から名前を作成している obj = rootCtx.resolve(rootCtx.to_name("Bank/Nagata.Account")); account = Bank.AccountHelper.narrow(obj); // Account オブジェクトの情報を表示する infoAccount(account); System.out.println(""); System.out.println("------------------- Case 3 -------------------"); // 名前を指定せずに名前階層を検索して Account オブジェクトを取得する方法 listAccount(rootCtx); } catch(Exception e) { e.printStackTrace(); } } // 指定された Account オブジェクトの情報を表示するメソッド private static void infoAccount(Bank.Account account){ System.out.println ("The balance in " + account.getName() + "'s account is " + account.getBalance() + " yen."); } // 指定されたネーミングコンテキスト以下の名前階層を検索し、 // Account オブジェクトの情報を表示するメソッド private static void listAccount(NamingContext ctx){ try{ int how_many = 0; // list メソッドに渡す out モードの Holder クラスを作成 BindingListHolder listHdr = new BindingListHolder(); BindingIteratorHolder iteratorHdr = new BindingIteratorHolder(); // ctx ネーミングコンテキストに登録されているオブジェクトを取得する ctx.list(how_many, listHdr, iteratorHdr); // list メソッドの結果を Holder クラスから取り出す BindingIterator iterator = iteratorHdr.value; // iterator メソッドに渡す out モードの Holder クラスを作成 BindingHolder nodeHdr = new BindingHolder(); // ctx ネーミングコンテクスト直下に登録されている // すべてのオブジェクトに対して以下の処理を繰り返す while( iterator.next_one(nodeHdr) == true ){ // next_one メソッドの結果を Holder クラスから取り出す Binding node = nodeHdr.value; // 登録タイプがネーミングコンテキストの場合 if( node.binding_type == BindingType.ncontext ){ try{ // 登録されているネーミングコンテキストを取得し、 // そのネーミングコンテキスト以下に Account オブジェクトが // 存在するかどうか検索する org.omg.CORBA.Object obj = ctx.resolve(node.binding_name); NamingContext subCtx = NamingContextHelper.narrow(obj); listAccount(subCtx); }catch(Exception e){ e.printStackTrace(); } } // 登録タイプが CORBA オブジェクトの場合 if( node.binding_type == BindingType.nobject ){ try{ // 登録されている CORBA オブジェクトのリファレンスを取得する // 登録されている CORBA オブジェクトが Account オブジェクトで // ない場合は、CORBA.BAD_PARAM 例外が発生する org.omg.CORBA.Object obj = ctx.resolve(node.binding_name); Bank.Account account = Bank.AccountHelper.narrow(obj); // Account オブジェクトの情報を表示する infoAccount(account); }catch(org.omg.CORBA.BAD_PARAM exp){ // Account オブジェクトでない場合は何もしない }catch(Exception e){ e.printStackTrace(); } } } }catch(Exception e){ e.printStackTrace(); } } }