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

F.1 Javaインタフェース(JDK/JRE 1.3以前からの移行)

JDK/JRE 1.3以前のJavaインタフェースを使用したアプリケーションを、本製品で使用しているJDK/JREの環境に移行する場合の注意事項について説明します。

■Javaアプリケーション実行前の注意事項

JDK/JRE 1.3以前のjavaコンパイラでコンパイルしたアプリケーションは、本製品で使用しているJDK/JREのjavaコンパイラで再度コンパイルする必要があります。JDK 1.3以前のjavaコンパイラでコンパイルしたアプリケーションを実行すると、以下のメソッドで例外“java.lang.IncompatibleClassChangeError”が発生します。

■Javaアプリケーション実行時の注意事項

org.omg.CORBA.SystemExceptionのサブクラスに対して呼び出したtoString()の結果が、JDK/JRE 1.3以前を使用した場合の結果と異なります。マイナーコードは、すべての桁ではなく、一部だけが表示されるようになります。
マイナーコード“0x53550123”、“0x4f4d0123”、“0x464a0123”の場合を例に、org.omg.CORBA.NO_MEMORYのtoString()の結果からマイナーコードを確認する手順を以下に示します。なお、JDK/JRE 1.3以前を使用した場合の結果と同様に表示する場合は、“Javaアプリケーション作成時の注意事項”の“org.omg.CORBA.SystemException”を参照して対応してください。


マイナーコード0x53550123”の場合
org.omg.CORBA.NO_MEMORY: Memory Error  vmcid: SUN  minor code: 291  completed: No

マイナーコードと“0xfffff000”との論理積が“0x53550000”と等しい場合は、以下のように表示されます。

  • “vmcid: ”のあとに“SUN”

  • “minor code: ”のあとに、マイナーコードと“0x00000fff”との論理積の結果(10進数)

マイナーコード0x4f4d0123”の場合
org.omg.CORBA.NO_MEMORY: Memory Error  vmcid: OMG  minor code: 291  completed: No

マイナーコードと“0xfffff000”との論理積が“0x4f4d0000”と等しい場合は、以下のように表示されます。

  • “vmcid: ”のあとに“OMG”

  • “minor code: ”のあとに、マイナーコードと“0x00000fff”との論理積の結果(10進数)

マイナーコード0x464a0123”の場合
org.omg.CORBA.NO_MEMORY: Memory Error  vmcid: 0x464a0000  minor code: 291  completed: No

マイナーコードと“0xfffff000”との論理積が“0x53550000”/“0x4d4f0000”と異なる場合は、以下のように表示されます。

  • “vmcid: ”のあとに、マイナーコードと0xfffff000との論理積

  • “minor code: ”のあとに、マイナーコードと0x00000fffとの論理積の結果(10進数)


したがって、org.omg.CORBA.SystemExceptionのtoString()の結果において、“vmcid: ”のあとの表示で上位5桁を、“minor code: ”のあとの表示で下位3ケタを確認できます。
たとえば、org.omg.CORBA.SystemExceptionのtoString()の結果に“vmcid: SUN minor code: 564”が表示されている場合は、次の手順でマイナーコードを確認します。

  1. “vmcid: ”のあとが“SUN”であることから、上位5桁は“0x53550”となります。

  2. “minor code: ”のあとが“564”であることから、564(10進数)を16進数に変換して、下位3桁は“0x234”となります。

  3. 1の上位5桁および2の下位3桁から、マイナーコードは“0x53550234”であることが確認できます。


■Javaアプリケーション作成時の注意事項

JDK/JRE 1.3以前のインタフェースと本製品で使用しているJDK/JREのインタフェースには、機能差異があります。
JDK/JRE 1.3以前のJavaインタフェースを使用したアプリケーションを移行する場合は、以下の機能差異を考慮して、それぞれの対処を行ってください。

  1. org.omg.CORBA.PortableServer.POA.create_reference_with_id()

  2. org.omg.PortableServer.AdapterActivator

  3. org.omg.PortableServer.ServantActivator

  4. org.omg.PortableServer.ServantLocator

  5. IDLcで生成されるスタブ・スケルトン

  6. org.omg.CORBA.SystemException

  7. org.omg.CORBA.ORB.resolve_initial_references()

  8. org.omg.PortableServer.Servant._this_object()

  9. org.omg.PortableServer.Servant._orb()


(1) org.omg.CORBA.PortableServer.POA.create_reference_with_id()

機能差異

org.omg.PortableServer.POA.create_reference_with_id()は、org.omg.PortableServer.POAPackage.WrongPolicyをスローしません。

org.omg.PortableServer.POA.create_reference_with_id()を使用しているプログラムは、org.omg.PortableServer.POAPackage.WrongPolicyをcatchしないように変更する必要があります。


対処方法

org.omg.PortableServer.POA.create_reference_with_id()がorg.omg.PortableServer.POAPackage.WrongPolicy(非Runtime例外)をスローすることを期待しているプログラムは、そのtry~catch節を見直してください。


[移行前(JDK/JRE 1.3以前)のプログラム処理]

try {
    org.omg.CORBA.Object obj = myPoa.create_reference_with_id( objID, intfID );
    } catch( org.omg.PortableServer.POAPackage.WrongPolicy e ) {
        // エラー処理
    }
    ...

[移行後のプログラム処理]

org.omg.CORBA.Object obj = myPoa.create_reference_with_id( objID, intfID );
...

(2) org.omg.PortableServer.AdapterActivator

機能差異

org.omg.PortableServer.AdapterActivatorは、interfaceとして扱われます。


対処方法

以下の対処を行ってください。

  • org.omg.CORBA.LocalObjectをextendsします。

  • org.omg.PortableServer.AdapterActivatorをextendsしているユーザクラスを、implementsに変更します。


[移行前(JDK/JRE 1.3以前)のプログラム処理]

class UserAdapterActivator
    extends org.omg.PortableServer.AdapterActivator
    {
        ...
    }

[移行後のプログラム処理]

class UserAdapterActivator
    extends org.omg.CORBA.LocalObject
    implements org.omg.PortableServer.AdapterActivator
    {
        ...
    }

(3) org.omg.PortableServer.ServantActivator

機能差異

org.omg.PortableServer.ServantActivatorは、interfaceとして扱われます。


対処方法

以下の対処を行ってください。

  • org.omg.CORBA.LocalObjectをextendsします。

  • org.omg.PortableServer.ServantActivatorをextendsしているユーザクラスを、implementsに変更します。


[移行前(JDK/JRE 1.3以前)のプログラム処理]

class UserServantActivator
    extends org.omg.PortableServer.ServantActivator
    {
        ...
    }

[移行後のプログラム処理]

class UserServantActivator
    extends org.omg.CORBA.LocalObject
    implements org.omg.PortableServer.ServantActivator
    {
        ...
    }

(4) org.omg.PortableServer.ServantLocator

機能差異

org.omg.PortableServer.ServantLocatorは、interfaceとして扱われます。


対処方法

以下の対処を行ってください。

  • org.omg.CORBA.LocalObjectをextendsします。

  • org.omg.PortableServer.ServantLocatorをextendsしているユーザクラスを、implementsに変更します。


[移行前(JDK/JRE 1.3以前)のプログラム処理]

class UserServantLocator
    extends org.omg.PortableServer.ServantLocator
    {
        ...
    }

[移行後のプログラム処理]

class UserServantLocator
    extends org.omg.CORBA.LocalObject
    implements org.omg.PortableServer.ServantLocator
    {
        ...
    }

(5) IDLcで生成されるスタブ・スケルトン

機能差異

module宣言のない定義ファイルから生成されたスタブ・スケルトンは、javacで失敗します。


対処方法

必ずmodule宣言の下に内容を記述するようにしてください。


[移行前(JDK/JRE 1.3以前)のプログラム処理]

interface   intf{
    long    add(in long a, in long b);
};

[移行後のプログラム処理]

module mod{
    interface   intf{
        long    add(in long a, in long b);
    };
};

(6) org.omg.CORBA.SystemException

機能差異

org.omg.CORBA.SystemExceptionのサブクラスに対して呼び出したtoString()の結果が異なります。特にマイナーコードについては、すべての桁が表示されません。


対処方法

必ず以下の形式で例外情報を出力するようにしてください。


try {
        :
}
catch( org.omg.CORBA.SystemException e ) {
    System.out.println( "ERROR : " + e.getClass().getName()
        + " : minor = 0x" + java.lang.Integer.toHexString(e.minor) );
        :
}

(7) org.omg.CORBA.ORB.resolve_initial_references()

機能差異

以下のいずれかの条件で、“RootPOA”を指定してorg.omg.CORBA.ORB.resolve_initial_references()を呼び出した場合、nullが返却されます。

  • サーバアプリケーションを登録していない。

  • 環境変数OD_IMPLIDを使用したインプリメンテーションの登録方法に誤りがある。


対処方法

必ず復帰値を確認するようにプログラムを変更してください。


(8) org.omg.PortableServer.Servant._this_object()

機能差異

org.omg.PortableServer.Servant._this_object(org.omg.CORBA.ORB orb)形式は、使用できません。
ServantクラスにORBインスタンスを設定する場合、以下のいずれかのメソッドに、対象となるServantクラスを指定して呼び出す必要があります。

  • org.omg.PortableServer.POA.set_servant()

  • org.omg.PortableServer.POA.activate_object()

  • org.omg.PortableServer.POA.activate_object_with_id()

  • org.omg.PortableServer.POA.servant_to_reference()

  • org.omg.PortableServer.POA.servant_to_id()

なお、上記のメソッドを使用する場合は、対象となるPOAに必要なポリシが設定されている必要があります。詳細については、“リファレンスマニュアル(API編)”のそれぞれのメソッドを参照してください。


対処方法

org.omg.PortableServer.Servant._this_object(org.omg.CORBA.ORB orb)を使用せずに、上記のメソッドを使用するようにプログラムを変更してください。


[移行前(JDK/JRE 1.3以前のインタフェースを使用した場合)のプログラム処理]

org.omg.CORBA.ORB Orb;
...
org.omg.PortableServer.Servant svt = new UserServant();
svt._this_object(Orb);
...

[移行後のプログラム処理]

org.omg.PortableServer.POA childPOA;
...
org.omg.PortableServer.Servant svt = new UserServant();
childPOA.servant_to_reference( svt );
...

(9) org.omg.PortableServer.Servant._orb()

機能差異

org.omg.PortableServer.Servant._orb(org.omg.CORBA.ORB orb)形式は、使用できません。
ServantクラスにORBインスタンスを設定する場合、以下のいずれかのメソッドに、対象となるServantクラスを指定して呼び出す必要があります。

  • org.omg.PortableServer.POA.set_servant()

  • org.omg.PortableServer.POA.activate_object()

  • org.omg.PortableServer.POA.activate_object_with_id()

  • org.omg.PortableServer.POA.servant_to_reference()

  • org.omg.PortableServer.POA.servant_to_id()

なお、上記のメソッドを使用する場合は、対象となるPOAに必要なポリシが設定されている必要があります。詳細については、“リファレンスマニュアル(API編)”のそれぞれのメソッドを参照してください。


対処方法

org.omg.PortableServer.Servant._this_orb(org.omg.CORBA.ORB orb)を使用せずに、上記のメソッドを使用するようにプログラムを変更してください。


[移行前(JDK/JRE 1.3以前のインタフェースを使用した場合)のプログラム処理]

org.omg.CORBA.ORB Orb;
...
org.omg.PortableServer.Servant svt = new UserServant();
svt._orb(Orb);
...

[移行後のプログラム処理]

org.omg.PortableServer.POA childPOA;
...
org.omg.PortableServer.Servant svt = new UserServant();
childPOA.set_servant( svt );
...