diff options
Diffstat (limited to 'ACE/TAO/tests/POA/EndpointPolicy/server.cpp')
-rw-r--r-- | ACE/TAO/tests/POA/EndpointPolicy/server.cpp | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/ACE/TAO/tests/POA/EndpointPolicy/server.cpp b/ACE/TAO/tests/POA/EndpointPolicy/server.cpp new file mode 100644 index 00000000000..9b44f992a54 --- /dev/null +++ b/ACE/TAO/tests/POA/EndpointPolicy/server.cpp @@ -0,0 +1,358 @@ +// $Id$ + +#include "Hello.h" +#include "tao/PolicyC.h" +#include "tao/EndpointPolicy/EndpointPolicy.h" +#include "tao/EndpointPolicy/IIOPEndpointValue_i.h" +#include "tao/Strategies/advanced_resource.h" +#include "tao/PI_Server/PI_Server.h" +#include "tao/ORB_Constants.h" +#include "ace/OS_NS_strings.h" +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_unistd.h" + +ACE_RCSID (Hello, + server, + "$Id$") + +const ACE_TCHAR *good_ior_file = ACE_TEXT ("good.ior"); +const ACE_TCHAR *bad_ior_file = ACE_TEXT ("bad.ior"); +const ACE_TCHAR *root_ior_file = ACE_TEXT("root.ior"); +const ACE_TCHAR *svc_conf_file = ACE_TEXT("multi_prot.conf"); + +int load_advanced_resources = +ACE_Service_Config::process_directive (ace_svc_desc_TAO_Advanced_Resource_Factory); + +CORBA::Short endpoint_port = 12345; +int verbose = 0; + +enum HostNameForm + { + from_hostname, + use_localhost, + use_defaulted, + multi_protocol + }; + +const ACE_TCHAR *form_arg; + +HostNameForm host_form = from_hostname; + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + for (int c = 1; c < argc; c++) { + if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-g")) == 0) + { + good_ior_file = argv[++c]; + } + else if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-b")) == 0) + { + bad_ior_file = argv[++c]; + } + else if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-c")) == 0) + { + svc_conf_file = argv[++c]; + } + else if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-p")) == 0) + { + endpoint_port = ACE_OS::atoi (argv[++c]); + } + else if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-v")) == 0) + { + verbose = 1; + } + else if (ACE_OS::strcasecmp (argv[c], ACE_TEXT ("-h")) == 0) + { + ++c; + if (c == argc) + ACE_ERROR_RETURN ((LM_ERROR, + "host form option requires an argument\n"),-1); + form_arg = argv[c]; + if (ACE_OS::strcasecmp (form_arg, ACE_TEXT ("local")) == 0) + host_form = use_localhost; + else if (ACE_OS::strcasecmp (form_arg, ACE_TEXT ("default")) == 0) + host_form = use_defaulted; + else if (ACE_OS::strcasecmp (form_arg, ACE_TEXT ("multi")) == 0) + host_form = multi_protocol; + else + ACE_ERROR_RETURN ((LM_ERROR, + "invalid host form arg, '%s'\n", form_arg), -1); + } + else if (ACE_OS::strstr (argv[c], ACE_TEXT ("-ORB")) == argv[c]) + { + c++; + continue; + } + else + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-g <goodiorfile> " + "-b <badiorfile> " + "-p <port> " + "-v " + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +make_ior (CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + Hello * servant, + const ACE_TCHAR *ior_file) +{ + CORBA::String_var poa_name = poa->the_name(); + ACE_DEBUG ((LM_DEBUG, "Creating IOR from %C\n", poa_name.in())); + + PortableServer::ObjectId_var oid = poa->activate_object (servant); + CORBA::Object_var o = poa->id_to_reference (oid.in ()); + + + if (host_form == from_hostname || host_form == use_localhost) + { + CORBA::String_var ior = + orb->object_to_string (o.in ()); + + FILE *output_file= ACE_OS::fopen (ior_file, "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file %s for writing IOR: %C", + ior_file, + ior.in ()), + 1); + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + } + return 0; +} + + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + CORBA::ORB_var orb; + CORBA::Object_var obj; + PortableServer::POA_var root_poa; + PortableServer::POAManagerFactory_var poa_manager_factory; + + if (parse_args (argc, argv) != 0) + return 1; + + const ACE_TCHAR *e1_format= ACE_TEXT ("iiop://%s:%d"); + const ACE_TCHAR *e2_format= ACE_TEXT ("iiop://%s:%d/hostname_in_ior=unreachable"); + ACE_TCHAR hostname[256]; + int num_extra = 4; + + switch (host_form) + { + case from_hostname: + ACE_OS::hostname (hostname, sizeof(hostname) / sizeof (ACE_TCHAR)); + break; + + case use_localhost: + ACE_OS::strcpy (hostname, ACE_TEXT ("localhost")); + break; + + case use_defaulted: + hostname[0] = ACE_TEXT ('\0'); + break; + + case multi_protocol: + hostname[0] = ACE_TEXT ('\0'); + e2_format = ACE_TEXT ("diop://"); + num_extra = 6; + break; + } + + size_t hostname_len = ACE_OS::strlen (hostname); + size_t e1_len = ACE_OS::strlen (e1_format) + 5; // 5 for the port# + size_t e2_len = ACE_OS::strlen (e2_format) + 5; + ACE_TCHAR **extra = 0; + ACE_NEW_RETURN (extra, ACE_TCHAR *[num_extra], -1); + + extra[0] = ACE::strnew (ACE_TEXT ("-ORBEndpoint")); + ACE_NEW_RETURN (extra[1], + ACE_TCHAR[e1_len + hostname_len + 1], + -1); + ACE_OS::sprintf (extra[1], e1_format, hostname, endpoint_port); + extra[2] = ACE::strnew (ACE_TEXT ("-ORBEndpoint")); + ACE_NEW_RETURN (extra[3], + ACE_TCHAR[e2_len + hostname_len + 1], + -1); + ACE_OS::sprintf (extra[3], e2_format, hostname, endpoint_port+1); + if (host_form == multi_protocol) + { + extra[4] = ACE::strnew (ACE_TEXT ("-ORBSvcConf")); + extra[5] = ACE::strnew (svc_conf_file); + } + + ACE_TCHAR **largv = new ACE_TCHAR *[argc+num_extra]; + int i = 0; + for (i = 0; i < argc; i++) + largv[i] = argv[i]; + + ACE_DEBUG ((LM_DEBUG,"server adding args: ")); + for (i = 0; i < num_extra; i++) + { + ACE_DEBUG ((LM_DEBUG, "%s ", extra[i])); + largv[argc+i] = extra[i]; + } + ACE_DEBUG ((LM_DEBUG, "\n")); + + argc += num_extra; + + try + { + orb = + CORBA::ORB_init (argc, largv, "EndpointPolicy"); + + obj = + orb->resolve_initial_references("RootPOA"); + + root_poa = + PortableServer::POA::_narrow (obj.in ()); + + if (CORBA::is_nil (root_poa.in ())) + ACE_ERROR_RETURN ((LM_ERROR, + " (%P|%t) Panic: nil RootPOA\n"), + 1); + + poa_manager_factory + = root_poa->the_POAManagerFactory (); + } + catch (CORBA::Exception &ex) + { + ex._tao_print_exception("initialization error "); + return 1; + } + + for (i = 0; i < num_extra; i++) + ACE::strdelete (extra[i]); + delete [] extra; + delete [] largv; + + //----------------------------------------------------------------------- + + // Create two valid endpoint policies. One to match each of the generated + // endpoint arguments supplied to ORB_init(). + PortableServer::POAManager_var good_pm; + PortableServer::POAManager_var bad_pm; + CORBA::PolicyList policies; + policies.length (1); + + EndpointPolicy::EndpointList list; + list.length (1); + list[0] = new IIOPEndpointValue_i (ACE_TEXT_ALWAYS_CHAR (hostname), endpoint_port); + + try + { + CORBA::Any policy_value; + policy_value <<= list; + policies[0] = orb->create_policy (EndpointPolicy::ENDPOINT_POLICY_TYPE, + policy_value); + good_pm = poa_manager_factory->create_POAManager ("goodPOAManager", + policies); + + if (host_form == use_defaulted) + { + ACE_ERROR_RETURN ((LM_DEBUG, + "ERROR: Expected to catch policy error with " + "defaulted hostname, but didn't.\n"),1); + } + } + catch (CORBA::PolicyError &) + { + if (host_form == use_defaulted) + { + ACE_ERROR_RETURN ((LM_DEBUG, + "Defaulted hostname properly rejected\n"), 0); + } + ACE_ERROR_RETURN ((LM_DEBUG, + "ERROR: Unexpectedly caught PolicyError " + "exception host_form = %s\n", form_arg), 1); + } + catch (CORBA::Exception &ex) + { + ex._tao_print_exception ("Failed to create reachable POA manager"); + return 1; + } + + list[0] = new IIOPEndpointValue_i("unreachable", endpoint_port+1); + try + { + CORBA::Any policy_value; + policy_value <<= list; + policies[0] = orb->create_policy (EndpointPolicy::ENDPOINT_POLICY_TYPE, + policy_value); + bad_pm = poa_manager_factory->create_POAManager ("badPOAManager", + policies); + } + catch (CORBA::Exception &ex) + { + ex._tao_print_exception ("Failed to create unreachable POA manager"); + return 1; + } + + try + { + + Hello *hello_impl; + ACE_NEW_RETURN (hello_impl, + Hello (orb.in ()), + 1); + PortableServer::ServantBase_var owner_transfer(hello_impl); + + // Create poas assiciated with the each the good poa manager and the + // bad poa manager. + policies.length(0); + PortableServer::POA_var good_poa = + root_poa->create_POA ("goodPOA", + good_pm.in (), + policies); + + int result = 0; + result = make_ior (orb.in(), root_poa.in(), hello_impl, root_ior_file); + if (result != 0) + return result; + + result = make_ior (orb.in(), good_poa.in(), hello_impl, good_ior_file); + if (result != 0) + return result; + + good_pm->activate (); + + PortableServer::POA_var bad_poa; + + if (host_form != multi_protocol) + { + bad_poa = + root_poa->create_POA ("badPOA", + bad_pm.in (), + policies); + result = make_ior (orb.in(), bad_poa.in(), hello_impl, bad_ior_file); + if (result != 0) + return result; + + bad_pm->activate (); + } + + if (host_form == from_hostname || host_form == use_localhost) + { + orb->run (); + ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - event loop finished\n")); + } + } + catch (CORBA::Exception &ex) + { + ex._tao_print_exception ("cannot run server"); + } + root_poa->destroy (1, 1); + + orb->destroy (); + + return 0; +} |