ページの先頭行へ戻る
Interstage Application Server V13.0.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

5.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 -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.7 クライアントアプリケーションの例外処理”を参照してください。