diff options
Diffstat (limited to 'TAO/orbsvcs/examples/CosEC/Factory/FactoryClient.cpp')
-rw-r--r-- | TAO/orbsvcs/examples/CosEC/Factory/FactoryClient.cpp | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/TAO/orbsvcs/examples/CosEC/Factory/FactoryClient.cpp b/TAO/orbsvcs/examples/CosEC/Factory/FactoryClient.cpp new file mode 100644 index 00000000000..34a7b2c47a7 --- /dev/null +++ b/TAO/orbsvcs/examples/CosEC/Factory/FactoryClient.cpp @@ -0,0 +1,336 @@ +// -*- C++ -*- +// $Id$ + +#include "CosEventChannelFactoryC.h" +#include "orbsvcs/CosNamingC.h" +#include "ace/Log_Msg.h" + +class FactoryClient +{ + // = TITLE + // A simple client to test the CosEC factory + // + // = DESCRIPTION + // Test Client for the CosEC factory. + +public: + // Initialization and termination methods + FactoryClient (void); + // constructor. + + virtual ~FactoryClient (void); + // destructor. + + void init_ORB (int argc, char *argv []); + // Initializes the ORB. + + void resolve_naming_service (void); + // Try to get hold of a running naming service. + + void resolve_factory (void); + // Try to resolve the factory from the Naming service. + + CosEventChannelFactory::ChannelFactory_ptr + create_factory (void); + // Create a local Factory and also set the <factory_>. + + virtual void run_test (void); + // Runs a couple of tests to check if the factory behaves correctly. + +protected: + CosEventChannelAdmin::EventChannel_ptr + create_channel (const char *channel_id, + CosEventChannelFactory::ChannelFactory_ptr factory); + // Create a channel. + + void destroy_channel (const char *channel_id); + // Destroy the channel. + + void find_channel (const char* channel_id); + // Find a channel. + + void find_channel_id (CosEventChannelAdmin::EventChannel_ptr channel); + // Find a channel. + + // = Protected Data members. + const char* factory_name_; + // The name of the factory registered with the naming service. + + CORBA::ORB_var orb_; + // The ORB that we use. + + CosNaming::NamingContext_var naming_context_; + // Handle to the name service. + + CosEventChannelFactory::ChannelFactory_var factory_; + // object from naming service. + + int use_naming_service; + // flag to indicate if the naming service should be used. +}; + +FactoryClient::FactoryClient (void) + :factory_name_ ("CosEC_Factory"), + use_naming_service (0) +{ + // No-Op. +} + +FactoryClient::~FactoryClient (void) +{ + // No-Op. +} + +void +FactoryClient::init_ORB (int argc, + char *argv []) +{ + this->orb_ = CORBA::ORB_init (argc, + argv, + ""); +} + +void +FactoryClient::resolve_naming_service (void) +{ + CORBA::Object_var naming_obj = + this->orb_->resolve_initial_references ("NameService"); + + // Need to check return value for errors. + if (CORBA::is_nil (naming_obj.in ())) + throw CORBA::UNKNOWN (); + + this->naming_context_ = + CosNaming::NamingContext::_narrow (naming_obj.in ()); + + this->use_naming_service = 1; +} + +void +FactoryClient::resolve_factory (void) +{ + ACE_ASSERT (this->use_naming_service == 1); + + CosNaming::Name name (1); + name.length (1); + name[0].id = CORBA::string_dup (this->factory_name_); + + CORBA::Object_var obj = + this->naming_context_->resolve (name); + + this->factory_ = + CosEventChannelFactory::ChannelFactory::_narrow (obj.in ()); +} + +CosEventChannelFactory::ChannelFactory_ptr +FactoryClient::create_factory (void) +{ + throw CORBA::UNKNOWN (); +} + +CosEventChannelAdmin::EventChannel_ptr +FactoryClient::create_channel (const char *channel_id, + CosEventChannelFactory::ChannelFactory_ptr factory) +{ + ACE_DEBUG ((LM_DEBUG, + "Trying to create channel %s\n", channel_id)); + + CosEventChannelAdmin::EventChannel_var ec = + CosEventChannelAdmin::EventChannel::_nil (); + + try + { + ec = factory->create (channel_id, + this->use_naming_service); + + ACE_ASSERT (!CORBA::is_nil (ec.in ())); + + ACE_DEBUG ((LM_DEBUG, + "Created Cos Event Channel \"%s \"\n", + channel_id)); + } + catch (const CORBA::UserException& ue) + { + ue._tao_print_exception ("User Exception in createChannel: "); + return CosEventChannelAdmin::EventChannel::_nil (); + } + catch (const CORBA::SystemException& se) + { + se._tao_print_exception ("System Exception in createChannel: "); + return CosEventChannelAdmin::EventChannel::_nil (); + } + + return ec._retn (); +} + +void +FactoryClient::destroy_channel (const char *channel_id) +{ + ACE_DEBUG ((LM_DEBUG, + "Destroying Cos Event Channel \"%s \"\n", + channel_id)); + + this->factory_->destroy (channel_id, + use_naming_service); +} + +void +FactoryClient::find_channel (const char* channel_id) +{ + try + { + ACE_DEBUG ((LM_DEBUG, + "trying to find the Channel \"%s \"\n", + channel_id)); + + CosEventChannelAdmin::EventChannel_var channel = + this->factory_->find (channel_id); + + + CORBA::String_var str = + orb_->object_to_string (channel.in ()); + + ACE_DEBUG ((LM_DEBUG, + "Find returned - %s \n", + str.in ())); + + this->find_channel_id (channel.in ()); + } + catch (const CORBA::UserException& ue) + { + ue._tao_print_exception ("User Exception in findchannel: "); + } + catch (const CORBA::SystemException& se) + { + se._tao_print_exception ("System Exception in findchannel: "); + } +} + +void +FactoryClient::find_channel_id (CosEventChannelAdmin::EventChannel_ptr channel) +{ + CORBA::String_var str = + orb_->object_to_string (channel); + + ACE_DEBUG ((LM_DEBUG, + "trying to find the Channel %s \n", + str.in ())); + + char *channel_id = + this->factory_->find_channel_id (channel); + + ACE_DEBUG ((LM_DEBUG, + "find returned %s\n", channel_id)); +} + +/* + * excercise the factory: create 3 Channels and test the factory. + */ + +void +FactoryClient::run_test (void) +{ + ACE_ASSERT (!CORBA::is_nil (this->factory_.in ())); + + const char *channel_id [3] = {"cosec1", "cosec2", "cosec3"}; + CosEventChannelAdmin::EventChannel_var cosec [3]; + + // create the first cosec + cosec[0] = this->create_channel (channel_id[0], + this->factory_.in ()); + + // create the second cosec + cosec[1] = this->create_channel (channel_id[1], + this->factory_.in ()); + + // create the third cosec + cosec[2] = this->create_channel (channel_id[2], + this->factory_.in ()); + + // see it we can destroy this one.. + this->destroy_channel (channel_id[2]); + + // see if we can find it? + this->find_channel_id (cosec[2].in ()); + + // see if we can create it again? + cosec[2] = this->create_channel (channel_id[2], + this->factory_.in ()); + + // try and find a channel that does not exist. + this->find_channel ("areyouthere?"); + + // see if it can detect duplicates. + this->create_channel (channel_id[2], + this->factory_.in ()); + + // see if it can give us the id? + this->find_channel_id (cosec[0].in ()); + + this->find_channel_id (cosec[1].in ()); + + this->find_channel_id (cosec[2].in ()); + + // check if we can get the channels from the id. + this->find_channel (channel_id[0]); + + this->find_channel (channel_id[1]); + + this->find_channel (channel_id[2]); + + //destroy them all. + this->destroy_channel (channel_id[0]); + + this->destroy_channel (channel_id[1]); + + this->destroy_channel (channel_id[2]); + + // end of testing. + ACE_DEBUG ((LM_DEBUG, + "Factory testing complete\n")); +} + +int +main (int argc, char *argv []) +{ + ACE_DEBUG ((LM_DEBUG, + "The FactoryClient will test the Cos Event Channel Factory\n")); + try + { + FactoryClient ft; + + ft.init_ORB (argc, + argv); + + try + { + ft.resolve_naming_service (); + + ft.resolve_factory (); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("Failed to resolve the naming service"); + ACE_DEBUG ((LM_DEBUG, + "Creating a local Factory\n")); + // TBD: + ft.create_factory (); + } + + ft.run_test (); + } + catch (const CORBA::UserException& ue) + { + ue._tao_print_exception ( + "test failed: User Exception in FactoryClient: "); + return 1; + } + catch (const CORBA::SystemException& se) + { + se._tao_print_exception ( + "test failed: System Exception in FactoryClient: "); + return 1; + } + + return 0; +} |