summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp')
-rw-r--r--ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp b/ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp
new file mode 100644
index 00000000000..496a3d40a98
--- /dev/null
+++ b/ACE/TAO/orbsvcs/tests/FaultTolerance/GroupRef_Manipulation/Server_Request_Interceptor.cpp
@@ -0,0 +1,196 @@
+// -*- C++ -*-
+
+#include "Server_Request_Interceptor.h"
+#include "orbsvcs/FT_CORBA_ORBC.h"
+#include "tao/PI_Server/PI_Server.h"
+#include "tao/ORB_Constants.h"
+#include "tao/CDR.h"
+#include "testS.h"
+
+ACE_RCSID (ForwardRequest,
+ Server_Request_Interceptor,
+ "$Id$")
+
+static const CORBA::ULong expected_version = 5;
+
+Server_Request_Interceptor::Server_Request_Interceptor (void)
+ : request_count_ (0)
+ , forward_request_thrown_ (false)
+{
+ this->obj_[0] = CORBA::Object::_nil ();
+ this->obj_[1] = CORBA::Object::_nil ();
+}
+
+Server_Request_Interceptor::~Server_Request_Interceptor (void)
+{
+}
+
+void
+Server_Request_Interceptor::reset ()
+{
+ this->request_count_ = 0;
+ this->forward_request_thrown_ = false;
+}
+
+void
+Server_Request_Interceptor::forward_references (
+ CORBA::Object_ptr obj1,
+ CORBA::Object_ptr obj2)
+{
+ if (CORBA::is_nil (obj1) || CORBA::is_nil (obj2))
+ throw CORBA::INV_OBJREF (
+ CORBA::SystemException::_tao_minor_code (
+ TAO::VMCID,
+ EINVAL),
+ CORBA::COMPLETED_NO);
+
+ ACE_TCHAR *argv[] = {NULL};
+ int argc = 0;
+
+ // Fetch the ORB having been initialized in main()
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "Server ORB");
+
+ CORBA::String_var str1 = orb->object_to_string (obj1);
+
+ CORBA::String_var str2 = orb->object_to_string (obj2);
+
+ this->obj_[0] = orb->string_to_object (str1.in ());
+ this->obj_[1] = orb->string_to_object (str2.in ());
+}
+
+char *
+Server_Request_Interceptor::name (void)
+{
+ return CORBA::string_dup ("Server_Request_Interceptor");
+}
+
+void
+Server_Request_Interceptor::destroy (void)
+{
+ CORBA::release (this->obj_[0]);
+ CORBA::release (this->obj_[1]);
+}
+
+void
+Server_Request_Interceptor::receive_request_service_contexts (
+ PortableInterceptor::ServerRequestInfo_ptr ri)
+{
+ this->request_count_++;
+
+/* ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) receive_request_service_context called [%d] times\n",
+ this->request_count_));
+ */
+
+ if (this->forward_request_thrown_ == true)
+ {
+ IOP::ServiceContext_var svc =
+ ri->get_request_service_context (IOP::FT_GROUP_VERSION);
+
+ // extract the group component
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (svc->context_data.get_buffer ()),
+ svc->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ {
+ return;
+ }
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::TagFTGroupTaggedComponent group_component;
+
+ //cdr >> group_component.component_version;
+ //cdr >> group_component.group_domain_id.inout ();
+ //cdr >> group_component.object_group_id;
+ cdr >> group_component.object_group_ref_version;
+
+ if (group_component.object_group_ref_version != expected_version)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: (%P|%t) Version does not match the"
+ "expected value (%u != %u)\n",
+ group_component.object_group_ref_version,
+ expected_version));
+ }
+
+ }
+}
+
+void
+Server_Request_Interceptor::receive_request (
+ PortableInterceptor::ServerRequestInfo_ptr ri)
+{
+ if (this->request_count_ == 8)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "SERVER (%P|%t) Request %d will be forwarded "
+ "to object 1\n" // "object 1" as in "obj_[0]"
+ "SERVER (%P|%t) via "
+ "receive_request_service_contexts().\n",
+ this->request_count_));
+
+ this->forward_request_thrown_ = true;
+
+ // Throw forward exception
+ throw PortableInterceptor::ForwardRequest (this->obj_[1]);
+ }
+
+ if (this->forward_request_thrown_ == true)
+ {
+ IOP::ServiceContext_var svc =
+ ri->get_request_service_context (IOP::FT_GROUP_VERSION);
+
+ // extract the group component
+ TAO_InputCDR cdr (reinterpret_cast<const char*> (svc->context_data.get_buffer ()),
+ svc->context_data.length ());
+
+ CORBA::Boolean byte_order;
+
+ if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
+ {
+ return;
+ }
+
+ cdr.reset_byte_order (static_cast<int> (byte_order));
+
+ FT::TagFTGroupTaggedComponent group_component;
+
+ //cdr >> group_component.component_version;
+ //cdr >> group_component.group_domain_id.inout ();
+ //cdr >> group_component.object_group_id;
+ cdr >> group_component.object_group_ref_version;
+
+ if (group_component.object_group_ref_version != expected_version)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: (%P|%t) Version does not match the "
+ "expected value (%u != %u)\n",
+ group_component.object_group_ref_version,
+ expected_version));
+ }
+
+ }
+ return;
+}
+
+void
+Server_Request_Interceptor::send_reply (
+ PortableInterceptor::ServerRequestInfo_ptr)
+{
+}
+
+void
+Server_Request_Interceptor::send_exception (
+ PortableInterceptor::ServerRequestInfo_ptr)
+{
+}
+
+void
+Server_Request_Interceptor::send_other (
+ PortableInterceptor::ServerRequestInfo_ptr)
+{
+}