summaryrefslogtreecommitdiff
path: root/modules/CIAO/DAnCE/Utils/Plan_Handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/DAnCE/Utils/Plan_Handler.cpp')
-rw-r--r--modules/CIAO/DAnCE/Utils/Plan_Handler.cpp349
1 files changed, 349 insertions, 0 deletions
diff --git a/modules/CIAO/DAnCE/Utils/Plan_Handler.cpp b/modules/CIAO/DAnCE/Utils/Plan_Handler.cpp
new file mode 100644
index 00000000000..f464bf5058f
--- /dev/null
+++ b/modules/CIAO/DAnCE/Utils/Plan_Handler.cpp
@@ -0,0 +1,349 @@
+// $Id$
+
+#include "Plan_Handler.h"
+#include "DAnCE/Logger/Log_Macros.h"
+
+namespace DAnCE
+{
+ void
+ DAnCE_Utils::add_instance (
+ ::Deployment::DeploymentPlan &deployment_plan,
+ const char *instance_name,
+ const char *node_name,
+ const char *impl_name,
+ const char *ns_name)
+ {
+ // Modifying the deployment plan in order to include the new instance ...
+ ::Deployment::InstanceDeploymentDescriptions instance =
+ deployment_plan.instance;
+
+ instance.length (instance.length()+1);
+
+ instance[instance.length()-1].name = CORBA::string_dup(instance_name); // Name of the instance
+ instance[instance.length()-1].node = CORBA::string_dup(node_name);
+ instance[instance.length()-1].source.length(0);
+
+ // Looking for implementation block with name equals to type ...
+ ::Deployment::MonolithicDeploymentDescriptions implementation =
+ deployment_plan.implementation;
+
+ CORBA::ULong i = 0;
+ for (i = 0; i < implementation.length(); ++i)
+ if (ACE_OS::strcmp (implementation[i].name.in(), impl_name) == 0)
+ break;
+
+ if (i < implementation.length())
+ instance[instance.length()-1].implementationRef = i;
+ else
+ throw ImplementationNotFound();
+
+ if (ns_name != 0)
+ {
+ instance[instance.length()-1].configProperty.length(1);
+ instance[instance.length()-1].configProperty[0].name = CORBA::string_dup ("RegisterNaming");
+ instance[instance.length()-1].configProperty[0].value <<= CORBA::string_dup (ns_name);
+ }
+
+ // Re-assigning instances to deployment plan ...
+ deployment_plan.instance = instance;
+ }
+
+ /*
+ void
+ DAnCE_Utils::add_connection (::Deployment::DeploymentPlan_var &deployment_plan, const char *connection_name, const char *port_name, const char *facet_instance, const char *receptacle_instance)
+ {
+ // Modifying the deployment plan in order to include the new connection ...
+
+ ::Deployment::PlanConnectionDescriptions connection = deployment_plan->connection;
+ connection.length(connection.length()+1);
+
+ connection[connection.length()-1].name = CORBA::string_dup(connection_name);
+ connection[connection.length()-1].source.length(0);
+ connection[connection.length()-1].deployRequirement.length(0);
+ connection[connection.length()-1].externalEndpoint.length(0);
+ connection[connection.length()-1].internalEndpoint.length(2);
+ connection[connection.length()-1].internalEndpoint[0].portName = CORBA::string_dup(port_name);
+ connection[connection.length()-1].internalEndpoint[0].provider = 0L;
+ connection[connection.length()-1].internalEndpoint[0].kind = ::Deployment::Facet;
+
+ unsigned int i;
+
+ // Looking for instance block with name equals to facet_instance ...
+
+ ::Deployment::InstanceDeploymentDescriptions instance = deployment_plan->instance;
+
+ for (i = 0; i < instance.length(); i++)
+ if (!strcmp(instance[i].name.in(), facet_instance))
+ break;
+
+ if (i < instance.length())
+ connection[connection.length()-1].internalEndpoint[0].instanceRef = i;
+ else
+ throw InstanceNotFound();
+
+ connection[connection.length()-1].internalEndpoint[1].portName = CORBA::string_dup(port_name);
+ connection[connection.length()-1].internalEndpoint[1].provider = 0L;
+ connection[connection.length()-1].internalEndpoint[1].kind = ::Deployment::SimplexReceptacle;
+
+ // Looking for instance block with name equals to receptacle_instance ...
+
+ for (i = 0; i < instance.length(); i++)
+ if (!strcmp(instance[i].name.in(), receptacle_instance))
+ break;
+
+ if (i < instance.length())
+ connection[connection.length()-1].internalEndpoint[1].instanceRef = i;
+ else
+ throw InstanceNotFound();
+
+ // Re-assigning connection to deployment plan
+
+ deployment_plan->connection = connection;
+ }
+
+ void
+ DAnCE_Utils::remove_instance (::Deployment::DeploymentPlan_var &deployment_plan, const char *instance_name)
+ {
+ // Modifying the deployment plan in order to remove the instance ...
+
+ ::Deployment::InstanceDeploymentDescriptions instance = deployment_plan->instance;
+ ::Deployment::PlanConnectionDescriptions connection = deployment_plan->connection;
+
+ // Looking for the instance position in sequence of instances ...
+
+ unsigned int instance_ref = 0, i;
+
+ for (i = 0; i < instance.length(); i++)
+ if (!strcmp(instance[i].name.in(), instance_name))
+ {
+ instance_ref = i;
+ break;
+ }
+
+ if (i == instance.length())
+ throw InstanceNotFound();
+
+ // First of all, we need to remove all connections of which this instance participates ...
+
+ for (i = 0; i < connection.length(); i++)
+ for (unsigned int j = 0; j < connection[i].internalEndpoint.length(); j++)
+ if (connection[i].internalEndpoint[j].instanceRef == instance_ref)
+ {
+ remove_connection(deployment_plan, connection[i].name.in());
+ // Updating i in order to verify the shifted connection ...
+ i--;
+ // Re-acquiring instances from the deployment plan ...
+ connection = deployment_plan->connection;
+ break;
+ }
+
+ // And then, removing the instance itself ...
+
+ for (unsigned int j = instance_ref; j < instance.length() - 1; j++)
+ {
+ instance[j].name = instance[j+1].name;
+ instance[j].node = instance[j+1].node;
+ instance[j].source.length(instance[j+1].source.length());
+ for (unsigned int k = 0; k < instance[j].source.length(); k++)
+ instance[j].source[k] = instance[j+1].source[k];
+ instance[j].implementationRef = instance[j].implementationRef;;
+ instance[j].configProperty.length(instance[j+1].configProperty.length());
+ for (unsigned int k = 0; k < instance[j].configProperty.length(); k++)
+ {
+ instance[j].configProperty[k].name = instance[j+1].configProperty[k].name;
+ instance[j].configProperty[k].value = instance[j+1].configProperty[k].value;
+ }
+ }
+ instance.length(instance.length()-1);
+
+ // Re-assigning instances to the deployment plan ...
+ deployment_plan->instance = instance;
+
+ // Updating connections for the shifted instances ...
+ connection = deployment_plan->connection;
+ for (i = 0; i < connection.length(); i++)
+ for (unsigned int j = 0; j < connection[i].internalEndpoint.length(); j++)
+ if (connection[i].internalEndpoint[j].instanceRef > instance_ref)
+ connection[i].internalEndpoint[j].instanceRef--;
+ deployment_plan->connection = connection;
+
+ return;
+
+ }
+
+ void
+ DAnCE_Utils::remove_connection (
+ ::Deployment::DeploymentPlan_var &deployment_plan,
+ const char *connection_name)
+ {
+ ::Deployment::PlanConnectionDescriptions connection = deployment_plan->connection;
+
+ for (unsigned int i = 0; i < connection.length(); i++)
+ if (!strcmp(connection[i].name.in(), connection_name))
+ {
+ for (unsigned int k = i; k < connection.length() - 1; k++)
+ {
+ unsigned int l;
+ connection[k].name = connection[k+1].name;
+ connection[k].source.length(connection[k+1].source.length());
+ for (l = 0; l < connection[k].source.length(); l++)
+ connection[k].source[l] = connection[k+1].source[l];
+ connection[k].deployRequirement.length(connection[k+1].deployRequirement.length());
+ for (l = 0; l < connection[k].deployRequirement.length(); l++)
+ {
+ connection[k].deployRequirement[l].resourceType = connection[k+1].deployRequirement[l].resourceType;
+ connection[k].deployRequirement[l].name = connection[k+1].deployRequirement[l].name;
+ connection[k].deployRequirement[l].property.length(connection[k+1].deployRequirement[l].property.length());
+ for (unsigned int m = 0; m < connection[k].deployRequirement[l].property.length(); m++)
+ {
+ connection[k].deployRequirement[l].property[m].name = connection[k+1].deployRequirement[l].property[m].name;
+ connection[k].deployRequirement[l].property[m].value = connection[k+1].deployRequirement[l].property[m].value;
+ }
+ }
+ connection[k].externalEndpoint.length(connection[k+1].externalEndpoint.length());
+ for (l = 0; l < connection[k].externalEndpoint.length(); l++)
+ connection[k].externalEndpoint[l].portName = connection[k+1].externalEndpoint[l].portName;
+ connection[k].internalEndpoint.length(connection[k+1].internalEndpoint.length());
+ for (l = 0; l < connection[k].internalEndpoint.length(); l++)
+ {
+ connection[k].internalEndpoint[l].portName = connection[k+1].internalEndpoint[l].portName;
+ connection[k].internalEndpoint[l].provider = connection[k+1].internalEndpoint[l].provider;
+ connection[k].internalEndpoint[l].kind = connection[k+1].internalEndpoint[l].kind;
+ connection[k].internalEndpoint[l].instanceRef = connection[k+1].internalEndpoint[l].instanceRef;
+ }
+ connection[k].deployedResource.length(connection[k+1].deployedResource.length());
+ for (l = 0; l < connection[k].deployedResource.length(); l++)
+ {
+ connection[k].deployedResource[l].targetName = connection[k+1].deployedResource[l].targetName;
+ connection[k].deployedResource[l].requirementName = connection[k+1].deployedResource[l].requirementName;
+ connection[k].deployedResource[l].resourceName = connection[k+1].deployedResource[l].resourceName;
+ connection[k].deployedResource[l].resourceValue = connection[k+1].deployedResource[l].resourceValue;
+ }
+ }
+ connection.length(connection.length()-1);
+ // Re-assigning connection to the deployment plan ...
+ deployment_plan->connection = connection;
+ return;
+ }
+ // Throw exception if connection name not found ...
+ throw ConnectionNotFound();
+ }
+*/
+ void
+ DAnCE_Utils::print_instances (const ::Deployment::DeploymentPlan &deployment_plan)
+ {
+ const ::Deployment::InstanceDeploymentDescriptions instance =
+ deployment_plan.instance;
+
+ for (CORBA::ULong i = 0; i < instance.length(); ++i)
+ {
+ DANCE_DEBUG((LM_DEBUG, "[%M] \nInstance no. %d\n", i));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tName: %C\n", instance[i].name.in()));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tNode: %C\n", instance[i].node.in()));
+
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tImplementationRef: %d\n", instance[i].implementationRef));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tNumber of properties: %d\n", instance[i].configProperty.length()));
+
+ for (CORBA::ULong k = 0; k < instance[i].configProperty.length(); k++)
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\tName: %C\n", instance[i].configProperty[k].name.in()));
+ }
+ }
+
+ void
+ DAnCE_Utils::print_connections (const ::Deployment::DeploymentPlan &deployment_plan)
+ {
+ const ::Deployment::PlanConnectionDescriptions connection =
+ deployment_plan.connection;
+
+ for (CORBA::ULong i = 0; i < connection.length(); ++i)
+ {
+ DANCE_DEBUG((LM_DEBUG, "[%M] \nConnection no. %d\n", i));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tName: %C\n", connection[i].name.in()));
+
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tNo of deployRequirements: %d\n",
+ connection[i].deployRequirement.length()));
+
+ for (CORBA::ULong j = 0; j < connection[i].deployRequirement.length(); ++j)
+ {
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\tDeploy Requirement %d:\n",
+ j+1));
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tResource Type: %C\n",
+ connection[i].deployRequirement[j].resourceType.in()));
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tName: %C\n",
+ connection[i].deployRequirement[j].name.in()));
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tNo of Properties: %d\n",
+ connection[i].deployRequirement[j].property.length()));
+ for (CORBA::ULong k = 0; k < connection[i].deployRequirement[j].property.length(); ++k)
+ {
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\t\tProperty %d:\n", k+1));
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\t\tName: %C\n",
+ connection[i].deployRequirement[j].property[k].name.in()));
+ }
+ }
+
+ DANCE_DEBUG((LM_DEBUG,
+ "\tNo of externalEndpoints: %d\n",
+ connection[i].externalEndpoint.length()));
+ for (CORBA::ULong j = 0; j < connection[i].externalEndpoint.length(); j++)
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\tPortname %d: %C\n", j+1,
+ connection[i].externalEndpoint[j].portName.in()));
+
+ DANCE_DEBUG((LM_DEBUG,
+ "\tNo of internalEndpoints: %d\n",
+ connection[i].internalEndpoint.length()));
+ for (CORBA::ULong j = 0; j < connection[i].internalEndpoint.length(); j++)
+ {
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\tInternalEndpoint %d:\n", j+1));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\t\tPortname: %C\n", connection[i].internalEndpoint[j].portName.in()));
+ DANCE_DEBUG((LM_DEBUG, "\t\t\tProvider: %d\n", connection[i].internalEndpoint[j].provider));
+
+ if (connection[i].internalEndpoint[j].kind == ::Deployment::Facet ||
+ connection[i].internalEndpoint[j].kind == ::Deployment::SimplexReceptacle)
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tKind: %C\n",
+ (connection[i].internalEndpoint[j].kind == ::Deployment::Facet) ?
+ "Facet" : "SimplexReceptacle"));
+ else
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tKind: %d\n",
+ connection[i].internalEndpoint[j].kind));
+
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\t\tInstanceRef: %ld",
+ (long) connection[i].internalEndpoint[j].instanceRef));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \tInstanceName: %C\n",
+ deployment_plan.instance[connection[i].internalEndpoint[j].instanceRef].name.in()));
+ }
+
+ DANCE_DEBUG((LM_DEBUG,
+ "\tNo of externalReferenceEndpoints: %d\n",
+ connection[i].externalReference.length()));
+ for (CORBA::ULong j = 0; j < connection[i].externalReference.length(); ++j)
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\tLocation %d: %C\n",
+ j+1,
+ connection[i].externalReference[j].location.in()));
+
+ DANCE_DEBUG((LM_DEBUG,
+ "\tNo of deployedResources: %d\n",
+ connection[i].deployedResource.length()));
+ for (CORBA::ULong j = 0; j < connection[i].deployedResource.length(); j++)
+ {
+ DANCE_DEBUG((LM_DEBUG,
+ "\t\tTargetName: %C\n",
+ connection[i].deployedResource[j].targetName.in()));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\tRequirementName: %C\n",
+ connection[i].deployedResource[j].requirementName.in()));
+ DANCE_DEBUG((LM_DEBUG, "[%M] \t\tResourceName: %C\n",
+ connection[i].deployedResource[j].resourceName.in()));
+ }
+ }
+ }
+}
+