(1)IDL定義
module ODsample{ interface intf1{ attribute string value; }; interface intf2{ readonly attribute long value; void add( in long a ); void sub( in long b ); }; interface Factory { intf1 create1 (); intf2 create2 (); void destroy1( in intf1 obj ); void destroy2( in intf2 obj ); }; };
(2)ネーミングサービスの登録
OD_or_adm -c IDL:ODsample/Factory:1.0 -n ODsample::POAsample9
(3)アプリケーション構成概要図
(4)クライアントアプリケーション
import java.io.*; import org.omg.CORBA.*; import org.omg.CosNaming.*; import ODsample.*; public class Client { public static void main( String args[] ) { try { // ORBの生成と初期化 ORB Orb = ORB.init( args, null ); // ネーミングサービスのオブジェクトリファレンスの取得 org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "NameService" ); NamingContextExt Cos = NamingContextExtHelper.narrow( _tmpObj ); // ネーミングサービスのresolveメソッドを発行し、 // サーバアプリケーションのオブジェクトリファレンスの獲得 String NCid = new String( "ODsample::POAsample9" ); // オブジェクト名 String NCkind = new String( "" ); // オブジェクトタイプ NameComponent nc = new NameComponent( NCid, NCkind ); NameComponent NCo[] = { nc }; org.omg.CORBA.Object Obj = Cos.resolve( NCo ); int in = 0; // inパラメタ用変数 String line = null; // Factoryのオブジェクトリファレンス獲得 Factory target = FactoryHelper.narrow( Obj ); // Factoryでインタフェース1用オブジェクトリファレンスを作成する intf1 _intf1 = target.create1(); // サーバアプリケーションのメソッド呼出し System.out.println( "String = " + _intf1.value() ); System.out.print( "String => " ); line = new BufferedReader( new InputStreamReader( System.in ) ).readLine(); // サーバアプリケーションのメソッド呼出し _intf1.value( line ); System.out.println( "String = " + _intf1.value() ); // インスタンスの解放 target.destroy1( _intf1 ); // Factoryでインタフェース2用オブジェクトリファレンスを作成する intf2 _intf2 = target.create2(); try { // サーバアプリケーションのメソッド呼出し System.out.println( "value = " + _intf2.value() ); System.out.print( "add => " ); line = new BufferedReader( new InputStreamReader( System.in ) ).readLine(); in = Integer.parseInt( line ); // サーバアプリケーションのメソッド呼出し _intf2.add( in ); System.out.println( "value = " + _intf2.value() ); System.out.print( "sub => " ); line = new BufferedReader( new InputStreamReader( System.in ) ).readLine(); in = Integer.parseInt( line ); // サーバアプリケーションのメソッド呼出し _intf2.sub( in ); System.out.println( "value = " + _intf2.value() ); // インスタンスの解放 target.destroy2( _intf2 ); } catch ( java.lang.NumberFormatException e ){ System.exit( 255 ); } } catch( org.omg.CORBA.SystemException se ) { System.out.println( "ERROR : " + se.getClass().getName() + " : minor = 0x" + java.lang.Integer.toHexString(se.minor) ); System.exit( 255 ); } catch( org.omg.CORBA.UserException ue ) { System.out.println( "ERROR : " + ue.getClass().getName() ); System.exit( 255 ); } catch ( Exception e ) { System.err.println( "ERROR : " + e ); System.exit( 255 ); } } }
(5)サーバアプリケーション
import org.omg.CORBA.*; import org.omg.PortableServer.*; import ODsample.*; // ユーザアプリケーション:メイン処理クラス public class Server { public static void main( String args[] ) { try { // ORBの生成と初期化 ORB Orb = ORB.init( args, null ); // RootPOAのオブジェクトリファレンスの取得 org.omg.CORBA.Object _tmpObj = Orb.resolve_initial_references( "RootPOA" ); // RootPOAのPOAオブジェクト獲得 POA rootPOA = POAHelper.narrow( _tmpObj ); // Factoryインタフェース用のPOA作成 // ポリシリスト作成 org.omg.CORBA.Policy factory_policies[] = new org.omg.CORBA.Policy[4]; factory_policies[0] = rootPOA.create_servant_retention_policy( ServantRetentionPolicyValue.NON_RETAIN ); factory_policies[1] = rootPOA.create_request_processing_policy( RequestProcessingPolicyValue.USE_DEFAULT_SERVANT ); factory_policies[2] = rootPOA.create_id_assignment_policy( IdAssignmentPolicyValue.SYSTEM_ID ); factory_policies[3] = rootPOA.create_id_uniqueness_policy( IdUniquenessPolicyValue.MULTIPLE_ID ); POA factory_POA = rootPOA.create_POA( "IDL:ODsample/Factory:1.0", null, factory_policies); // FactoryServantの生成(コンストラクタにインプリ用POAを渡す) Servant svt = new FactoryServant( rootPOA ); // Factoryインタフェース用POAのDefault Servantに設定 factory_POA.set_servant( svt ); // AdapterActivatorの生成 AdapterActivator adp = new UserAdapterActivator(); // インプリ用POAのAdapterActivatorに設定 rootPOA.the_activator( adp ); // POAマネージャの獲得 POAManager poamanager = rootPOA.the_POAManager(); // POAマネージャのactivate poamanager.activate(); Orb.run(); } catch( org.omg.CORBA.SystemException se ) { System.out.println( "ERROR : " + se.getClass().getName() + " : minor = 0x" + java.lang.Integer.toHexString(se.minor) ); System.exit( 255 ); } catch( org.omg.CORBA.UserException ue ) { System.out.println( "ERROR : " + ue.getClass().getName() ); System.exit( 255 ); } catch ( Exception e ) { System.err.println( "ERROR : " + e ); System.exit( 255 ); } } } // FactoryServant:Factoryメソッド実装クラス(スケルトンを継承) class FactoryServant extends FactoryPOA { private POA poa = null; // コンストラクタ public FactoryServant( POA poa ) { this.poa = poa; } public intf1 create1() { intf1 ior; // UserServantのオブジェクトリファレンス try { // インタフェースリポジトリIDに対応するPOAオブジェクト獲得 POA intf1POA = this.poa.find_POA( "intf1", true ); // オブジェクトリファレンスの生成 org.omg.CORBA.Object _tmpObj = intf1POA.create_reference( "IDL:ODsample/intf1:1.0" ); ior = intf1Helper.narrow( _tmpObj ); } catch( org.omg.CORBA.UserException e ) { System.err.println( "create error: " + e ); return( null ); } return( ior ); } public intf2 create2() { intf2 ior; // UserServantのオブジェクトリファレンス try { // インタフェースリポジトリIDに対応するPOAオブジェクト獲得 POA intf2POA = this.poa.find_POA( "intf2", true ); // オブジェクトリファレンスの生成 org.omg.CORBA.Object _tmpObj = intf2POA.create_reference( "IDL:ODsample/intf2:1.0" ); ior = intf2Helper.narrow( _tmpObj ); } catch( org.omg.CORBA.UserException e ) { System.err.println( "create error: " + e ); return( null ); } return( ior ); } public void destroy1( intf1 obj ) { try { // インタフェースIDに対応するPOAオブジェクト獲得 POA intf1POA = this.poa.find_POA( "intf1", false ); // オブジェクトリファレンスからオブジェクトIDを求める byte oid[] = intf1POA.reference_to_id( obj ); // Servantをdeactiveにする intf1POA.deactivate_object( oid ); } catch( org.omg.CORBA.UserException e ) { System.err.println( "destroy error: " + e ); } } public void destroy2( intf2 obj ) { try{ // インタフェースIDに対応するPOAオブジェクト獲得 POA intf2POA = this.poa.find_POA( "intf2", false ); // オブジェクトリファレンスからオブジェクトIDを求める byte oid[] = intf2POA.reference_to_id( obj ); // Servantをdeactiveにする intf2POA.deactivate_object( oid ); } catch( org.omg.CORBA.UserException e ) { System.err.println( "destroy error: " + e ); } } } // アダプタアクティベータ:POA生成クラス(AdapterActivatorを継承) class UserAdapterActivator extends LocalObject implements AdapterActivator { public boolean unknown_adapter( POA parent, String name ) { // ポリシリスト作成 org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4]; policies[0] = parent.create_servant_retention_policy( ServantRetentionPolicyValue.RETAIN ); policies[1] = parent.create_request_processing_policy( RequestProcessingPolicyValue.USE_SERVANT_MANAGER ); policies[2] = parent.create_id_assignment_policy( IdAssignmentPolicyValue.SYSTEM_ID ); policies[3] = parent.create_id_uniqueness_policy( IdUniquenessPolicyValue.MULTIPLE_ID ); // ServantActivatorの生成 ServantActivator svtact = new UserServantActivator(); try { if( name.equals( "intf1" ) ) { // intf1用のPOA作成 POA intf1POA = parent.create_POA( name, null, policies ); // ServantManager登録 intf1POA.set_servant_manager( svtact ); return( true ); } else if( name.equals( "intf2") ) { // intf2用のPOA作成 POA intf2POA = parent.create_POA( name, null, policies ); // ServantManager登録 intf2POA.set_servant_manager( svtact ); return( true ); } } catch( Exception e ) { System.err.println( "unknown_adapter error: " + e ); return( false ); } return( true ); } } // Servantアクティベータ:Servant生成クラス(ServantActivatorを継承) class UserServantActivator extends LocalObject implements ServantActivator { public Servant incarnate( byte[] oid, POA adapter ) { Servant svt = null; if ( adapter.the_name().equals( "intf1") ) svt = new UserServant1(); else if ( adapter.the_name().equals( "intf2") ) svt = new UserServant2(); return( svt ); } public void etherealize( byte[] oid, POA adapter, Servant serv, boolean cleanup_in_progress, boolean remaining_activations ) { // 変数の初期化を行う。 serv = null; } } // Servant:メソッド実装クラス(スケルトンを継承) class UserServant1 extends intf1POA { private String value = ""; public java.lang.String value() { return( this.value ); } public void value( java.lang.String value ) { this.value = value; } } class UserServant2 extends intf2POA { private int value = 0; public int value() { return( this.value ); } public void add( int a ) { this.value += a; } public void sub( int b ) { this.value -= b; } }
(6)例外情報の獲得
サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“5.10 クライアントアプリケーションの例外処理”を参照してください。