diff options
Diffstat (limited to 'TAO/tests/Exposed_Policies/Policy_Tester.cpp')
-rw-r--r-- | TAO/tests/Exposed_Policies/Policy_Tester.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/TAO/tests/Exposed_Policies/Policy_Tester.cpp b/TAO/tests/Exposed_Policies/Policy_Tester.cpp new file mode 100644 index 00000000000..1b858b7697c --- /dev/null +++ b/TAO/tests/Exposed_Policies/Policy_Tester.cpp @@ -0,0 +1,265 @@ +// $Id$ + +// -- App. Specific Include -- +#include "Policy_Tester.h" +#include "RT_Properties.h" +#include "CounterC.h" + +// -- ACE Include -- +#include "ace/Arg_Shifter.h" +#include "ace/OS_NS_stdio.h" + +// -- RTCORBA Include -- +#include "tao/RTCORBA/RT_Policy_i.h" + +// -- RTCORBA Include -- +#include "tao/RTCORBA/RT_ORB.h" + +#include "tao/ORB_Constants.h" +#include "tao/ORB_Core.h" + +ACE_RCSID (tao, Policy_Tester, "$Id$") + +Policy_Tester::Policy_Tester (void) + : rt_object_properties_ (0), + rt_poa_properties_ (0) +{ + // No_Op +} + +Policy_Tester::~Policy_Tester (void) +{ +} + +void +Policy_Tester::run (void) +{ + PortableServer::POAManager_var poa_manager = + this->child_poa_->the_POAManager (); + + poa_manager->activate (); + + this->orb_->run (); +} + +int +Policy_Tester::init (int argc, + char *argv[]) +{ + // ORB Initialization. + this->orb_ = + CORBA::ORB_init (argc, argv); + + // Get a reference to the RT-ORB. + CORBA::Object_var object = + this->orb_->resolve_initial_references ("RTORB"); + + this->rt_orb_ = RTCORBA::RTORB::_narrow (object.in ()); + + // Here we parse the command line paramether passed + // to the application. + + ACE_Arg_Shifter arg_shifter (argc, argv); + + while (arg_shifter.is_anything_left ()) + { + const char *arg = 0; + // IOR File Name Option. + if ((arg = arg_shifter.get_the_parameter ("-POAConfigFile"))) + { + this->rt_poa_properties_ = + RT_Properties::read_from (arg); + } + else if ((arg = arg_shifter.get_the_parameter ("-ObjectConfigFile"))) + { + this->rt_object_properties_ = + RT_Properties::read_from (arg); + } + else if ((arg = arg_shifter.get_the_parameter ("-BaseObjectIOR"))) + { + if (this->rt_poa_properties_ == 0) + { + ACE_NEW_THROW_EX (this->rt_poa_properties_, + RT_Properties, + CORBA::NO_MEMORY (TAO::VMCID, + CORBA::COMPLETED_NO)); + } + this->rt_poa_properties_->ior_source (arg); + } + else if ((arg = arg_shifter.get_the_parameter ("-OverriddenIOR"))) + { + if (this->rt_object_properties_ == 0) + { + ACE_NEW_THROW_EX (this->rt_object_properties_, + RT_Properties, + CORBA::NO_MEMORY (TAO::VMCID, + CORBA::COMPLETED_NO)); + } + this->rt_object_properties_->ior_source (arg); + } + else + arg_shifter.consume_arg (); + } + + if ((this->rt_poa_properties_ == 0) || (this->rt_object_properties_ == 0)) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Configuration file missing!"))); + return -1; + } + + int result = + this->create_objects (); + + if (result != 0) + return result; + + return 0; +} + +CORBA::Boolean +Policy_Tester::check_reference (CORBA::Object_ptr object, + const char *msg) +{ + if (CORBA::is_nil (object)) + { + ACE_DEBUG ((LM_DEBUG, ACE_TEXT (msg))); + return 0; + } + return 1; +} + + +int +Policy_Tester::create_objects (void) +{ + CORBA::PolicyList poa_policy_list; + poa_policy_list.length (3); + + // Create the priority policy using the RT-ORB. + RTCORBA::Priority priority = this->rt_poa_properties_->priority (); + poa_policy_list[0] = + this->rt_orb_->create_priority_model_policy (RTCORBA::SERVER_DECLARED, + priority); + + // Create priority Banded Connection Policy. + RTCORBA::PriorityBands poa_priority_bands = + this->rt_poa_properties_->priority_bands (); + + poa_policy_list[1] = + this->rt_orb_->create_priority_banded_connection_policy (poa_priority_bands); + + // Client Protocol Policy. + RTCORBA::ProtocolList protocol_list; + protocol_list.length (1); + + protocol_list[0].protocol_type = IOP::TAG_INTERNET_IOP; + protocol_list[0].orb_protocol_properties = + TAO_Protocol_Properties_Factory::create_orb_protocol_property (IOP::TAG_INTERNET_IOP); + + protocol_list[0].transport_protocol_properties = + TAO_Protocol_Properties_Factory::create_transport_protocol_property (IOP::TAG_INTERNET_IOP, + this->orb_->orb_core ()); + + poa_policy_list[2] = + this->rt_orb_->create_client_protocol_policy (protocol_list); + + CORBA::Object_var object = + this->orb_->resolve_initial_references ("RootPOA"); + + this->poa_ = + PortableServer::POA::_narrow (object.in ()); + + PortableServer::POAManager_var poa_mgr = + PortableServer::POAManager::_nil (); + + object = + this->poa_->create_POA ("Child_POA", + poa_mgr.in (), + poa_policy_list); + + this->child_poa_ = + RTPortableServer::POA::_narrow (object.in ()); + + // Create a Corba Object reference, using the policies + // set at the POA level. + object = + this->child_poa_->create_reference ("IDL:Counter:1.0"); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Reference Created!\n"))); + + if (!check_reference (object.in (), + "Unable to create Object!\n")) + return -1; + + Counter_var base_object = Counter::_narrow (object.in ()); + + if (!check_reference (base_object.in(), + "Unable to create a Object!\n")) + return -1; + + CORBA::String_var ior = + this->orb_->object_to_string (base_object.in ()); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Activated as <%s>\n"), ior.in ())); + + FILE *output_file = ACE_OS::fopen (this->rt_poa_properties_->ior_source (), "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("Cannot open output file for writing IOR: %s"), + this->rt_poa_properties_->ior_source ()), + -1); + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + + // Now we create an object that overrides some of the policies + // set at the POA level. + + + // Create a Corba Object reference, using the policies + // set at the POA level. + + object = + this->child_poa_->create_reference_with_priority + ("IDL:Counter:1.0", + this->rt_object_properties_->priority ()); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Reference Created!\n"))); + + if (!check_reference (object.in (), + "Unable to create a Counter Object!\n")) + return -1; + + Counter_var over_object = Counter::_narrow (object.in ()); + + if (!check_reference (over_object.in(), + "Unable to create Object!\n")) + return -1; + + + CORBA::String_var o_ior = + this->orb_->object_to_string (over_object.in ()); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Activated as <%s>\n"), o_ior.in ())); + + output_file = ACE_OS::fopen (this->rt_object_properties_->ior_source (), "w"); + + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("Cannot open output file for writing IOR: %s"), + this->rt_object_properties_->ior_source ()), + -1); + ACE_OS::fprintf (output_file, "%s", o_ior.in ()); + ACE_OS::fclose (output_file); + return 0; +} + +void +Policy_Tester::shutdown (void) +{ + this->orb_->shutdown (0); +} |