Hitcoolectionのデータベース化(Java)


はじめに

このプログラムはGeant4のExample3で定義されたIDLである、 HitCollectionを登録及び参照できるJavaベースのデータベースを CORBAを使って実現するものです。Javaで書かれています。また、 CORBAはPortable Object ArchitectureをベースとしたORBacus4.0を利用しています。 Javaのプログラムとしては データベースを定義するプログラム(Database)、 登録及び参照をサービスするサーバプログラム(ProducerConsumer)、 登録するプログラム(Producer)、参照するプログラム(Consumer)です。

Makefile

これがMafileです。Package名を定義するとJava用IDLはその名前のサブディレクトリを作り、 生成されるプログラムをそこに格納します。

HitCollection用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を検索し、標準出力に出力している ところだけです。

実行例

実行例 を示します。この結果からこれらのプログラムはまだ正しく働いていません。 デバッグが必要ですね。