Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド
コードサンプル24-6に,Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/dynanyに入っているサーバアプリケーションを示します。サーバアプリケーションは次の動作を行います。
. . . int main(int argc, char* const* argv) { try { // Initialize the ORB. CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); int Verbose = 0; // get a reference to the rootPOA PortableServer::POA_var rootPOA = PortableServer::POA::_narrow( orb->resolve_initial_references("RootPOA")); CORBA::PolicyList policies; policies.length(1); policies[(CORBA::ULong)0] = rootPOA->create_lifespan_policy( PortableServer::PERSISTENT); // Create serverPOA with the right policies PortableServer::POA_var serverPOA = rootPOA->create_POA("serverPoa", rootPOA->the_POAManager(), policies ); // Resolve Dynamic Any Factory DynamicAny::DynAnyFactory_var factory = orb->resolve_initial_references("DynAnyFactory"); PortableServer::ObjectId_var managerId = PortableServer::string_to_ObjectId( "PrinterManager"); // Create the printer manager object. PrinterManagerImpl manager( orb, factory, serverPOA, managerId); // Export the newly create object. serverPOA->activate_object_with_id(managerId,&manager); // Activate the POA Manager rootPOA->the_POAManager()->activate(); cout << serverPOA->servant_to_reference(&manager) << "is ready" << endl; // Wait for incoming requests orb->run(); } catch(const CORBA::Exception& e) { cerr << e << endl; } }
// Server.java import java.util.*; import org.omg.DynamicAny.*; import org.omg.PortableServer.*; import com.inprise.vbroker.PortableServerExt.*; public class Server { public static void main(String[ ] args) { try { // Initialize the ORB. org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // Resolve RootPOA POA rootPoa = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); rootPoa.the_POAManager().activate(); // Create a BindSupport Policy that makes POA // register each servant with osagent org.omg.CORBA.Any any = orb.create_any(); BindSupportPolicyValueHelper.insert(any, BindSupportPolicyValue.BY_INSTANCE); org.omg.CORBA.Policy bsPolicy = orb.create_policy( BIND_SUPPORT_POLICY_TYPE.value, any); // Create policies for our testPOA org.omg.CORBA.Policy[ ] policies = { rootPoa.create_lifespan_policy( LifespanPolicyValue.PERSISTENT), bsPolicy }; // Create managerPOA with the right policies POA serverPoa = rootPoa.create_POA( "serverPoa", rootPoa.the_POAManager(), policies); // Resolve Dynamic Any Factory DynAnyFactory factory = DynAnyFactoryHelper.narrow( orb.resolve_initial_references("DynAnyFactory")); byte[ ] oid = "PrinterManager".getBytes(); // Create the printer manager object. PrinterManagerImpl manager = new PrinterManagerImpl( (com.inprise.vbroker.CORBA.ORB)orb, factory, serverPoa, oid); // Export the newly create object. serverPoa.activate_object_with_id(oid, manager); System.out.println(manager + "is ready."); // Wait for incoming requests orb.run(); } catch (Exception e) { e.printStackTrace(); } } }
コードサンプル24-8は,PrinterManagerインプリメンテーションが,次の手順で,コンパイル時にAnyが含む型を知らないで,DynAnyを使ってAnyオブジェクトを処理する様子を示します。
// PrinterManager Implementation class PrinterManagerImpl : public POA_Printer::PrinterManager { CORBA::ORB_var _orb; DynamicAny::DynAnyFactory_var _factory; PortableServer::POA_var _poa; PortableServer::ObjectId_var _oid; public: PrinterManagerImpl(CORBA::ORB_ptr orb, DynamicAny::DynAnyFactory_ptr DynAnyFactory, PortableServer::POA_ptr poa, PortableServer::ObjectId_ptr oid ) : _orb(orb), _factory(DynAnyFactory), _poa(poa), _oid(oid) {} void printAny(const CORBA::Any& info) { try { // Create a DynAny object DynamicAny::DynAny_var dynAny = _factory->create_dyn_any(info); display(dynAny); } catch (CORBA::Exception& e) { cout << "Unable to create Dynamic Any from factory" << endl; } } void shutdown() { try { _poa->deactivate_object(_oid); cout << "Server shutting down..." << endl; _orb->shutdown(0UL); } catch (const CORBA::Exception& e){ cout << e << endl; } } void display(DynamicAny::DynAny_var value) { switch(value->type()->kind()) { case CORBA::tk_null: case CORBA::tk_void: { break; } case CORBA::tk_short: { cout << value->get_short() << endl; break; } case CORBA::tk_ushort: { cout << value->get_ushort() << endl; break; } case CORBA::tk_long: { cout << value->get_long() << endl; break; } case CORBA::tk_ulong: { cout << value->get_ulong() << endl; break; } case CORBA::tk_float: { cout << value->get_float() << endl; break; } case CORBA::tk_double: { cout << value->get_double() << endl; break; } case CORBA::tk_boolean: { cout << value->get_boolean() << endl; break; } case CORBA::tk_char: { cout << value->get_char() << endl; break; } case CORBA::tk_octet: { cout << value->get_octet() << endl; break; } case CORBA::tk_string: { cout << value->get_string() << endl; break; } case CORBA::tk_any: { DynamicAny::DynAny_var dynAny = _factory->create_dyn_any(*(value->get_any())); display(dynAny); break; } case CORBA::tk_TypeCode: { cout << value->get_typecode() << endl; break; } case CORBA::tk_objref: { cout << value->get_reference() << endl; break; } case CORBA::tk_enum: { DynamicAny::DynEnum_var dynEnum = DynamicAny::DynEnum::_narrow(value); cout << dynEnum->get_as_string() << endl; break; } case CORBA::tk_union: { DynamicAny::DynUnion_var dynUnion = DynamicAny::DynUnion::_narrow(value); display(dynUnion->get_discriminator()); display(dynUnion->member()); break; } case CORBA::tk_struct: case CORBA::tk_array: case CORBA::tk_sequence: { value->rewind(); CORBA::Boolean next = 1UL; while(next) { DynamicAny::DynAny_var d = value->current_component(); display(d); next =value->next(); } break; } case CORBA::tk_longlong: { cout << value->get_longlong() << endl; break; } case CORBA::tk_ulonglong: { cout << value->get_ulonglong() << endl; break; } case CORBA::tk_wstring: { cout << value->get_wstring() << endl; break; } case CORBA::tk_wchar: { cout << value->get_wchar() << endl; break; } default: cout << "Invalid Type" << endl; } } };
// PrinterManagerImpl.java import java.util.*; import org.omg.DynamicAny.*; import org.omg.PortableServer.*; public class PrinterManagerImpl extends Printer.PrinterManagerPOA { private com.inprise.vbroker.CORBA.ORB _orb; private DynAnyFactory _factory; private POA _poa; private byte[ ] _oid; public PrinterManagerImpl( com.inprise.vbroker.CORBA.ORB orb, DynAnyFactory factory, POA poa, byte[ ] oid) { _orb = orb; _factory = factory; _poa = poa; _oid = oid; } public synchronized void printAny(org.omg.CORBA.Any info) { // Display info with the assumption that we don't have // any info statically about the type inside the any try { // Create a DynAny object DynAny dynAny = _factory.create_dyn_any(info); display(dynAny); } catch (Exception e) { e.printStackTrace(); } } public void shutdown() { try { _poa.deactivate_object(_oid); System.out.println("Server shutting down"); _orb.shutdown(false); } catch (Exception e) { System.out.println(e); } } private void display(DynAny value) throws Exception { switch(value.type().kind().value()) { case org.omg.CORBA.TCKind._tk_null: case org.omg.CORBA.TCKind._tk_void: { break; } case org.omg.CORBA.TCKind._tk_short: { System.out.println(value.get_short()); break; } case org.omg.CORBA.TCKind._tk_ushort: { System.out.println(value.get_ushort()); break; } case org.omg.CORBA.TCKind._tk_long: { System.out.println(value.get_long()); break; } case org.omg.CORBA.TCKind._tk_ulong: { System.out.println(value.get_ulong()); break; } case org.omg.CORBA.TCKind._tk_float: { System.out.println(value.get_float()); break; } case org.omg.CORBA.TCKind._tk_double: { System.out.println(value.get_double()); break; } case org.omg.CORBA.TCKind._tk_boolean: { System.out.println(value.get_boolean()); break; } case org.omg.CORBA.TCKind._tk_char: { System.out.println(value.get_char()); break; } case org.omg.CORBA.TCKind._tk_octet: { System.out.println(value.get_octet()); break; } case org.omg.CORBA.TCKind._tk_string: { System.out.println(value.get_string()); break; } case org.omg.CORBA.TCKind._tk_any: { DynAny dynAny = _factory.create_dyn_any(value.get_any()); display(dynAny); break; } case org.omg.CORBA.TCKind._tk_TypeCode: { System.out.println(value.get_typecode()); break; } case org.omg.CORBA.TCKind._tk_objref: { System.out.println(value.get_reference()); break; } case org.omg.CORBA.TCKind._tk_enum: { DynEnum dynEnum = DynEnumHelper.narrow(value); System.out.println(dynEnum.get_as_string()); break; } case org.omg.CORBA.TCKind._tk_union: { DynUnion dynUnion = DynUnionHelper.narrow(value); display(dynUnion.get_discriminator()); display(dynUnion.member()); break; } case org.omg.CORBA.TCKind._tk_struct: case org.omg.CORBA.TCKind._tk_array: case org.omg.CORBA.TCKind._tk_sequence: { value.rewind(); boolean next = true; while(next) { DynAny d = value.current_component(); display(d); next = value.next(); } break; } case org.omg.CORBA.TCKind._tk_longlong: { System.out.println(value.get_longlong()); break; } case org.omg.CORBA.TCKind._tk_ulonglong: { System.out.println(value.get_ulonglong()); break; } case org.omg.CORBA.TCKind._tk_wstring: { System.out.println(value.get_wstring()); break; } case org.omg.CORBA.TCKind._tk_wchar: { System.out.println(value.get_wchar()); break; } default: System.out.println("Invalid type"); } } }
All Rights Reserved. Copyright (C) 2008, Hitachi, Ltd.
COPYRIGHT (C) 1992-2004 Borland Software Corporation. All rights reserved.