Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第6章 アプリケーションの開発(Java言語)> 6.16 サーバアプリケーションのプログラミング例

6.16.5 AdapterActivator使用例 (find_POA時)

(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 -a Imple_POAsample9 -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を継承)
  // JDK/JRE1.3以前を使用する場合
  // class UserAdapterActivator extends AdapterActivator {
  // JDK/JRE1.4を使用する場合
  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を継承)
  // JDK/JRE1.3以前を使用する場合
  // class UserServantActivator extends ServantActivator {
  // JDK/JRE1.4を使用する場合
  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)例外情報の獲得

 サーバアプリケーションで例外を獲得する方法は、クライアントアプリケーションの例外処理と同様です。詳細については、“クライアントアプリケーションの例外処理”を参照してください。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005