JDK/JRE 1.3以前のJavaインタフェースを使用したアプリケーションを、本製品で使用しているJDK/JREの環境に移行する場合の注意事項について説明します。
■Javaアプリケーション実行前の注意事項
JDK/JRE 1.3以前のjavaコンパイラでコンパイルしたアプリケーションは、本製品で使用しているJDK/JREのjavaコンパイラで再度コンパイルする必要があります。JDK 1.3以前のjavaコンパイラでコンパイルしたアプリケーションを実行すると、以下のメソッドで例外“java.lang.IncompatibleClassChangeError”が発生します。
org.omg.PortableServer.POAManager.activate()
org.omg.PortableServer.POAManager.hold_requests()
org.omg.PortableServer.POAManager.discard_requests()
org.omg.PortableServer.POAManager.deactivate()
■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”を参照して対応してください。
org.omg.CORBA.NO_MEMORY: Memory Error vmcid: SUN minor code: 291 completed: No
マイナーコードと“0xfffff000”との論理積が“0x53550000”と等しい場合は、以下のように表示されます。
“vmcid: ”のあとに“SUN”
“minor code: ”のあとに、マイナーコードと“0x00000fff”との論理積の結果(10進数)
org.omg.CORBA.NO_MEMORY: Memory Error vmcid: OMG minor code: 291 completed: No
マイナーコードと“0xfffff000”との論理積が“0x4f4d0000”と等しい場合は、以下のように表示されます。
“vmcid: ”のあとに“OMG”
“minor code: ”のあとに、マイナーコードと“0x00000fff”との論理積の結果(10進数)
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”が表示されている場合は、次の手順でマイナーコードを確認します。
“vmcid: ”のあとが“SUN”であることから、上位5桁は“0x53550”となります。
“minor code: ”のあとが“564”であることから、564(10進数)を16進数に変換して、下位3桁は“0x234”となります。
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()
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 ); ...