summaryrefslogtreecommitdiff
path: root/modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp')
-rw-r--r--modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp b/modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp
new file mode 100644
index 00000000000..702d7e7c400
--- /dev/null
+++ b/modules/CIAO/DAnCE/RedirectionService/NameServiceRedirection.cpp
@@ -0,0 +1,271 @@
+// $Id$
+
+#include "NameServiceRedirection.h"
+#include "DAnCE/Logger/Log_Macros.h"
+
+using namespace DAnCE;
+
+NameServiceRedirection::NameServiceRedirection (CosNaming::NamingContext_ptr naming,
+ CosNaming::NamingContext_ptr domain)
+ : naming_ (CosNaming::NamingContext::_duplicate (naming)),
+ domain_ (CosNaming::NamingContext::_duplicate (domain))
+{
+}
+
+NameServiceRedirection::~NameServiceRedirection()
+{
+}
+
+void
+NameServiceRedirection::start_binding (const ACE_CString& node, const ACE_CString& plan)
+{
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::start_binding for node %C plan %C.\n"),
+ node.c_str(),
+ plan.c_str()));
+ ACE_CString key = node + plan;
+ TRecords* records = 0;
+ if (0 != this->transactions_.find (key, records))
+ {
+ records = new TRecords();
+ this->transactions_.rebind (key, records);
+ }
+ else
+ {
+ records->clear();
+ }
+}
+
+void
+NameServiceRedirection::bind (const ACE_CString& node, const ACE_CString& plan, const ACE_CString& component, const ACE_CString& port, CORBA::Object_ptr obj)
+{
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::bind for node %C plan %C component %C and port %C is started.\n"),
+ node.c_str(),
+ plan.c_str(),
+ component.c_str(),
+ port.c_str()));
+ SRecord record;
+ record.name.length (4);
+
+ ACE_CString kind = "";
+ CosNaming::NamingContext_var node_context = this->resolve_context (node, kind, this->naming_.in());
+ record.name[0].id = CORBA::string_dup (node.c_str());
+ record.name[0].kind = CORBA::string_dup (kind.c_str());
+
+ kind = "DeploymentPlan";
+ CosNaming::NamingContext_var plan_context = this->resolve_context (plan, kind, node_context.in());
+ record.name[1].id = CORBA::string_dup (plan.c_str());
+ record.name[1].kind = CORBA::string_dup (kind.c_str());
+
+ kind = "";
+ CosNaming::NamingContext_var component_context = this->resolve_context (component, kind, plan_context.in());
+ record.name[2].id = CORBA::string_dup (component.c_str());
+ record.name[2].kind = CORBA::string_dup (kind.c_str());
+
+ record.name[3].id = CORBA::string_dup (port.c_str());
+ record.name[3].kind = CORBA::string_dup ("Port");
+
+ ACE_CString key = node + plan;
+ TRecords* records = 0;
+ if (0 != this->transactions_.find (key, records))
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO ACE_TEXT("NameServiceRedirection::bind - Can't find record %C for closing transaction.\n"), key.c_str()));
+ return;
+ }
+
+ record.obj = CORBA::Object::_duplicate (obj);
+ records->push_back (record);
+
+ // try{
+ // component_context->bind(name, obj);
+ // }
+ // catch(CosNaming::NamingContext::AlreadyBound&)
+ // {
+ // component_context->rebind(name, obj);
+ // }
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::bind has finished.\n")));
+}
+
+void
+NameServiceRedirection::bind (const ACE_CString& node, const ACE_CString& plan, const ACE_CString& component, CORBA::Object_ptr obj)
+{
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::bind for node %C plan %C and component %C is started.\n"),
+ node.c_str(),
+ plan.c_str(),
+ component.c_str()));
+ SRecord record;
+ record.name.length (3);
+
+ ACE_CString kind = "";
+ CosNaming::NamingContext_var node_context = this->resolve_context (node, kind, this->naming_.in());
+
+ record.name[0].id = CORBA::string_dup (node.c_str());
+ record.name[0].kind = CORBA::string_dup (kind.c_str());
+
+ kind = "DeploymentPlan";
+ CosNaming::NamingContext_var plan_context = this->resolve_context (plan, kind, node_context.in());
+
+ record.name[1].id = CORBA::string_dup (plan.c_str());
+ record.name[1].kind = CORBA::string_dup (kind.c_str());
+
+ ACE_CString key = node + plan;
+ TRecords* records = 0;
+ if (0 != this->transactions_.find (key, records))
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO ACE_TEXT("NameServiceRedirection::bind - Can't find record %C for closing transaction.\n"), key.c_str()));
+ return;
+ }
+
+ record.name[2].id = CORBA::string_dup (component.c_str());
+ record.name[2].kind = CORBA::string_dup ("Component");
+
+ record.obj = CORBA::Object::_duplicate (obj);
+
+ records->push_back (record);
+ // try{
+ // plan_context->bind(name, obj);
+ // }
+ // catch(CosNaming::NamingContext::AlreadyBound&)
+ // {
+ // DANCE_DEBUG((LM_DEBUG, "[%M] NameServiceRedirection::bind - Already bound exception was thrown. Rebinding\n"));
+ // plan_context->rebind(name, obj);
+ // }
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::bind has finished.\n")));
+}
+
+void
+NameServiceRedirection::finish_binding (const ACE_CString& node, const ACE_CString& plan)
+{
+ ACE_CString key = node + plan;
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::finish_binding started for %s.\n"), key.c_str()));
+ TRecords* records = 0;
+ if (0 != this->transactions_.find (key, records))
+ {
+ DANCE_ERROR ((LM_ERROR, DLINFO ACE_TEXT("NameServiceRedirection::finish_binding - Can't find record %C for closing transaction.\n"), key.c_str()));
+ return;
+ }
+ for (unsigned int i = 0; i < records->size(); i++)
+ {
+ //this->naming_->bind((*records)[i].name, (*records)[i].obj.in());
+ try
+ {
+ this->naming_->bind ( (*records) [i].name, (*records) [i].obj.in());
+ }
+ catch (CosNaming::NamingContext::AlreadyBound&)
+ {
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::finish_bind - Already bound exception was thrown. Rebinding\n")));
+ this->naming_->rebind ( (*records) [i].name, (*records) [i].obj.in());
+ }
+
+ }
+ if (!CORBA::is_nil (this->domain_.in()))
+ {
+ ACE_CString kind = "";
+ CosNaming::NamingContext_var context = this->resolve_context (node, kind, this->naming_.in());
+ CosNaming::Name name;
+ name.length (1);
+ name[0].id = CORBA::string_dup (node.c_str());
+ name[0].kind = CORBA::string_dup (kind.c_str());
+ try
+ {
+ this->domain_->bind_context (name, context.in());
+ }
+ catch (CosNaming::NamingContext::AlreadyBound&)
+ {
+ this->domain_->rebind_context (name, context.in());
+ }
+ }
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::finish_bind has finished.\n")));
+}
+
+void
+NameServiceRedirection::unbind_context (const ACE_CString& node, const ACE_CString& plan)
+{
+ DANCE_DEBUG ( (LM_TRACE, ACE_TEXT("[%M] NameServiceRedirection::unbind_context started...\n")));
+ ACE_CString kind = "";
+ CosNaming::NamingContext_var node_context = this->resolve_context (node, kind, this->naming_.in());
+ kind = "DeploymentPlan";
+ CosNaming::NamingContext_var plan_context = this->resolve_context (plan, kind, node_context.in());
+ DANCE_DEBUG ( (LM_TRACE, ACE_TEXT("[%M] NameServiceRedirection::unbind_context before clear_context for %s.%s\n"), plan.c_str(), kind.c_str()));
+ this->clear_context (plan_context.inout());
+ CosNaming::Name name (1);
+ name.length (1);
+ name[0].id = CORBA::string_dup (plan.c_str());
+ name[0].kind = CORBA::string_dup (kind.c_str());
+ DANCE_DEBUG ( (LM_TRACE, ACE_TEXT("[%M] NameServiceRedirection::unbind_context before unbinding %s.%s\n")
+ , name[0].id.in(), name[0].kind.in()));
+ node_context->unbind (name);
+ DANCE_DEBUG ( (LM_TRACE, ACE_TEXT("[%M] NameServiceRedirection::unbind_context before destroying plan context.\n")));
+ plan_context->destroy();
+ DANCE_DEBUG ( (LM_TRACE, ACE_TEXT("[%M] NameServiceRedirection::unbind_context fininshed.\n")));
+}
+
+CosNaming::NamingContext_ptr
+NameServiceRedirection::resolve_context (const ACE_CString& context_name, const ACE_CString& context_kind, CosNaming::NamingContext_ptr naming)
+{
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::resolve_context is started for context %C.%C\n"), context_name.c_str(), context_kind.c_str()));
+ if (CORBA::is_nil (naming))
+ {
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::resolve_context source context is nil!.\n")));
+ return CosNaming::NamingContext::_nil ();
+ }
+ CORBA::Object_var obj;
+ CosNaming::Name name (1);
+ name.length (1);
+ name[0].id = CORBA::string_dup (context_name.c_str());
+ name[0].kind = CORBA::string_dup (context_kind.c_str());
+ try
+ {
+ obj = naming->resolve (name);
+ }
+ catch (const CosNaming::NamingContext::NotFound&)
+ {
+ obj = naming->bind_new_context (name);
+ }
+ DANCE_DEBUG ((LM_DEBUG, DLINFO ACE_TEXT("NameServiceRedirection::resolve_context has finished.\n")));
+ return CosNaming::NamingContext::_narrow (obj._retn());
+}
+
+void
+NameServiceRedirection::clear_context (CosNaming::NamingContext_ptr& naming)
+{
+ CosNaming::BindingList_var bl;
+ CosNaming::BindingIterator_var bi;
+ naming->list (0, bl.out(), bi.out());
+
+ if (CORBA::is_nil (bi.in()))
+ {
+ return;
+ }
+ while (bi->next_n (100, bl.out()))
+ {
+ for (unsigned int i = 0; i < bl->length(); i++)
+ {
+ if (bl[i].binding_type == CosNaming::ncontext)
+ {
+ CORBA::Object_var obj = naming->resolve ( (*bl) [i].binding_name);
+ CosNaming::NamingContext_var sub_context = CosNaming::NamingContext::_narrow (obj);
+ this->clear_context (sub_context.inout());
+ naming->unbind ( (*bl) [i].binding_name);
+ sub_context->destroy();
+ }
+ else
+ {
+ naming->unbind ( (*bl) [i].binding_name);
+ }
+ }
+ }
+}
+
+void
+NameServiceRedirection::add_node (const ACE_CString& node)
+{
+ CosNaming::NamingContext_var new_nc = this->resolve_context (node, "", this->naming_);
+ if (!CORBA::is_nil (this->domain_.in()))
+ {
+ CosNaming::Name name;
+ name.length (1);
+ name[0].id = CORBA::string_dup (node.c_str());
+ name[0].kind = CORBA::string_dup ("");
+ this->domain_->bind_context (name, new_nc.in());
+ }
+}