24.5 クライアントアプリケーションのサンプル

コードサンプル24-4および24-5に,Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/dynanyに入っているクライアントアプリケーションを示します。クライアントアプリケーションはDynStructインタフェースを使って,動的にStructType構造体を生成します。

DynStructインタフェースは,NameValuePairオブジェクトのシーケンスを使って,構造体メンバとメンバに対応する値を表現します。名前・値の各ペアは,構造体のメンバ名を含む文字列と,構造体メンバの値を含むAnyオブジェクトで構成されています。

通常の方法でVisiBroker ORBを初期化し,PrintManagerオブジェクトにバインドしたあと,クライアントは次の動作をします。

  1. 空のDynStructを適切な型で生成します。
  2. 構造体メンバを含むための,NameValuePairオブジェクトのシーケンスを生成します。
  3. 構造体メンバの各値用にAnyオブジェクトを生成し,初期化します。
  4. 各NameValuePairを,適切なメンバ名と値で初期化します。
  5. DynStructオブジェクトをNameValuePairシーケンスで初期化します。
  6. PrinterManager::printAnyメソッド(C++)またはPrinterManager.printAnyメソッド(Java)を呼び出し,通常のAnyに変換したDynStructを渡します。
DynAnyオブジェクトまたはその派生型の一つをオペレーション要求のパラメタとして渡す前に,DynAny::to_anyメソッド(C++)またはDynAny.to_anyメソッド(Java)を使って,これをAnyに変換しておいてください。
コードサンプル24-4 DynStructを使用したクライアントアプリケーションのサンプル(C++)

// Client.C

#include "Printer_c.hh"
#include "dynany.h"

int main(int argc, char* const* argv) {
  try {
  // Initialize the ORB.
  CORBA::ORB_ptr orb = CORBA::ORB_init(argc, argv);
  DynamicAny::DynAnyFactory_var factory =
     DynamicAny::DynAnyFactory::_narrow(
           orb->resolve_initial_references(
                 "DynAnyFactory"));
  // Get the manager Id
  PortableServer::ObjectId_var managerId =
        PortableServer::string_to_ObjectId("PrinterManager");
  // Locate an account manager. Give the full POA name
  // and the servant ID.
  Printer::PrinterManager_ptr manager =
        Printer::PrinterManager::_bind(
              "/serverPoa", managerId);

  DynamicAny::NameValuePairSeq seq(3);
  seq.length(3);

  CORBA::Any strAny,enumAny,floatAny;
  strAny <<= "String";
  enumAny <<= Printer::second;
  floatAny <<= (CORBA::Float)864.50;

  CORBA::NameValuePair nvpairs[3];

  nvpairs[0].id = CORBA::string_dup("str");
  nvpairs[0].value = strAny;

  nvpairs[1].id = CORBA::string_dup("e");
  nvpairs[1].value = enumAny;

  nvpairs[2].id = CORBA::string_dup("fl");
  nvpairs[2].value = floatAny;

  seq[0] = nvpairs[0];
  seq[1] = nvpairs[1];
  seq[2] = nvpairs[2];

  // Create Dynamic struct
  DynamicAny::DynStruct_var info =
     DynamicAny::DynStruct::_narrow(
     factory->create_dyn_any_from_type_code(
           Printer::_tc_StructType));

  info->set_members(seq);
     manager->printAny(*(info->to_any()));
     manager->shutdown();
  }
  catch(const CORBA::Exception& e) {
     cerr << "Caught " << e << "Exception" << endl;
  }
}

コードサンプル24-5 DynStructを使用したクライアントアプリケーションのサンプル(Java)

// Client.java

import org.omg.DynamicAny.*;

public class Client {

  public static void main(String[ ] args) {
     try {
        // Initialize the ORB.
        org.omg.CORBA.ORB orb =
                         org.omg.CORBA.ORB.init(args, null);

        DynAnyFactory factory = DynAnyFactoryHelper.narrow(
           orb.resolve_initial_references("DynAnyFactory"));

        // Locate a printer manager.
        Printer.PrinterManager manager =
           Printer.PrinterManagerHelper.bind(orb,
                                          "PrinterManager");

        // Create Dynamic struct
        DynStruct info =
           DynStructHelper.narrow(factory.
              create_dyn_any_from_type_code(
                 Printer.StructTypeHelper.type()));

        // Create our NameValuePair sequence (array)
        NameValuePair[ ] NVPair = new NameValuePair[3];

        // Create and initialize Dynamic Struct data as any's
        org.omg.CORBA.Any str_any = orb.create_any();
        str_any.insert_string("String");
        org.omg.CORBA.Any e_any = orb.create_any();
        Printer.EnumTypeHelper.insert(
                            e_any, Printer.EnumType.second);
        org.omg.CORBA.Any fl_any = orb.create_any();
        fl_any.insert_float((float)864.50);

        NVPair[0] = new NameValuePair("str", str_any);
        NVPair[1] = new NameValuePair("e", e_any);
        NVPair[2] = new NameValuePair("fl", fl_any);

        // Initialize the Dynamic Struct
        info.set_members(NVPair);

        manager.printAny(info.to_any());

        manager.shutdown();
     }
     catch (Exception e){
        e.printStackTrace();
     }
  }
}