Hitcoolectionのデータベース化(Java)
このプログラムはGeant4のExample3で定義されたIDLである、
HitCollectionを登録及び参照できるJavaベースのデータベースを
CORBAを使って実現するものです。Javaで書かれています。また、
CORBAはPortable Object ArchitectureをベースとしたORBacus4.0を利用しています。
Javaのプログラムとしては
データベースを定義するプログラム(Database)、
登録及び参照をサービスするサーバプログラム(ProducerConsumer)、
登録するプログラム(Producer)、参照するプログラム(Consumer)です。
これがMafileです。Package名を定義するとJava用IDLはその名前のサブディレクトリを作り、
生成されるプログラムをそこに格納します。
Geant4のExample3で定義されたProcessHitsCollectionを少し変更しました。
ファイル名はProcessHitsCollection.idlです。コンパイルは
% jidl --package ProcessHitsCollection ProcessHitsCollection.idl
とします。IDLファイル、
ProcessHitsCollection.idlProcessHitsCollection.idlをみてください。
このプログラムはデータベースそのものです。キーワードで登録(add)と参照(find)が
できます。HitCollectionはJavaのベクタで格納されます。
プログラムリストはDatabase.javaです。プログラムを見てみましょう。
Hit[] data;
これはHitCollectionオブジェクトです。
サーバプログラムは型どおりのプログラムです。多少の違いはありますが、
いろいろなリモートオブジェクトを扱うサーバとして汎用に使えます。
プログラムリストはProducerConsumer.javaです。プログラムを見てみましょう。
Properties props = System.getProperties();
props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB");
props.put("org.omg.CORBA.ORBSingletonClass", "com.ooc.CORBA.ORBSingleton");
これらはOMGが決めたCORBAのオブジェクト構造とORBacusが決めたその構造が
違っているので、対応させる処理です。
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props);
これはORBの初期化です。
org.omg.PortableServer.POA rootPOA =
org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
ProducerConsumer aProcessImpl = new ProducerConsumer();
org.omg.CORBA.Object aProcess = aProcessImpl._this(orb);
これらはC++での手順と同じく、RootPOAのオブジェクトリファレンスを取得し、
次にPOAマネージャのオブジェクトリファレンスを取得します。そして、
サーバプログラムであるProducerConsumerオブジェクトを生成し、
そのオブジェクトリファレンスを標準出力に出力します。最後に、POAマネージャを
活性化し、自分をサーバとして走らせます。
IDLで定義したメソッドをここで実装します。
processはHitCollectionを標準出力に出力し、データベースに登録します。
postProcessは登録したキーを元にデータベースを検索します。
プログラムリストはProducerApp.javaです。C++で行なったCORBAの手順と同じです。
HitCollectionのオブジェクトリファレンスは標準入力から取得します。
s = ProcessHitsCollectionHelper.narrow( object );
これでHitCollectionのオブジェクトを生成します。
一方、aHCに登録すべきオブジェクトを作成し、
s.process(aHC);
このようにHitCollectionの
メソッドprocessを使ってそれをリモートのサーバに登録します。
プログラムリストはConsumerApp.javaです。プログラムを見てみましょう。
Producerと違う点は
aHitsCol = s.postProcess(key);
与えられたキーで登録したHitCollectionを検索し、標準出力に出力している
ところだけです。
実行例
を示します。この結果からこれらのプログラムはまだ正しく働いていません。
デバッグが必要ですね。