summaryrefslogtreecommitdiff
path: root/CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp')
-rw-r--r--CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp1296
1 files changed, 0 insertions, 1296 deletions
diff --git a/CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp b/CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp
deleted file mode 100644
index c08860fd370..00000000000
--- a/CIAO/ciao/Deployment/Handlers/Connection_Handler.cpp
+++ /dev/null
@@ -1,1296 +0,0 @@
-#include "Connection_Handler.h"
-#include "ciao/Logger/Log_Macros.h"
-#include "dance/Deployment/Deployment_InvalidConnectionC.h"
-#include "CIAO_State.h"
-
-namespace CIAO
-{
- const char * kind_as_string (const ::Deployment::CCMComponentPortKind & kind)
- {
-#define DEPLOYMENT_KIND_AS_STRING(X) case X: return #X
- switch (kind)
- {
- DEPLOYMENT_KIND_AS_STRING (Deployment::Facet);
- DEPLOYMENT_KIND_AS_STRING (Deployment::SimplexReceptacle);
- DEPLOYMENT_KIND_AS_STRING (Deployment::MultiplexReceptacle);
- DEPLOYMENT_KIND_AS_STRING (Deployment::EventEmitter);
- DEPLOYMENT_KIND_AS_STRING (Deployment::EventPublisher);
- DEPLOYMENT_KIND_AS_STRING (Deployment::EventConsumer);
- DEPLOYMENT_KIND_AS_STRING (Deployment::ExtendedPort);
- DEPLOYMENT_KIND_AS_STRING (Deployment::MirrorPort);
- }
- return "***Unknown enum value, deployment kind as string";
-#undef DEPLOYMENT_KIND_AS_STRING
- }
-
- void
- Connection_Handler::provide_endpoint_reference (const ::Deployment::DeploymentPlan & plan,
- ::CORBA::ULong connectionRef,
- ::CORBA::Any_out endpoint_reference)
- {
- CIAO_TRACE ("Component_Handler_i::provide_endpoint_reference");
-
- const ::Deployment::PlanConnectionDescription &conn =
- plan.connection[connectionRef];
-
- try
- {
- CIAO_DEBUG (9, (LM_TRACE, CLINFO
- "Connection_Handler::provide_endpoint_reference - "
- "Called for connection <%C>\n",
- conn.name.in ()));
-
- for (CORBA::ULong i = 0;
- i < conn.internalEndpoint.length ();
- ++i)
- {
- if (conn.internalEndpoint[i].provider)
- {
- CORBA::Any *out;
- CORBA::Object_var ref;
- CORBA::ULong instanceRef = conn.internalEndpoint[i].instanceRef;
- Components::CCMObject_var comp =
- DEPLOYMENT_STATE::instance ()->
- fetch_component (plan.instance[instanceRef].name.in ());
-
- if (CORBA::is_nil (comp.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::provide_endpoint_reference - "
- "Nil component reference from CIAO_State for <%C>\n",
- plan.instance[instanceRef].name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Component instance not deployed when "
- "gathering connections.");
- }
-
- ACE_NEW_THROW_EX (out,
- CORBA::Any (),
- CORBA::NO_MEMORY ());
-
- endpoint_reference = out;
-
- if (this->is_local_connection (conn))
- {
- (*out) <<= comp.in ();
- }
- else
- {
- switch (conn.internalEndpoint[i].kind)
- {
- case ::Deployment::Facet:
- ref =
- comp->provide_facet (conn.internalEndpoint[i].portName.in ());
- (*out) <<= ref.in ();
- break;
-#if !defined (CCM_NOEVENT)
- case ::Deployment::EventConsumer:
- ref =
- comp->get_consumer (conn.internalEndpoint[i].portName.in ());
- (*out) <<= ref.in ();
- break;
-#endif
- default:
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Invalid provider port type.");
- };
- }
- return;
- }
- }
- }
- catch (const ::Deployment::InvalidConnection &)
- {
- // pass through
- throw;
- }
- catch (const CORBA::Exception &ex)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::provide_endpoint_reference - "
- "Caught CORBA Exception <%C> while fetching reference for "
- "connection <%C>\n",
- ex._info ().c_str (),
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
-
- }
- catch (...)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::provide_endpoint_reference - "
- "Caught unknown C++ exception on instance %C",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unknown C++ exception whilst establishing "
- "connection");
- }
-
- }
-
- void
- Connection_Handler::connect_instance (const ::Deployment::DeploymentPlan & plan,
- ::CORBA::ULong c_id,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Connection_Handler::connect_instance");
-
- const ::Deployment::PlanConnectionDescription &conn =
- plan.connection[c_id];
-
- CORBA::ULong endpointRef = this->retrieve_endpoint (conn);
-
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint =
- conn.internalEndpoint[endpointRef];
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_instance - "
- "Connecting %C connection <%C> on instance <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
- try
- {
- switch (conn.internalEndpoint[endpointRef].kind)
- {
-
- case Deployment::Facet:
-
- if (this->is_local_connection (conn))
- {
- this->connect_local_port (plan, conn, endpointRef, endpoint);
- }
- else
- {
- this->connect_non_local_facet (plan,
- conn,
- endpoint,
- provided_reference);
- }
- break;
-
- case Deployment::SimplexReceptacle:
- case Deployment::MultiplexReceptacle:
-
- if (this->is_local_connection (conn))
- {
- this->connect_local_port (plan, conn, endpointRef, endpoint);
- }
- else
- {
- this->connect_non_local_receptacle (plan,
- conn,
- endpoint,
- provided_reference);
- }
- break;
-
-#if !defined (CCM_NOEVENT)
- case Deployment::EventConsumer:
- this->connect_consumer (plan, conn, endpoint, provided_reference);
- break;
-
- case Deployment::EventEmitter:
- this->connect_emitter (plan, conn, endpoint, provided_reference);
- break;
-
- case Deployment::EventPublisher:
- this->connect_publisher (plan, conn, endpoint, provided_reference);
- break;
-#endif
- default:
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_instance - "
- "Unsupported port type.\n"));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unsupported port type");
-
- }
- }
- catch (const ::Deployment::InvalidConnection &ex)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_instance - "
- "Caught InvalidConnection exception whilst "
- "connecting %C connection <%C>: %C. Reason: %C\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in (),
- ex.name.in (),
- ex.reason.in ()));
-
- throw;
- }
- catch (const CORBA::Exception &ex)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_instance - "
- "Caught CORBA exception whilst connecting %C connection <%C>: %C\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in (),
- ex._info ().c_str ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
- }
- catch (...)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_instance - "
- "Caught C++ exception whilst connecting %C connection <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unknown C++ Exception");
- }
- }
-
- void
- Connection_Handler::disconnect_instance (const ::Deployment::DeploymentPlan &plan,
- ::CORBA::ULong c_id)
- {
- CIAO_TRACE ("Connection_Handler::disconnect_instance");
-
- const ::Deployment::PlanConnectionDescription &conn =
- plan.connection[c_id];
-
- CORBA::ULong endpointRef = this->retrieve_endpoint (conn);
-
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint =
- conn.internalEndpoint[endpointRef];
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Disconnecting %C connection <%C> on instance <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
-
- try
- {
- switch (conn.internalEndpoint[endpointRef].kind)
- {
- case Deployment::Facet:
-
- if (this->is_local_connection (conn))
- {
- this->disconnect_local_port (plan, conn, endpointRef, endpoint);
- }
- else
- {
- //only because the receptacle is an external endpoint
- this->disconnect_non_local (conn, conn.externalReference[0].portName.in ());
- }
- break;
-
- case Deployment::SimplexReceptacle:
- case Deployment::MultiplexReceptacle:
-
- if (this->is_local_connection (conn))
- {
- this->disconnect_local_port (plan, conn, endpointRef, endpoint);
- }
- else
- {
- this->disconnect_non_local (conn, endpoint.portName.in ());
- }
- break;
-#if !defined (CCM_NOEVENT)
- case Deployment::EventConsumer:
- this->disconnect_consumer (conn, endpoint);
- break;
-
- case Deployment::EventEmitter:
- this->disconnect_emitter (conn, endpoint);
- break;
-
- case Deployment::EventPublisher:
- this->disconnect_publisher (conn, endpoint);
- break;
-#endif
- default:
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Unsupported port type.\n"));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unsupported port type");
-
- }
- }
- catch (const ::Deployment::InvalidConnection &)
- {
- // pass through
- throw;
- }
- // Since DANCE shuts down the Locality managers simultaneously,
- // it could be that one locality manager is shutdown while the
- // other wants to disconnect from this locality manager. Therefor
- // we catch an OBJECT_NOT_EXIST, TRANSIENT and a COMM_FAILURE at this point
- // Once DANCE has been fixed in that manner, these catches can be removed.
- catch (const CORBA::COMM_FAILURE &ex)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Caught COMM_FAILURE exception whilst disconnecting %C connection <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
- }
- catch (const CORBA::OBJECT_NOT_EXIST &ex)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Caught OBJECT_NOT_EXIST exception whilst disconnecting %C connection <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
- }
- catch (const CORBA::TRANSIENT &ex)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Caught TRANSIENT exception whilst disconnecting %C connection <%C>\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
- }
- catch (const CORBA::Exception &ex)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Caught CORBA exception whilst disconnecting %C connection <%C>: %C\n",
- CIAO::kind_as_string (conn.internalEndpoint[endpointRef].kind),
- conn.name.in (),
- ex._info ().c_str ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- ex._info ().c_str ());
- }
- catch (...)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::disconnect_instance - "
- "Caught C++ exception whilst disconnecting <%C>\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unknown C++ Exception");
- }
- }
-
- void
- Connection_Handler::connect_non_local_facet (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Connection_Handler::connect_non_local_facet");
-
-
- // provided_reference is a receptacle. We need to call 'connect' on this reference
- // and pass the facet.
- if (conn.externalReference.length () == 0)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_facet - "
- "Error: Expected external reference endpoint for connection <%C>",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Expected external reference connection.");
- }
-
- ::CORBA::Object_var obj;
- provided_reference >>= CORBA::Any::to_object (obj);
-
- ::Components::CCMObject_var provided = ::Components::CCMObject::_narrow (obj.in ());
-
- if (CORBA::is_nil (provided))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_facet - "
- "While connecting <%C>:"
- "Provided reference for connection where primary is Facet must be "
- "non-nil.\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Provided reference for connection where primary is Facet must "
- "be non-nil.");
-
- }
-
- ::Components::CCMObject_var facet_provider =
- DEPLOYMENT_STATE::instance ()->fetch_component (plan.instance[endpoint.instanceRef].name.in ());
-
- if (CORBA::is_nil (facet_provider))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_facet - "
- "While connecting <%C>:"
- "Providing component not deployed.",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Providing component not deployed.");
- }
-
- CORBA::Object_var facet =
- facet_provider->provide_facet (endpoint.portName.in ());
-
- ::Components::Cookie_var cookie = provided->connect (conn.externalReference[0].portName.in (),
- facet.in ());
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), facet.in ());
-#endif
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_non_local_facet - "
- "Connection <%C> successfully established.\n",
- conn.name.in ()));
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (cookie._retn (),
- ::Components::CCMObject::_duplicate (provided.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-
- void
- Connection_Handler::connect_non_local_receptacle (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Component_Handler_i::connect_non_local_receptacle");
-
- //provided_reference is a facet. We need to pass this reference to the receptacle, using the connect method
-
- ::CORBA::Object_var provided;
-
- if (!(provided_reference >>= CORBA::Any::to_object (provided)))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_receptacle - "
- "Unable to extract provided reference to CORBA::Object\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to CORBA Object.");
- }
-
- if (conn.externalReference.length () != 0)
- {
- if (ACE_OS::strlen (conn.externalReference[0].portName.in ()) > 0)
- {
- ::Components::CCMObject_var facet_provider =
- ::Components::CCMObject::_narrow (provided.in ());
-
- if (CORBA::is_nil (facet_provider.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_receptacle - "
- "Unable to narrow provided external reference "
- "to CCMObject in connection <%C> for port <%C>\n",
- conn.name.in (),
- conn.externalReference[0].portName.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to narrow external reference to CCMObject\n");
- }
-
- provided =
- facet_provider->provide_facet (conn.externalReference[0].portName.in ());
- }
- }
-
- ::Components::CCMObject_var receptacle =
- DEPLOYMENT_STATE::instance ()->fetch_component (plan.instance[endpoint.instanceRef].name.in ());
-
- if (CORBA::is_nil (receptacle.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_non_local_receptacle - "
- "While connecting <%C>:"
- "Receptacle component <%C> not deployed.\n",
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Receptacle component not deployed.");
- }
-
- ::Components::Cookie_var cookie = receptacle->connect (endpoint.portName.in (),
- provided.in ());
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), provided.in ());
-#endif
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_non_local_receptacle - "
- "Connection <%C> successfully established.\n",
- conn.name.in ()));
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (cookie._retn (),
- ::Components::CCMObject::_duplicate (receptacle.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::connect_publisher (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Connection_Handler::connect_publisher");
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_publisher - "
- "Connecting connection <%C> on instance <%C>\n",
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
-
- ::CORBA::Object_var provided;
-
- if (!(provided_reference >>= CORBA::Any::to_object (provided)) ||
- CORBA::is_nil (provided.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_publisher - "
- "Unable to extract provided reference to CORBA::Object\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to CORBA Object.");
- }
-
- Components::EventConsumerBase_var event;
- if (conn.externalReference.length () == 0)
- {
- event = Components::EventConsumerBase::_unchecked_narrow (provided);
- }
- else
- {
- ::Components::CCMObject_var consumer = ::Components::CCMObject::_narrow (provided.in ());
-
- if (CORBA::is_nil (consumer.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_publisher - "
- "Unable to extract provided reference to Components::CCMObject\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to "
- "Components::CCMObject.");
- }
- ::CORBA::Object_var event_obj = consumer->get_consumer (conn.externalReference[0].portName.in ());
- event = ::Components::EventConsumerBase::_narrow (event_obj.in ());
- }
-
- if (CORBA::is_nil (event.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_publisher - "
- "Unable to extract provided reference to "
- "Components::EventConsumerBase\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to "
- "Components::EventConsumerBase.");
- }
-
- ::Components::CCMObject_var publisher =
- DEPLOYMENT_STATE::instance ()->fetch_component (plan.instance[endpoint.instanceRef].name.in ());
-
- if (CORBA::is_nil (publisher))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_publisher - "
- "While connecting <%C>:"
- "Publishing component not deployed.",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Publisher component not deployed.");
- }
- Components::Cookie_var cookie = publisher->subscribe (endpoint.portName.in (),
- event.in ());
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), publisher.in());
-#endif
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_publisher - "
- "Connection <%C> successfully established.\n",
- conn.name.in ()));
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (cookie._retn (),
- ::Components::CCMObject::_duplicate (publisher.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-#endif
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::connect_consumer (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Connection_Handler::connect_consumer");
-
- // provided_reference is an emitter or a publisher.
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_consumer - "
- "Connecting connection <%C> on instance <%C>\n",
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
-
- if (conn.externalReference.length () == 0)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_consumer - "
- "Error: Expected external reference endpoint for connection <%C>",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Expected external reference connection.");
- }
-
- ::CORBA::Object_var obj;
-
- if (!(provided_reference >>= CORBA::Any::to_object (obj)) ||
- CORBA::is_nil (obj.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_consumer - "
- "Unable to extract provided reference to CORBA::Object\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to CORBA Object.");
- }
-
- ::Components::CCMObject_var other_endpoint =
- ::Components::CCMObject::_narrow (obj.in ());
-
- if (::CORBA::is_nil (other_endpoint.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_consumer - "
- "Error: Unable to fetch emitter component for connection <%C>\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to get reference to the emitter.");
- }
-
- //find the consumer.
- ::Components::CCMObject_var consumer_provider =
- DEPLOYMENT_STATE::instance ()->fetch_component (plan.instance[endpoint.instanceRef].name.in ());
-
- if (CORBA::is_nil (consumer_provider))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_consumer - "
- "While connecting <%C>:"
- "Providing component not deployed.",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Providing component not deployed.");
- }
-
- CORBA::Object_var consumer =
- consumer_provider->get_consumer (endpoint.portName.in ());
-
- ::Components::EventConsumerBase_var event = ::Components::EventConsumerBase::_narrow (consumer.in ());
-
- //assume it's an emitter.
- ::Components::Cookie_var cookie;
- try
- {
- other_endpoint->connect_consumer (conn.externalReference[0].portName.in (),
- event.in ());
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_consumer - "
- "Succesfully connected to %C\n",
- conn.externalReference[0].portName.in ()));
- }
- catch (const ::Components::InvalidName &)
- {
- // we now assume it's a publisher
- cookie = other_endpoint->subscribe (conn.externalReference[0].portName.in (),
- event.in ());
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_consumer - "
- "Succesfully subscribed to %C\n",
- conn.externalReference[0].portName.in ()));
- }
-
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), event.in());
-#endif
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_consumer - "
- "Connection <%C> successfully established.\n",
- conn.name.in ()));
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (cookie._retn (),
- ::Components::CCMObject::_duplicate (other_endpoint.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-#endif
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::connect_emitter (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint,
- const ::CORBA::Any & provided_reference)
- {
- CIAO_TRACE ("Connection_Handler::connect_emitter");
-
- // provided_reference is a consumer.
- // We need to pass this to the emitter, using the connect_consumer
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_emitter - "
- "Connecting connection <%C> on instance <%C>\n",
- conn.name.in (),
- plan.instance[endpoint.instanceRef].name.in ()));
-
- ::CORBA::Object_var consumer;
-
- if (!(provided_reference >>= CORBA::Any::to_object (consumer)) ||
- CORBA::is_nil (consumer.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_emitter - "
- "Unable to extract provided reference to CORBA::Object\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Unable to extract provided reference to CORBA Object.");
- }
- Components::EventConsumerBase_var event =
- Components::EventConsumerBase::_unchecked_narrow (consumer);
-
- ::Components::CCMObject_var emitter =
- DEPLOYMENT_STATE::instance ()->fetch_component (plan.instance[endpoint.instanceRef].name.in ());
-
- if (CORBA::is_nil (emitter))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_emitter - "
- "While connecting <%C>:"
- "Emitting component not deployed.",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Emitting component not deployed.");
- }
-
- if (CORBA::is_nil (event))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_emitter - "
- "While connecting <%C>:"
- "Consuming component not deployed.",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Consumer component not deployed.");
- }
-
- emitter->connect_consumer (endpoint.portName.in (),
- event.in ());
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), emitter.in());
-#endif
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_emitter - "
- "Connection <%C> successfully established.\n",
- conn.name.in ()));
-
- ::Components::Cookie_var nil_cookie;
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (nil_cookie._retn (),
- ::Components::CCMObject::_duplicate (emitter.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-#endif
-
- void
- Connection_Handler::disconnect_non_local (const ::Deployment::PlanConnectionDescription &conn,
- const char * port_name)
- {
- CIAO_TRACE ("Connection_Handler::disconnect_non_local");
-
- ::Components::CCMObject_var obj = this->get_ccm_object (conn.name.in ());
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::disconnect_non_local - "
- "About to disconnect <%C>\n",
- conn.name.in()));
- ::CORBA::Object_var safe_tmp =
- obj->disconnect (port_name,
- this->get_cookie (conn.name.in ()));
-
- this->remove_cookie (conn.name.in ());
- }
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::disconnect_publisher (const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint)
-
- {
- CIAO_TRACE ("Connection_Handler::disconnect_publisher");
-
- ::Components::CCMObject_var obj = this->get_ccm_object (conn.name.in ());
-
- ::Components::EventConsumerBase_var safe_temp =
- obj->unsubscribe (endpoint.portName.in (),
- this->get_cookie (conn.name.in ()));
- this->remove_cookie (conn.name.in ());
- }
-#endif
-
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::disconnect_consumer (const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint)
-
- {
- CIAO_TRACE ("Connection_Handler::disconnect_consumer");
-
- ::Components::CCMObject_var obj = this->get_ccm_object (conn.name.in ());
-
- ::Components::EventConsumerBase_var safe_temp;
- try
- {
- const char * name (0);
- if (conn.externalReference[0].provider)
- { // determine the port name of the publisher or emitter.
- name = endpoint.portName.in ();
- }
- else
- {
- name = conn.externalReference[0].portName.in ();
- }
- if (this->get_cookie (conn.name.in ()) == 0)
- { //emitter
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::disconnect_consumer - "
- "Disconnecting %C on the emitter.\n",
- name));
- safe_temp = obj->disconnect_consumer (name);
- }
- else
- { //publisher
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::disconnect_consumer - "
- "Disconnecting %C on the publisher.\n",
- name));
- safe_temp = obj->unsubscribe (name, this->get_cookie (conn.name.in ()));
- }
- }
- // it could be that the emmitter or publisher is already shut down. In that
- // case we got a COMM_FAILURE or a TRANSIENT exception.
- catch (const ::CORBA::OBJECT_NOT_EXIST &)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_consumer - "
- "Caught OBJECT_NOT_EXIST exception during disconnecting %C\n",
- conn.name.in ()));
- }
- catch (const ::CORBA::COMM_FAILURE &)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_consumer - "
- "Caught COMM_FAILURE exception during disconnecting %C\n",
- conn.name.in ()));
- }
- catch (const ::CORBA::TRANSIENT &)
- {
- CIAO_DEBUG (2, (LM_WARNING, CLINFO
- "Connection_Handler::disconnect_consumer - "
- "Caught TRANSIENT exception during disconnecting %C\n",
- conn.name.in ()));
- }
- catch (const ::CORBA::Exception &ex)
- {
- ex._tao_print_exception ("Connection_Handler::disconnect_consumer");
- }
- // still need to remove the cookie.
- this->remove_cookie (conn.name.in ());
- }
-#endif
-
-#if !defined (CCM_NOEVENT)
- void
- Connection_Handler::disconnect_emitter (const ::Deployment::PlanConnectionDescription &conn,
- const ::Deployment::PlanSubcomponentPortEndpoint &endpoint)
-
- {
- CIAO_TRACE ("Connection_Handler::disconnect_emitter");
- ::Components::CCMObject_var obj = this->get_ccm_object (conn.name.in ());
- obj->disconnect_consumer (endpoint.portName.in ());
- this->remove_cookie (conn.name.in ());
- }
-#endif
-
- void
- Connection_Handler::connect_local_port (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- ::CORBA::ULong endpointRef,
- const ::Deployment::PlanSubcomponentPortEndpoint &receptacle_endpoint)
- {
- CIAO_TRACE ("Connection_Handler::connect_local_port");
-
-
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO
- "Connection_Handler::connect_local_port - "
- "Connecting connection <%C> on instance <%C>\n",
- conn.name.in (),
- plan.instance[receptacle_endpoint.instanceRef].name.in ()));
-
- CORBA::ULong facet_endpointRef = (endpointRef + 1) % 2;
- if (conn.internalEndpoint.length () != 2 ||
- conn.internalEndpoint[facet_endpointRef].kind != ::Deployment::Facet)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_local_port - "
- "Error: Wrong number of internal endpoints for local connection: "
- "expected <2> - found <%d>\n",
- conn.internalEndpoint.length ()));
-
- throw ::Deployment::InvalidConnection (conn.name.in (),
- " Local connections require exactly 2 internalEndpoints");
- }
-
- const ::Deployment::PlanSubcomponentPortEndpoint &facet_endpoint =
- conn.internalEndpoint[facet_endpointRef];
-
- const char *facet_cont =
- DEPLOYMENT_STATE::instance ()->instance_to_container (
- plan.instance[facet_endpoint.instanceRef].name.in ());
- const char *recep_cont =
- DEPLOYMENT_STATE::instance ()->instance_to_container (
- plan.instance[receptacle_endpoint.instanceRef].name.in ());
-
- if (facet_cont && recep_cont &&
- ACE_OS::strcmp (facet_cont, recep_cont) != 0)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::connect_local_port - "
- "Ports <%C> and <%C> participate in local connection, "
- "but are installed in differing containers <%C> and <%C>\n",
- plan.instance[facet_endpoint.instanceRef].name.in (),
- plan.instance[receptacle_endpoint.instanceRef].name.in (),
- facet_cont,
- recep_cont));
- throw ::Deployment::InvalidConnection (plan.instance[facet_endpoint.instanceRef].name.in (),
- "Component instance participates in a local connection with "
- "a non-local entity.");
- }
-
- CIAO::Container_var cont =
- DEPLOYMENT_STATE::instance ()->fetch_container (facet_cont);
-
- Components::CCMObject_var
- facet = DEPLOYMENT_STATE::instance ()->fetch_component (
- plan.instance[facet_endpoint.instanceRef].name.in ()),
- receptacle = DEPLOYMENT_STATE::instance ()->fetch_component (
- plan.instance[receptacle_endpoint.instanceRef].name.in ());
-
- ::Components::Cookie_var cookie = cont->connect_local_facet (facet,
- facet_endpoint.portName.in (),
- receptacle,
- receptacle_endpoint.portName.in ());
-#if defined (CIAO_PRE_ESTABLISH_CONNECTIONS)
- this->validate_connection(conn.name.in (), facet);
-#endif
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::connect_local_port - "
- "Connected local port <%C>:<%C> to <%C>:<%C>\n",
- plan.instance[facet_endpoint.instanceRef].name.in (),
- facet_endpoint.portName.in (),
- plan.instance[receptacle_endpoint.instanceRef].name.in (),
- receptacle_endpoint.portName.in ()));
-
- CONNECTION_INFO conn_info = CONNECTION_INFO (cookie._retn (),
- ::Components::CCMObject::_duplicate (receptacle.in ()));
- this->insert_cookie (conn.name.in (), conn_info);
- }
-
- void
- Connection_Handler::disconnect_local_port (const ::Deployment::DeploymentPlan & plan,
- const ::Deployment::PlanConnectionDescription &conn,
- ::CORBA::ULong endpointRef,
- const ::Deployment::PlanSubcomponentPortEndpoint &receptacle_endpoint)
- {
- CIAO_TRACE ("Connection_Handler::disconnect_local_port");
-
-
- CORBA::ULong facet_endpointRef = (endpointRef + 1) % 2;
- if (conn.internalEndpoint.length () != 2 ||
- conn.internalEndpoint[facet_endpointRef].kind != ::Deployment::Facet)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::disconnect_local_port - "
- "Error: Wrong number of internal endpoints for local "
- "connection: expected <2> - found <%d>\n",
- conn.internalEndpoint.length ()));
-
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "Local connections require exactly 2 "
- "internalEndpoints");
-
- }
- const ::Deployment::PlanSubcomponentPortEndpoint &facet_endpoint =
- conn.internalEndpoint[facet_endpointRef];
-
- const char *facet_cont =
- DEPLOYMENT_STATE::instance ()->instance_to_container (
- plan.instance[facet_endpoint.instanceRef].name.in ());
- const char *recep_cont =
- DEPLOYMENT_STATE::instance ()->instance_to_container (
- plan.instance[receptacle_endpoint.instanceRef].name.in ());
-
- if (facet_cont && recep_cont &&
- ACE_OS::strcmp (facet_cont, recep_cont) != 0)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::disconnect_local_port - "
- "Ports <%C> and <%C> participate in local connection, "
- "but are installed in differing containers <%C> and <%C>\n",
- plan.instance[facet_endpoint.instanceRef].name.in (),
- plan.instance[receptacle_endpoint.instanceRef].name.in (),
- facet_cont,
- recep_cont));
- throw ::Deployment::InvalidConnection (plan.instance[facet_endpoint.instanceRef].name.in (),
- "Component instance participates in a local connection with "
- "a non-local entity.");
- }
-
- CIAO::Container_var cont =
- DEPLOYMENT_STATE::instance ()->fetch_container (facet_cont);
-
- Components::CCMObject_var
- facet = DEPLOYMENT_STATE::instance ()->fetch_component (
- plan.instance[facet_endpoint.instanceRef].name.in ()),
- receptacle = DEPLOYMENT_STATE::instance ()->fetch_component (
- plan.instance[receptacle_endpoint.instanceRef].name.in ());
-
- cont->disconnect_local_facet (
- this->get_cookie (conn.name.in ()),
- facet,
- facet_endpoint.portName.in (),
- receptacle,
- receptacle_endpoint.portName.in ());
-
- this->remove_cookie (conn.name.in ());
-
- CIAO_DEBUG (5, (LM_INFO, CLINFO
- "Connection_Handler::disconnect_local_port - "
- "Disconnected local port <%C>:<%C> to <%C>:<%C>\n",
- plan.instance[facet_endpoint.instanceRef].name.in (),
- facet_endpoint.portName.in (),
- plan.instance[receptacle_endpoint.instanceRef].name.in (),
- receptacle_endpoint.portName.in ()));
- }
-
- void
- Connection_Handler::validate_connection (const char * conn,
- ::CORBA::Object_ptr obj)
- {
- CIAO_TRACE ("Connection_Handler::validate_connection");
- try
- {
- if (!::CORBA::is_nil (obj))
- {
- ::CORBA::PolicyList_var pl;
- if (obj->_validate_connection (pl.out ()))
- {
- CIAO_DEBUG (6, (LM_DEBUG, CLINFO "Connection_Handler::validate_connection - "
- "Succesfully validated connection <%C>. Connection has been pre-established.\n",
- conn));
- }
- else
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO "Connection_Handler::validate_connection - "
- "Failed to pre-establish a connection <%C>.\n",
- conn));
- }
- }
- }
- catch (const ::CORBA::Exception &ex)
- {
- ex._tao_print_exception("Connection_Handler::validate_connection");
- }
- }
-
- bool
- Connection_Handler::is_local_connection (const ::Deployment::PlanConnectionDescription &conn)
- {
- CIAO_TRACE ("Connection_Handler::is_local_connection");
-
- Deployment::Requirements const& deploy_req = conn.deployRequirement;
- for (CORBA::ULong i = 0; i < deploy_req.length (); i++)
- {
- if (ACE_OS::strcmp (deploy_req[i].name, "edu.dre.vanderbilt.DAnCE.ConnectionType") == 0 &&
- ACE_OS::strcmp (deploy_req[i].resourceType, "Local_Interface") == 0)
- {
- return true;
- }
- }
- return false;
- }
-
- void
- Connection_Handler::insert_cookie (const char * connection_name,
- const CONNECTION_INFO conn_info)
- {
- CIAO_TRACE ("Connection_Handler::insert_cookie");
-
- std::pair<COOKIES::iterator, bool> result;
- {
- ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
- guard,
- this->cookies_mutex_,
- CORBA::NO_RESOURCES ());
-
- std::pair <std::string, CONNECTION_INFO> value_to_insert (connection_name,
- conn_info);
- result = this->cookies_.insert (value_to_insert);
- }
- if (!result.second)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::insert_cookie - "
- "Error inserting new cookie\n"));
- conn_info.first->_remove_ref ();
- conn_info.second->_remove_ref ();
- throw ::Deployment::InvalidConnection (connection_name,
- "Unable to insert cookie.");
- }
- else
- {
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::insert_cookie - "
- "Inserted cookie for [%C].\n",
- connection_name));
- }
- }
-
- void
- Connection_Handler::remove_cookie (const char* connection_name)
- {
- CIAO_TRACE ("Connection_Handler::remove_cookie");
-
- ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
- guard,
- this->cookies_mutex_,
- CORBA::NO_RESOURCES ());
-
- COOKIES::iterator it = this->cookies_.find (connection_name);
- if (it == this->cookies_.end ())
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::remove_cookie - "
- "Unable to delete cookie for connection <%C>\n",
- connection_name));
- return;
- }
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::remove_cookie - "
- "About to remove cookie for [%C].\n",
- connection_name));
- it->second.second = ::Components::CCMObject::_nil ();
- this->cookies_.erase (it);
- }
-
- ::Components::Cookie *
- Connection_Handler::get_cookie (const char * connection_name)
- {
- CIAO_TRACE ("Connection_Handler::get_cookie");
-
- ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
- guard,
- this->cookies_mutex_,
- CORBA::NO_RESOURCES ());
-
- COOKIES::iterator it = this->cookies_.find (connection_name);
- if (it == this->cookies_.end ())
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::get_cookie - "
- "Cookie for <%C> not found\n",
- connection_name));
- throw ::Deployment::InvalidConnection (connection_name,
- "Unable to find correct cookie");
- }
- else
- {
- CIAO_DEBUG (5, (LM_DEBUG, CLINFO
- "Connection_Handler::get_cookie - "
- "Found cookie for [%C]\n",
- connection_name));
- }
- return it->second.first.in ();
- }
-
- ::Components::CCMObject_ptr
- Connection_Handler::get_ccm_object (const char * connection_name)
- {
- CIAO_TRACE ("Connection_Handler::get_ccm_object");
- COOKIES::iterator it;
- {
- ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX,
- guard,
- this->cookies_mutex_,
- CORBA::NO_RESOURCES ());
- it = this->cookies_.find (connection_name);
- if (it == this->cookies_.end ())
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::get_ccm_object - "
- "Cookie for <%C> not found\n",
- connection_name));
- throw ::Deployment::InvalidConnection (connection_name,
- "Unable to find correct cookie");
- }
- }
- ::Components::CCMObject_var ret = it->second.second;
- if (::CORBA::is_nil (ret.in ()))
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::get_ccm_object - "
- "Error: Stored CCM object seems to be nil.\n",
- connection_name));
- throw ::Deployment::InvalidConnection (connection_name,
- "Stored CCM object seems nil");
- }
- return ::Components::CCMObject::_duplicate (ret.in ());
- }
-
- ::CORBA::ULong
- Connection_Handler::retrieve_endpoint (const ::Deployment::PlanConnectionDescription &conn)
- {
- CIAO_TRACE ("Connection_Handler::retrieve_endpoint");
-
- if (conn.internalEndpoint.length () == 0)
- {
- CIAO_ERROR (1, (LM_ERROR, CLINFO
- "Connection_Handler::retrieve_endpoint - "
- "Connection <%C> lacks an internalEndpoint.\n",
- conn.name.in ()));
- throw ::Deployment::InvalidConnection (conn.name.in (),
- "No internal endpoint for connection\n");
- }
- // When two internal endpoints defined, get the 'consuming' endpoint
- // (Publisher, Emitter, Receptacle).
- // In case the the 'consuming' endpoint is external, we need to connect,
- // using the providing endpoint. Therfor returning nil.
- if (conn.internalEndpoint.length () > 1)
- {
- for (CORBA::ULong i = 0;
- i < conn.internalEndpoint.length ();
- ++i)
- {
- if (!conn.internalEndpoint[i].provider)
- return i;
- }
- }
- return 0;
- }
-}