diff --git a/org.opentosca.bus.management.api.soaphttp/src/org/opentosca/bus/management/api/soaphttp/processor/RequestProcessor.java b/org.opentosca.bus.management.api.soaphttp/src/org/opentosca/bus/management/api/soaphttp/processor/RequestProcessor.java
index 8173dfa55..feb61dcb7 100644
--- a/org.opentosca.bus.management.api.soaphttp/src/org/opentosca/bus/management/api/soaphttp/processor/RequestProcessor.java
+++ b/org.opentosca.bus.management.api.soaphttp/src/org/opentosca/bus/management/api/soaphttp/processor/RequestProcessor.java
@@ -2,6 +2,7 @@
import java.net.URI;
import java.net.URL;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -45,8 +46,8 @@
*
*
* This processor processes the incoming requests of the Management Bus-SOAP/HTTP-API. It transforms
- * the incoming unmarshalled SOAP message into a from the Management Bus understandable camel exchange
- * message. The MBHeader-Enum is used here to define the headers of the exchange message.
+ * the incoming unmarshalled SOAP message into a from the Management Bus understandable camel
+ * exchange message. The MBHeader-Enum is used here to define the headers of the exchange message.
*
* @see MBHeader
*
@@ -119,10 +120,15 @@ public void process(final Exchange exchange) throws Exception {
Activator.bundleContext.getServiceReference(IToscaEngineService.class.getName());
final IToscaEngineService toscaEngineService =
(IToscaEngineService) Activator.bundleContext.getService(servRef);
- final QName nodeTemplateQName = new QName(serviceTemplateIDNamespaceURI, nodeTemplateID);
- final ResolvedArtifacts resolvedArtifacts =
- toscaEngineService.getResolvedArtifactsOfNodeTemplate(new CSARID(csarIDString), nodeTemplateQName);
- final List resolvedDAs = resolvedArtifacts.getDeploymentArtifacts();
+
+ final List resolvedDAs = new ArrayList<>();
+ if (nodeTemplateID != null) {
+ final QName nodeTemplateQName = new QName(serviceTemplateIDNamespaceURI, nodeTemplateID);
+ final ResolvedArtifacts resolvedArtifacts =
+ toscaEngineService.getResolvedArtifactsOfNodeTemplate(new CSARID(csarIDString), nodeTemplateQName);
+ resolvedDAs.addAll(resolvedArtifacts.getDeploymentArtifacts());
+ }
+
final URL serviceInstanceIDUrl = new URL(serviceInstanceID);
final HashMap> DAs = new HashMap<>();
for (final ResolvedDeploymentArtifact resolvedDeploymentArtifact : resolvedDAs) {
@@ -138,7 +144,6 @@ public void process(final Exchange exchange) throws Exception {
LOG.info(urlWithDa);
DAfiles.put(FilenameUtils.getName(urlWithDa), urlWithDa);
-
}
}
final Gson gson = new Gson();
diff --git a/org.opentosca.container.api/src/org/opentosca/container/api/Activator.java b/org.opentosca.container.api/src/org/opentosca/container/api/Activator.java
index 30f1b85c5..6e4358028 100644
--- a/org.opentosca.container.api/src/org/opentosca/container/api/Activator.java
+++ b/org.opentosca.container.api/src/org/opentosca/container/api/Activator.java
@@ -25,6 +25,7 @@
import org.glassfish.jersey.server.ServerProperties;
import org.opentosca.container.api.config.CorsFilter;
import org.opentosca.container.api.config.JAXBContextProvider;
+import org.opentosca.container.api.config.LogFilter;
import org.opentosca.container.api.config.ObjectMapperProvider;
import org.opentosca.container.api.config.PlainTextMessageBodyWriter;
import org.opentosca.container.api.config.URI2XMLMessageBodyWriter;
@@ -75,7 +76,7 @@ public void start(final BundleContext bundleContext) throws Exception {
this.services.add(bundleContext.registerService(ObjectMapperProvider.class, new ObjectMapperProvider(), null));
this.services.add(bundleContext.registerService(JacksonFeature.class, new JacksonFeature(), null));
this.services.add(bundleContext.registerService(MultiPartFeature.class, new MultiPartFeature(), null));
- // this.services.add(bundleContext.registerService(LogFilter.class, new LogFilter(), null));
+ this.services.add(bundleContext.registerService(LogFilter.class, new LogFilter(), null));
// Custom JAXBContext provider to have proper error logging. Can be
// removed once the API is in a stable state.
diff --git a/org.opentosca.container.api/src/org/opentosca/container/api/config/LogFilter.java b/org.opentosca.container.api/src/org/opentosca/container/api/config/LogFilter.java
index 7c5412900..a3f4e3267 100644
--- a/org.opentosca.container.api/src/org/opentosca/container/api/config/LogFilter.java
+++ b/org.opentosca.container.api/src/org/opentosca/container/api/config/LogFilter.java
@@ -14,15 +14,20 @@
package org.opentosca.container.api.config;
import java.io.IOException;
+import java.util.List;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import org.apache.commons.io.IOUtils;
+import org.opentosca.container.api.util.UriUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.Lists;
+
@Provider
public class LogFilter implements ContainerRequestFilter {
@@ -30,22 +35,24 @@ public class LogFilter implements ContainerRequestFilter {
@Override
public void filter(final ContainerRequestContext request) throws IOException {
- logger.debug("LogFilter.filter()");
-
- for (final String key : request.getHeaders().keySet()) {
- logger.debug(key + " : " + request.getHeaders().get(key));
- }
- if (request.getMethod().equalsIgnoreCase("POST")) {
- logger.debug("POST method");
- }
-
- if (request.getMediaType() != null) {
- logger.debug("MediaType: " + request.getMediaType());
- if (request.getMediaType().toString().contains("xml")) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("=== LogFilter BEGIN ===");
+ logger.debug("Method: {}", request.getMethod());
+ logger.debug("URL: {}", UriUtil.encode(request.getUriInfo().getAbsolutePath()));
+ for (final String key : request.getHeaders().keySet()) {
+ logger.debug(key + " : " + request.getHeaders().get(key));
+ }
+ final List mediaTypes =
+ Lists.newArrayList(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE,
+ MediaType.TEXT_PLAIN_TYPE, MediaType.TEXT_XML_TYPE, MediaType.TEXT_HTML_TYPE);
+ if (request.getMediaType() != null && mediaTypes.contains(request.getMediaType())) {
if (request.hasEntity()) {
- logger.debug(IOUtils.toString(request.getEntityStream()));
+ final String body = IOUtils.toString(request.getEntityStream());
+ request.setEntityStream(IOUtils.toInputStream(body));
+ logger.debug("Body: {}", body);
}
}
+ logger.debug("=== LogFilter END ===");
}
}
}
diff --git a/org.opentosca.container.api/src/org/opentosca/container/api/controller/RelationshipTemplateInstanceController.java b/org.opentosca.container.api/src/org/opentosca/container/api/controller/RelationshipTemplateInstanceController.java
index 66ed80396..4d582ec0e 100644
--- a/org.opentosca.container.api/src/org/opentosca/container/api/controller/RelationshipTemplateInstanceController.java
+++ b/org.opentosca.container.api/src/org/opentosca/container/api/controller/RelationshipTemplateInstanceController.java
@@ -117,9 +117,11 @@ public Response createRelationshipTemplateInstance(@Context final UriInfo uriInf
return Response.ok(instanceURI).build();
}
catch (final IllegalArgumentException e) {
+ logger.error("Error creating instance: {}", e.getMessage(), e);
return Response.status(Status.BAD_REQUEST).build();
}
catch (InstantiationException | IllegalAccessException e) {
+ logger.error("Error creating instance: {}", e.getMessage(), e);
return Response.serverError().build();
}
diff --git a/org.opentosca.container.config.logging/src/logback.xml b/org.opentosca.container.config.logging/src/logback.xml
index 71746f9d2..780da54cc 100644
--- a/org.opentosca.container.config.logging/src/logback.xml
+++ b/org.opentosca.container.config.logging/src/logback.xml
@@ -23,9 +23,11 @@
-
-
+
+
+
+
diff --git a/org.opentosca.container.core/src/org/opentosca/container/core/engine/impl/ToscaEngineServiceImpl.java b/org.opentosca.container.core/src/org/opentosca/container/core/engine/impl/ToscaEngineServiceImpl.java
index 5f55e5d8f..287ead80b 100644
--- a/org.opentosca.container.core/src/org/opentosca/container/core/engine/impl/ToscaEngineServiceImpl.java
+++ b/org.opentosca.container.core/src/org/opentosca/container/core/engine/impl/ToscaEngineServiceImpl.java
@@ -201,7 +201,7 @@ public List getReferencedNodeTypesOfAServiceTemplate(final CSARID csarID,
public boolean hasOperationOfANodeTypeSpecifiedInputParams(final CSARID csarID, final QName nodeTypeID,
final String interfaceName, final String operationName) {
- for (final QName nodeTypeHierarchyMember : this.getNodeTypeHierachy(csarID, nodeTypeID)) {
+ for (final QName nodeTypeHierarchyMember : getNodeTypeHierachy(csarID, nodeTypeID)) {
final TNodeType nodeType =
(TNodeType) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
@@ -298,7 +298,7 @@ public boolean hasOperationOfANodeTypeSpecifiedOutputParams(final CSARID csarID,
final String interfaceName,
final String operationName) {
- for (final QName nodeTypeHierarchyMember : this.getNodeTypeHierachy(csarID, nodeTypeID)) {
+ for (final QName nodeTypeHierarchyMember : getNodeTypeHierachy(csarID, nodeTypeID)) {
final TNodeType nodeType =
(TNodeType) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
@@ -394,7 +394,7 @@ public boolean hasOperationOfARelationshipTypeSpecifiedOutputParams(final CSARID
public boolean doesInterfaceOfNodeTypeContainOperation(final CSARID csarID, final QName nodeTypeID,
final String interfaceName, final String operationName) {
- for (final QName nodeTypeHierarchyMember : this.getNodeTypeHierachy(csarID, nodeTypeID)) {
+ for (final QName nodeTypeHierarchyMember : getNodeTypeHierachy(csarID, nodeTypeID)) {
final TNodeType nodeType =
(TNodeType) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
@@ -512,7 +512,7 @@ public List getNodeTypeImplementationsOfNodeType(final CSARID csarID, fin
// search in all Definitions inside a certain CSAR
for (final TDefinitions definitions : ToscaEngineServiceImpl.toscaReferenceMapper.getDefinitionsOfCSAR(csarID)) {
- for (final QName nodeTypeHierachyMember : this.getNodeTypeHierachy(csarID, nodeTypeID)) {
+ for (final QName nodeTypeHierachyMember : getNodeTypeHierachy(csarID, nodeTypeID)) {
// search for NodeTypeImplementations
for (final TExtensibleElements entity : definitions.getServiceTemplateOrNodeTypeOrNodeTypeImplementation()) {
@@ -598,8 +598,8 @@ public List getImplementationArtifactNamesOfNodeTypeImplementation(final
// return list
final List listOfNames = new ArrayList<>();
- for (final QName nodeTypeImplHierarchyMember : this.getNodeTypeImplementationTypeHierarchy(csarID,
- nodeTypeImplementationID)) {
+ for (final QName nodeTypeImplHierarchyMember : getNodeTypeImplementationTypeHierarchy(csarID,
+ nodeTypeImplementationID)) {
// get the NodeTypeImplementation
final TNodeTypeImplementation nodeTypeImplementation =
@@ -857,18 +857,35 @@ public QName getArtifactTypeOfAImplementationArtifactOfANodeTypeImplementation(f
final QName nodeTypeImplementationID,
final String implementationArtifactName) {
- // get the NodeTypeImplementation
- final TNodeTypeImplementation nodeTypeImplementation =
- (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
- nodeTypeImplementationID);
+ try {
+ // get the NodeTypeImplementation
+ final TNodeTypeImplementation nodeTypeImplementation =
+ (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
- // if there are ImplementationArtifacts
- if (nodeTypeImplementation.getImplementationArtifacts() != null) {
- for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
- .getImplementationArtifact()) {
+ if (implArt.getName().equals(implementationArtifactName)) {
+ return implArt.getArtifactType();
+ }
+ }
+ }
+ }
+ catch (final Exception e) {
+ // get the TRelationshipTypeImplementation
+ final TRelationshipTypeImplementation nodeTypeImplementation =
+ (TRelationshipTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
- if (implArt.getName().equals(implementationArtifactName)) {
- return implArt.getArtifactType();
+ if (implArt.getName().equals(implementationArtifactName)) {
+ return implArt.getArtifactType();
+ }
}
}
}
@@ -914,21 +931,41 @@ public QName getArtifactTemplateOfAImplementationArtifactOfANodeTypeImplementati
final QName nodeTypeImplementationID,
final String implementationArtifactName) {
- // get the NodeTypeImplementation
- final TNodeTypeImplementation nodeTypeImplementation =
- (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
- nodeTypeImplementationID);
+ try {
+ // get the NodeTypeImplementation
+ final TNodeTypeImplementation nodeTypeImplementation =
+ (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
- // if there are ImplementationArtifacts
- if (nodeTypeImplementation.getImplementationArtifacts() != null) {
- for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
- .getImplementationArtifact()) {
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
+ if (implArt.getName().equals(implementationArtifactName)) {
- if (implArt.getName().equals(implementationArtifactName)) {
+ ToscaEngineServiceImpl.LOG.trace("The ArtifactTemplate is found and has the QName \""
+ + implArt.getArtifactRef() + "\".");
+ return implArt.getArtifactRef();
+ }
+ }
+ }
+ }
+ catch (final Exception e) {
+ // get the TRelationshipTypeImplementation
+ final TRelationshipTypeImplementation nodeTypeImplementation =
+ (TRelationshipTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
- ToscaEngineServiceImpl.LOG.trace("The ArtifactTemplate is found and has the QName \""
- + implArt.getArtifactRef() + "\".");
- return implArt.getArtifactRef();
+ if (implArt.getName().equals(implementationArtifactName)) {
+
+ ToscaEngineServiceImpl.LOG.trace("The ArtifactTemplate is found and has the QName \""
+ + implArt.getArtifactRef() + "\".");
+ return implArt.getArtifactRef();
+ }
}
}
}
@@ -992,7 +1029,7 @@ public Node getReferenceAsNode(final CSARID csarID, final QName reference) {
public Node getInputParametersOfANodeTypeOperation(final CSARID csarID, final QName nodeTypeID,
final String interfaceName, final String operationName) {
- for (final QName nodeTypeHierarchyMember : this.getNodeTypeHierachy(csarID, nodeTypeID)) {
+ for (final QName nodeTypeHierarchyMember : getNodeTypeHierachy(csarID, nodeTypeID)) {
final TNodeType nodeType =
(TNodeType) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
@@ -1173,59 +1210,65 @@ public Document getArtifactSpecificContentOfAImplementationArtifactOfANodeTypeIm
final QName nodeTypeImplementationID,
final String implementationArtifactName) {
- // get the NodeTypeImplementation
- final TNodeTypeImplementation nodeTypeImplementation =
- (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
- nodeTypeImplementationID);
+ try {
+ // get the NodeTypeImplementation
+ final TNodeTypeImplementation nodeTypeImplementation =
+ (TNodeTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
- // if there are ImplementationArtifacts
- if (nodeTypeImplementation.getImplementationArtifacts() != null) {
- for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
- .getImplementationArtifact()) {
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
- if (implArt.getName().equals(implementationArtifactName)) {
+ if (implArt.getName().equals(implementationArtifactName)) {
- final List listOfAnyElements = new ArrayList<>();
- for (final Object obj : implArt.getAny()) {
- if (obj instanceof Element) {
- listOfAnyElements.add((Element) obj);
- } else {
- ToscaEngineServiceImpl.LOG.error("There is content inside of the ImplementationArtifact \""
- + implementationArtifactName + "\" of the NodeTypeImplementation \""
- + nodeTypeImplementationID + "\" which is not a processable DOM Element.");
- return null;
+ final List listOfAnyElements = new ArrayList<>();
+ for (final Object obj : implArt.getAny()) {
+ if (obj instanceof Element) {
+ listOfAnyElements.add((Element) obj);
+ } else {
+ ToscaEngineServiceImpl.LOG.error("There is content inside of the ImplementationArtifact \""
+ + implementationArtifactName + "\" of the NodeTypeImplementation \""
+ + nodeTypeImplementationID + "\" which is not a processable DOM Element.");
+ return null;
+ }
}
- }
- return ServiceHandler.xmlSerializerService.getXmlSerializer()
- .elementsIntoDocument(listOfAnyElements,
- "ImplementationArtifactSpecificContent");
+ return ServiceHandler.xmlSerializerService.getXmlSerializer()
+ .elementsIntoDocument(listOfAnyElements,
+ "ImplementationArtifactSpecificContent");
+ }
+ }
+ }
+ }
+ catch (final Exception e) {
+ // get the TRelationshipTypeImplementation
+ final TRelationshipTypeImplementation nodeTypeImplementation =
+ (TRelationshipTypeImplementation) ToscaEngineServiceImpl.toscaReferenceMapper.getJAXBReference(csarID,
+ nodeTypeImplementationID);
+ // if there are ImplementationArtifacts
+ if (nodeTypeImplementation.getImplementationArtifacts() != null) {
+ for (final TImplementationArtifact implArt : nodeTypeImplementation.getImplementationArtifacts()
+ .getImplementationArtifact()) {
- // Node implArtNode =
- // ServiceHandler.xmlSerializerService.getXmlSerializer().marshalToNode(implArt);
- // NodeList childNodes = implArtNode.getChildNodes();
- //
- // try {
- // Document returnDocument =
- // DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
- // Element root =
- // returnDocument.createElement("SpecificContent");
- // returnDocument.appendChild(root);
- //
- // for (int i = 0; i < childNodes.getLength(); i++) {
- // Node node = childNodes.item(i);
- // Node copyNode = returnDocument.importNode(node, true);
- // root.appendChild(copyNode);
- // }
- //
- // return returnDocument;
- //
- // } catch (ParserConfigurationException e) {
- // this.LOG.error(e.getLocalizedMessage());
- // e.printStackTrace();
- // return null;
- // }
+ if (implArt.getName().equals(implementationArtifactName)) {
+ final List listOfAnyElements = new ArrayList<>();
+ for (final Object obj : implArt.getAny()) {
+ if (obj instanceof Element) {
+ listOfAnyElements.add((Element) obj);
+ } else {
+ ToscaEngineServiceImpl.LOG.error("There is content inside of the ImplementationArtifact \""
+ + implementationArtifactName + "\" of the NodeTypeImplementation \""
+ + nodeTypeImplementationID + "\" which is not a processable DOM Element.");
+ return null;
+ }
+ }
+ return ServiceHandler.xmlSerializerService.getXmlSerializer()
+ .elementsIntoDocument(listOfAnyElements,
+ "ImplementationArtifactSpecificContent");
+ }
}
}
}
@@ -1854,7 +1897,7 @@ public Document getPropertiesOfRelationshipTemplate(final CSARID csarID, final Q
* {@inheritDoc}
*/
public ResolvedArtifacts getResolvedArtifactsOfNodeTemplate(final CSARID csarID, final QName nodeTemplateID) {
- final List resolvedDAs = this.getNodeTemplateResolvedDAs(csarID, nodeTemplateID);
+ final List resolvedDAs = getNodeTemplateResolvedDAs(csarID, nodeTemplateID);
final ResolvedArtifacts result = new ResolvedArtifacts();
result.setDeploymentArtifacts(resolvedDAs);
@@ -1871,9 +1914,9 @@ public ResolvedArtifacts getResolvedArtifactsOfNodeTypeImplementation(final CSAR
// TODO: add debug logger
final List resolvedIAs =
- this.getNodeTypeImplResolvedIAs(csarID, nodeTypeImplementationID);
+ getNodeTypeImplResolvedIAs(csarID, nodeTypeImplementationID);
final List resolvedDAs =
- this.getNodeTypeImplResolvedDAs(csarID, nodeTypeImplementationID);
+ getNodeTypeImplResolvedDAs(csarID, nodeTypeImplementationID);
final ResolvedArtifacts result = new ResolvedArtifacts();
result.setDeploymentArtifacts(resolvedDAs);
@@ -1890,7 +1933,7 @@ public ResolvedArtifacts getResolvedArtifactsOfRelationshipTypeImplementation(fi
final QName nodeTypeImplementationID) {
// TODO: add debug logger
final List resolvedIAs =
- this.getRelationshipTypeImplResolvedIAs(csarID, nodeTypeImplementationID);
+ getRelationshipTypeImplResolvedIAs(csarID, nodeTypeImplementationID);
final List resolvedDAs = new ArrayList<>();
final ResolvedArtifacts result = new ResolvedArtifacts();
@@ -2031,7 +2074,7 @@ private List getNodeTemplateResolvedDAs(final CSARID
ra.setReferences(references);
} else {
artifactSpecificContent =
- this.getArtifactSpecificContentOfADeploymentArtifact(csarID, nodeTemplateID, deployArt.getName());
+ getArtifactSpecificContentOfADeploymentArtifact(csarID, nodeTemplateID, deployArt.getName());
ra.setArtifactSpecificContent(artifactSpecificContent);
}
@@ -2115,8 +2158,8 @@ private List getNodeTypeImplResolvedDAs(final CSARID
ra.setReferences(references);
} else {
artifactSpecificContent =
- this.getArtifactSpecificContentOfADeploymentArtifact(csarID, nodeTypeImplementationID,
- deployArt.getName());
+ getArtifactSpecificContentOfADeploymentArtifact(csarID, nodeTypeImplementationID,
+ deployArt.getName());
ra.setArtifactSpecificContent(artifactSpecificContent);
}
@@ -2197,9 +2240,9 @@ private List getNodeTypeImplResolvedIAs(final CS
ra.setReferences(references);
} else {
artifactSpecificContent =
- this.getArtifactSpecificContentOfAImplementationArtifactOfANodeTypeImplementation(csarID,
- nodeTypeImplementationID,
- implArt.getName());
+ getArtifactSpecificContentOfAImplementationArtifactOfANodeTypeImplementation(csarID,
+ nodeTypeImplementationID,
+ implArt.getName());
ra.setArtifactSpecificContent(artifactSpecificContent);
}
@@ -2276,9 +2319,9 @@ private List getRelationshipTypeImplResolvedIAs(
ra.setReferences(references);
} else {
artifactSpecificContent =
- this.getArtifactSpecificContentOfAImplementationArtifactOfARelationshipTypeImplementation(csarID,
- relationshipTypeImplementationID,
- implArt.getName());
+ getArtifactSpecificContentOfAImplementationArtifactOfARelationshipTypeImplementation(csarID,
+ relationshipTypeImplementationID,
+ implArt.getName());
ra.setArtifactSpecificContent(artifactSpecificContent);
}
@@ -2556,7 +2599,7 @@ public List getNodeTypeHierachy(final CSARID csarID, final QName nodeType
qnames.add(nodeType);
if (nodeTypeElement.getDerivedFrom() != null && nodeTypeElement.getDerivedFrom().getTypeRef() != null) {
- qnames.addAll(this.getNodeTypeHierachy(csarID, nodeTypeElement.getDerivedFrom().getTypeRef()));
+ qnames.addAll(getNodeTypeHierachy(csarID, nodeTypeElement.getDerivedFrom().getTypeRef()));
}
return qnames;
@@ -2574,9 +2617,9 @@ public List getNodeTypeImplementationTypeHierarchy(final CSARID csarID,
if (nodeTypeImplElement.getDerivedFrom() != null
&& nodeTypeImplElement.getDerivedFrom().getNodeTypeImplementationRef() != null) {
- qnames.addAll(this.getNodeTypeImplementationTypeHierarchy(csarID,
- nodeTypeImplElement.getDerivedFrom()
- .getNodeTypeImplementationRef()));
+ qnames.addAll(getNodeTypeImplementationTypeHierarchy(csarID,
+ nodeTypeImplElement.getDerivedFrom()
+ .getNodeTypeImplementationRef()));
}
return qnames;
@@ -2640,9 +2683,9 @@ public QName getRelationshipTemplateTarget(final CSARID csarId, final QName serv
if (((TRelationshipTemplate) entity).getTargetElement().getRef() instanceof TCapability) {
final TCapability cap = (TCapability) ((TRelationshipTemplate) entity).getTargetElement().getRef();
- if (this.resolveNodeTemplateFromCapability(csarId, serviceTemplateId, cap.getId()) != null) {
+ if (resolveNodeTemplateFromCapability(csarId, serviceTemplateId, cap.getId()) != null) {
return new QName(serviceTemplate.getTargetNamespace(),
- this.resolveNodeTemplateFromCapability(csarId, serviceTemplateId, cap.getId()).getId());
+ resolveNodeTemplateFromCapability(csarId, serviceTemplateId, cap.getId()).getId());
}
}
@@ -2669,9 +2712,9 @@ public QName getRelationshipTemplateSource(final CSARID csarId, final QName serv
(TRequirement) ((TRelationshipTemplate) entity).getSourceElement().getRef();
// resolve requirement to nodeTemplate
- if (this.resolveNodeTemplateFromRequirement(csarId, serviceTemplateId, req.getId()) != null) {
+ if (resolveNodeTemplateFromRequirement(csarId, serviceTemplateId, req.getId()) != null) {
return new QName(serviceTemplate.getTargetNamespace(),
- this.resolveNodeTemplateFromRequirement(csarId, serviceTemplateId, req.getId()).getId());
+ resolveNodeTemplateFromRequirement(csarId, serviceTemplateId, req.getId()).getId());
}
}
}
diff --git a/org.opentosca.container.engine.ia/src/org/opentosca/container/engine/ia/impl/IAEngineServiceImpl.java b/org.opentosca.container.engine.ia/src/org/opentosca/container/engine/ia/impl/IAEngineServiceImpl.java
index 6249297f1..08aa51a6a 100644
--- a/org.opentosca.container.engine.ia/src/org/opentosca/container/engine/ia/impl/IAEngineServiceImpl.java
+++ b/org.opentosca.container.engine.ia/src/org/opentosca/container/engine/ia/impl/IAEngineServiceImpl.java
@@ -68,7 +68,7 @@ public class IAEngineServiceImpl implements IIAEngineService {
public List deployImplementationArtifacts(final CSARID csarID, final QName serviceTemplateID) {
this.failedIAList.clear();
- this.deployServiceTemplate(csarID, serviceTemplateID);
+ deployServiceTemplate(csarID, serviceTemplateID);
return this.failedIAList;
}
@@ -83,13 +83,26 @@ private void deployServiceTemplate(final CSARID csarID, final QName serviceTempl
final List nodeTypeIDs =
this.toscaEngineService.getReferencedNodeTypesOfAServiceTemplate(csarID, serviceTemplateID);
-
for (final QName nodeTypeID : nodeTypeIDs) {
-
- this.deployNodeType(csarID, nodeTypeID);
-
+ deployNodeType(csarID, nodeTypeID);
}
+ final List relationshipTemplateIds =
+ this.toscaEngineService.getRelationshipTemplatesOfServiceTemplate(csarID, serviceTemplateID);
+ for (final String id : relationshipTemplateIds) {
+ final QName type =
+ this.toscaEngineService.getRelationshipTypeOfRelationshipTemplate(csarID, serviceTemplateID, id);
+ final List impls =
+ this.toscaEngineService.getRelationshipTypeImplementationsOfRelationshipType(csarID, type);
+ for (final QName impl : impls) {
+ final List artifacts =
+ this.toscaEngineService.getImplementationArtifactNamesOfRelationshipTypeImplementation(csarID,
+ impl);
+ for (final String artifact : artifacts) {
+ deployImplementationArtifact(csarID, impl, artifact, new ArrayList<>());
+ }
+ }
+ }
}
/**
@@ -105,10 +118,12 @@ private void deployNodeType(final CSARID csarID, final QName nodeTypeID) {
final List nodeTypeImplementationIDs =
this.toscaEngineService.getNodeTypeImplementationsOfNodeType(csarID, nodeTypeHierarchyMember);
+ final List temp =
+ this.toscaEngineService.getRelationshipTypeImplementationsOfRelationshipType(csarID,
+ nodeTypeHierarchyMember);
+ nodeTypeImplementationIDs.addAll(temp);
for (final QName nodeTypeImplementationID : nodeTypeImplementationIDs) {
-
- this.deployNodeTypeImplementation(csarID, nodeTypeImplementationID);
-
+ deployNodeTypeImplementation(csarID, nodeTypeImplementationID);
}
}
@@ -137,8 +152,8 @@ private void deployNodeTypeImplementation(final CSARID csarID, final QName nodeT
nodeTypeImplHierarchyMember);
for (final String implementationArtifactName : implementationArtifactNames) {
- this.deployImplementationArtifact(csarID, nodeTypeImplHierarchyMember, implementationArtifactName,
- requiredFeatures);
+ deployImplementationArtifact(csarID, nodeTypeImplHierarchyMember, implementationArtifactName,
+ requiredFeatures);
}
}
@@ -198,9 +213,8 @@ private void deployImplementationArtifact(final CSARID csarID, final QName nodeT
serviceURI = endpoints.get(0).getURI();
} else {
- serviceURI =
- this.deployThroughPlugin(csarID, nodeTypeImplementationID, artifactType, artifactSpecificContent,
- properties, propertyConstraints, artifacts, requiredFeatures);
+ serviceURI = deployThroughPlugin(csarID, nodeTypeImplementationID, artifactType, artifactSpecificContent,
+ properties, propertyConstraints, artifacts, requiredFeatures);
}
if (serviceURI != null) {
@@ -220,7 +234,6 @@ private void deployImplementationArtifact(final CSARID csarID, final QName nodeT
this.failedIAList.add(implementationArtifactName);
IAEngineServiceImpl.LOG.warn("Deployment of ImplementationArtifact {} failed!", implementationArtifactName);
}
-
}
/**
@@ -364,7 +377,7 @@ private QName getPortType(final Document properties) {
final Node propNode = list.item(i);
- if (this.containsPortType(propNode)) {
+ if (containsPortType(propNode)) {
final QName portType = this.getPortType(propNode);
IAEngineServiceImpl.LOG.info("PortType found: {}", portType.toString());
return portType;
diff --git a/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/BPELScopeBuilder.java b/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/BPELScopeBuilder.java
index 7e2689c5c..d546ec743 100644
--- a/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/BPELScopeBuilder.java
+++ b/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/BPELScopeBuilder.java
@@ -120,6 +120,47 @@ public static OperationChain createOperationChain(final AbstractRelationshipTemp
return chain;
}
+ /**
+ * TODO: We assume that IAs are already provisinoned on IA engine
+ *
+ * @param relationshipTemplate
+ * @param interfaceName
+ * @param operationName
+ * @return OperationChain
+ */
+ public static OperationChain createOperationCall(final AbstractRelationshipTemplate relationshipTemplate,
+ final String interfaceName, final String operationName) {
+
+ final List impls = relationshipTemplate.getImplementations();
+ if (impls.isEmpty()) {
+ BPELScopeBuilder.LOG.warn("No implementations available for RelationshipTemplate {} , can't generate Provisioning logic",
+ relationshipTemplate.getId());
+ return null;
+ }
+
+ final OperationChain chain = new OperationChain(relationshipTemplate);
+ chain.provCandidates = new ArrayList<>();
+
+ final List> provPlugins =
+ BPELScopeBuilder.pluginRegistry.getProvPlugins();
+
+ for (final AbstractRelationshipTypeImplementation impl : impls) {
+ final OperationNodeTypeImplCandidate provCandidate = new OperationNodeTypeImplCandidate();
+ for (final AbstractImplementationArtifact ia : impl.getImplementationArtifacts()) {
+ for (final IPlanBuilderProvPhaseOperationPlugin> plugin : provPlugins) {
+ if (plugin.canHandle(ia.getArtifactType())
+ && BPELScopeBuilder.getOperationForIa(chain.relationshipTemplate, ia, operationName) != null) {
+ provCandidate.add(BPELScopeBuilder.getOperationForIa(chain.relationshipTemplate, ia,
+ operationName),
+ ia, plugin);
+ }
+ }
+ }
+ chain.provCandidates.add(provCandidate);
+ }
+ return chain;
+ }
+
/**
* Creates a complete ProvisioningChain for the given NodeTemplate
*
@@ -552,17 +593,34 @@ private static AbstractOperation getOperationForIa(final AbstractNodeTemplate no
*/
private static AbstractOperation getOperationForIa(final AbstractRelationshipTemplate relationshipTemplate,
final AbstractImplementationArtifact ia) {
+ return getOperationForIa(relationshipTemplate, ia, ia.getOperationName());
+ }
+
+ private static AbstractOperation getOperationForIa(final AbstractRelationshipTemplate relationshipTemplate,
+ final AbstractImplementationArtifact ia,
+ final String operationNameFallback) {
+ String name = ia.getOperationName();
+ if (name == null) {
+ name = operationNameFallback;
+ }
+
for (final AbstractInterface iface : relationshipTemplate.getRelationshipType().getSourceInterfaces()) {
for (final AbstractOperation op : iface.getOperations()) {
- if (op.getName().equals(ia.getOperationName())) {
+ if (op.getName().equals(name)) {
return op;
}
}
}
-
for (final AbstractInterface iface : relationshipTemplate.getRelationshipType().getTargetInterfaces()) {
for (final AbstractOperation op : iface.getOperations()) {
- if (op.getName().equals(ia.getOperationName())) {
+ if (op.getName().equals(name)) {
+ return op;
+ }
+ }
+ }
+ for (final AbstractInterface iface : relationshipTemplate.getRelationshipType().getInterfaces()) {
+ for (final AbstractOperation op : iface.getOperations()) {
+ if (op.getName().equals(name)) {
return op;
}
}
diff --git a/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/context/BPELPlanContext.java b/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/context/BPELPlanContext.java
index afc5157db..93d052549 100644
--- a/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/context/BPELPlanContext.java
+++ b/org.opentosca.planbuilder.core.bpel/src/org/opentosca/planbuilder/core/bpel/context/BPELPlanContext.java
@@ -937,6 +937,43 @@ public String getNCNameFromString(final String string) {
return string.replace(" ", "_");
}
+ public boolean executeOperation(final AbstractRelationshipTemplate relationshipTemplate, final String interfaceName,
+ final String operationName, Map inputPropertyMapping,
+ Map outputPropertyMapping) {
+
+ if (inputPropertyMapping == null) {
+ inputPropertyMapping = new HashMap<>();
+ }
+ if (outputPropertyMapping == null) {
+ outputPropertyMapping = new HashMap<>();
+ }
+
+ final OperationChain chain =
+ BPELScopeBuilder.createOperationCall(relationshipTemplate, interfaceName, operationName);
+ if (chain == null) {
+ return false;
+ }
+
+ final List opNames = new ArrayList<>();
+ opNames.add(operationName);
+
+ final AbstractRelationshipTemplate relationBackup = this.templateBuildPlan.getRelationshipTemplate();
+ final AbstractNodeTemplate nodeBackup = this.templateBuildPlan.getNodeTemplate();
+
+ final BPELPlanContext context =
+ new BPELPlanContext(this.templateBuildPlan, this.propertyMap, this.serviceTemplate);
+
+ context.templateBuildPlan.setNodeTemplate(null);
+ context.templateBuildPlan.setRelationshipTemplate(relationshipTemplate);
+
+ chain.executeOperationProvisioning(context, opNames, inputPropertyMapping, outputPropertyMapping);
+
+ this.templateBuildPlan.setNodeTemplate(nodeBackup);
+ this.templateBuildPlan.setRelationshipTemplate(relationBackup);
+
+ return true;
+ }
+
public boolean executeOperation(final AbstractNodeTemplate nodeTemplate, final String interfaceName,
final String operationName,
final Map param2propertyMapping,
diff --git a/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TInterfaces.java b/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TInterfaces.java
new file mode 100644
index 000000000..c65e7f2b2
--- /dev/null
+++ b/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TInterfaces.java
@@ -0,0 +1,42 @@
+package org.oasis_open.docs.tosca.ns._2011._12;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {"_interface"})
+public class TInterfaces {
+
+ @XmlElement(name = "Interface", required = true)
+ protected List _interface;
+
+ public List getInterface() {
+ if (this._interface == null) {
+ this._interface = new ArrayList<>();
+ }
+ return this._interface;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final TInterfaces that = (TInterfaces) o;
+ return Objects.equals(this._interface, that._interface);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this._interface);
+ }
+}
diff --git a/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TRelationshipType.java b/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TRelationshipType.java
index c005d7ba1..353f04b87 100644
--- a/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TRelationshipType.java
+++ b/org.opentosca.planbuilder.importer/src/org/oasis_open/docs/tosca/ns/_2011/_12/TRelationshipType.java
@@ -83,12 +83,14 @@
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "tRelationshipType",
- propOrder = {"instanceStates", "sourceInterfaces", "targetInterfaces", "validSource", "validTarget"})
+@XmlType(name = "tRelationshipType", propOrder = {"instanceStates", "interfaces", "sourceInterfaces",
+ "targetInterfaces", "validSource", "validTarget"})
public class TRelationshipType extends TEntityType {
@XmlElement(name = "InstanceStates")
protected TTopologyElementInstanceStates instanceStates;
+ @XmlElement(name = "Interfaces", namespace = "http://www.opentosca.org/winery/extensions/tosca/2013/02/12")
+ protected TInterfaces interfaces;
@XmlElement(name = "SourceInterfaces")
protected TRelationshipType.SourceInterfaces sourceInterfaces;
@XmlElement(name = "TargetInterfaces")
@@ -118,6 +120,14 @@ public void setInstanceStates(final TTopologyElementInstanceStates value) {
this.instanceStates = value;
}
+ public TInterfaces getInterfaces() {
+ return this.interfaces;
+ }
+
+ public void setInterfaces(final TInterfaces interfaces) {
+ this.interfaces = interfaces;
+ }
+
/**
* Gets the value of the sourceInterfaces property.
*
diff --git a/org.opentosca.planbuilder.importer/src/org/opentosca/planbuilder/importer/context/impl/RelationshipTypeImpl.java b/org.opentosca.planbuilder.importer/src/org/opentosca/planbuilder/importer/context/impl/RelationshipTypeImpl.java
index 7c979af6f..8abe4e892 100644
--- a/org.opentosca.planbuilder.importer/src/org/opentosca/planbuilder/importer/context/impl/RelationshipTypeImpl.java
+++ b/org.opentosca.planbuilder.importer/src/org/opentosca/planbuilder/importer/context/impl/RelationshipTypeImpl.java
@@ -24,6 +24,7 @@ public class RelationshipTypeImpl extends AbstractRelationshipType {
private final TRelationshipType relationshipType;
private final DefinitionsImpl definitions;
+ private final List interfaces;
private final List sourceInterfaces;
private final List targetInterfaces;
@@ -37,15 +38,21 @@ public class RelationshipTypeImpl extends AbstractRelationshipType {
public RelationshipTypeImpl(final TRelationshipType relationshipType, final DefinitionsImpl definitionsImpl) {
this.relationshipType = relationshipType;
this.definitions = definitionsImpl;
+ this.interfaces = new ArrayList<>();
this.sourceInterfaces = new ArrayList<>();
this.targetInterfaces = new ArrayList<>();
- this.setUp();
+ setUp();
}
/**
* Initializes the internal Interfaces of this RelationshipType
*/
private void setUp() {
+ if (this.relationshipType.getInterfaces() != null) {
+ for (final TInterface i : this.relationshipType.getInterfaces().getInterface()) {
+ this.interfaces.add(new InterfaceImpl(this.definitions, i));
+ }
+ }
if (this.relationshipType.getSourceInterfaces() != null) {
for (final TInterface i : this.relationshipType.getSourceInterfaces().getInterface()) {
this.sourceInterfaces.add(new InterfaceImpl(this.definitions, i));
@@ -84,8 +91,8 @@ public String getName() {
@Override
public QName getId() {
String namespace;
- if (this.getTargetNamespace() != null && !this.getTargetNamespace().equals("")) {
- namespace = this.getTargetNamespace();
+ if (getTargetNamespace() != null && !getTargetNamespace().equals("")) {
+ namespace = getTargetNamespace();
} else {
namespace = this.definitions.getTargetNamespace();
}
@@ -106,9 +113,9 @@ public String getTargetNamespace() {
*/
@Override
public AbstractRelationshipType getReferencedType() {
- if (this.getTypeRef() != null) {
+ if (getTypeRef() != null) {
for (final AbstractRelationshipType relation : this.definitions.getAllRelationshipTypes()) {
- if (relation.getId().equals(this.getTypeRef())) {
+ if (relation.getId().equals(getTypeRef())) {
return relation;
}
}
@@ -117,6 +124,14 @@ public AbstractRelationshipType getReferencedType() {
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List getInterfaces() {
+ return this.interfaces;
+ }
+
/**
* {@inheritDoc}
*/
diff --git a/org.opentosca.planbuilder.model/src/org/opentosca/planbuilder/model/tosca/AbstractRelationshipType.java b/org.opentosca.planbuilder.model/src/org/opentosca/planbuilder/model/tosca/AbstractRelationshipType.java
index 4fac97b8c..1ec348733 100644
--- a/org.opentosca.planbuilder.model/src/org/opentosca/planbuilder/model/tosca/AbstractRelationshipType.java
+++ b/org.opentosca.planbuilder.model/src/org/opentosca/planbuilder/model/tosca/AbstractRelationshipType.java
@@ -21,6 +21,13 @@ public abstract class AbstractRelationshipType extends AbstractEntityType {
*/
public abstract AbstractRelationshipType getReferencedType();
+ /**
+ * Returns all Interfaces of this RelationshipType
+ *
+ * @return a List of AbstractInterfaces
+ */
+ public abstract List getInterfaces();
+
/**
* Returns all Interfaces on the Source of this RelationshipType
*
diff --git a/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/Activator.java b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/Activator.java
index d1280bae4..20fa46603 100644
--- a/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/Activator.java
+++ b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/Activator.java
@@ -1,6 +1,10 @@
package org.opentosca.planbuilder.type.plugin.connectsto;
+import java.util.ArrayList;
+import java.util.List;
+
import org.opentosca.planbuilder.plugins.IPlanBuilderTypePlugin;
+import org.opentosca.planbuilder.type.plugin.connectsto.bpel.BPELConfigureRelationsPlugin;
import org.opentosca.planbuilder.type.plugin.connectsto.bpel.BPELConnectsToPlugin;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
@@ -17,34 +21,25 @@ public class Activator implements BundleActivator {
private static BundleContext context;
- private ServiceRegistration registration;
+ private final List> registrations = new ArrayList<>();
static BundleContext getContext() {
return Activator.context;
}
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext )
- */
@Override
public void start(final BundleContext bundleContext) throws Exception {
- Activator.context = bundleContext;
- this.registration =
- Activator.context.registerService(IPlanBuilderTypePlugin.class.getName(), new BPELConnectsToPlugin(), null);
+ context = bundleContext;
+ this.registrations.add(bundleContext.registerService(IPlanBuilderTypePlugin.class.getName(),
+ new BPELConnectsToPlugin(), null));
+ this.registrations.add(bundleContext.registerService(IPlanBuilderTypePlugin.class.getName(),
+ new BPELConfigureRelationsPlugin(), null));
}
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
@Override
public void stop(final BundleContext bundleContext) throws Exception {
Activator.context = null;
- this.registration.unregister();
+ this.registrations.forEach(e -> e.unregister());
}
-
}
diff --git a/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/BPELConfigureRelationsPlugin.java b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/BPELConfigureRelationsPlugin.java
new file mode 100644
index 000000000..43c36f24a
--- /dev/null
+++ b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/BPELConfigureRelationsPlugin.java
@@ -0,0 +1,16 @@
+package org.opentosca.planbuilder.type.plugin.connectsto.bpel;
+
+import org.opentosca.planbuilder.core.bpel.context.BPELPlanContext;
+import org.opentosca.planbuilder.type.plugin.connectsto.bpel.handler.BPELConfigureRelationsPluginHandler;
+import org.opentosca.planbuilder.type.plugin.connectsto.core.ConfigureRelationsPlugin;
+import org.opentosca.planbuilder.type.plugin.connectsto.core.handler.ConnectsToPluginHandler;
+
+public class BPELConfigureRelationsPlugin extends ConfigureRelationsPlugin {
+
+ private final ConnectsToPluginHandler handler = new BPELConfigureRelationsPluginHandler();
+
+ @Override
+ public boolean handle(final BPELPlanContext templateContext) {
+ return this.handler.handle(templateContext);
+ }
+}
diff --git a/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/handler/BPELConfigureRelationsPluginHandler.java b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/handler/BPELConfigureRelationsPluginHandler.java
new file mode 100644
index 000000000..65231de20
--- /dev/null
+++ b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/bpel/handler/BPELConfigureRelationsPluginHandler.java
@@ -0,0 +1,115 @@
+package org.opentosca.planbuilder.type.plugin.connectsto.bpel.handler;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.opentosca.planbuilder.core.bpel.context.BPELPlanContext;
+import org.opentosca.planbuilder.model.tosca.AbstractInterface;
+import org.opentosca.planbuilder.model.tosca.AbstractNodeTemplate;
+import org.opentosca.planbuilder.model.tosca.AbstractOperation;
+import org.opentosca.planbuilder.model.tosca.AbstractParameter;
+import org.opentosca.planbuilder.model.tosca.AbstractRelationshipTemplate;
+import org.opentosca.planbuilder.model.utils.ModelUtils;
+import org.opentosca.planbuilder.plugins.context.Variable;
+import org.opentosca.planbuilder.type.plugin.connectsto.core.ConfigureRelationsPlugin;
+import org.opentosca.planbuilder.type.plugin.connectsto.core.handler.ConnectsToPluginHandler;
+
+public class BPELConfigureRelationsPluginHandler implements ConnectsToPluginHandler {
+
+ @Override
+ public boolean handle(final BPELPlanContext templateContext) {
+ final AbstractRelationshipTemplate relationTemplate = templateContext.getRelationshipTemplate();
+ final AbstractNodeTemplate sourceNodeTemplate = relationTemplate.getSource();
+ final AbstractNodeTemplate targetNodeTemplate = relationTemplate.getTarget();
+
+ if (hasOperation(relationTemplate, ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_SOURCE)) {
+ final AbstractOperation op =
+ getOperation(relationTemplate, ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_SOURCE);
+ final Map input =
+ findInputParameters(templateContext, op, relationTemplate, sourceNodeTemplate, targetNodeTemplate);
+ templateContext.executeOperation(relationTemplate, ConfigureRelationsPlugin.INTERFACE_NAME,
+ ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_SOURCE, input, null);
+ }
+
+ if (hasOperation(relationTemplate, ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_TARGET)) {
+ final AbstractOperation op =
+ getOperation(relationTemplate, ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_TARGET);
+ final Map input =
+ findInputParameters(templateContext, op, relationTemplate, sourceNodeTemplate, targetNodeTemplate);
+ templateContext.executeOperation(relationTemplate, ConfigureRelationsPlugin.INTERFACE_NAME,
+ ConfigureRelationsPlugin.OPERATION_POST_CONFIGURE_TARGET, input, null);
+ }
+
+ return true;
+ }
+
+ private boolean hasOperation(final AbstractRelationshipTemplate template, final String name) {
+ return getOperation(template, name) != null;
+ }
+
+ private AbstractOperation getOperation(final AbstractRelationshipTemplate template, final String name) {
+ for (final AbstractInterface i : template.getRelationshipType().getInterfaces()) {
+ for (final AbstractOperation op : i.getOperations()) {
+ if (op.getName().equals(name)) {
+ return op;
+ }
+ }
+ }
+ return null;
+ }
+
+ private Map findInputParameters(final BPELPlanContext templateContext,
+ final AbstractOperation op,
+ final AbstractRelationshipTemplate relationshipTemplate,
+ final AbstractNodeTemplate sourceNodeTemplate,
+ final AbstractNodeTemplate targetNodeTemplate) {
+ final Map parameters = new HashMap<>();
+ for (final AbstractParameter p : op.getInputParameters()) {
+ // Search parameter in RelationshipTemplate
+ Variable v = templateContext.getPropertyVariable(templateContext.getRelationshipTemplate(), p.getName());
+ if (v != null) {
+ parameters.put(p, v);
+ } else {
+ // Search parameter in NodeTemplate
+ if (!parameters.containsKey(p)) {
+ // Try source stack first
+ v = findPropertyInTopology(templateContext, sourceNodeTemplate, p.getName());
+ if (v != null) {
+ parameters.put(p, v);
+ } else {
+ // Try target stack
+ v = findPropertyInTopology(templateContext, targetNodeTemplate, p.getName());
+ if (v != null) {
+ parameters.put(p, v);
+ }
+ }
+ }
+ }
+ }
+ return parameters;
+ }
+
+ private Variable findPropertyInTopology(final BPELPlanContext templateContext, final AbstractNodeTemplate node,
+ final String name) {
+ AbstractNodeTemplate n = node;
+ while (n != null) {
+ final Variable v = templateContext.getPropertyVariable(n, name);
+ if (v != null) {
+ return v;
+ } else {
+ n = getNextNodeTemplate(n);
+ }
+ }
+ return null;
+ }
+
+ private AbstractNodeTemplate getNextNodeTemplate(final AbstractNodeTemplate node) {
+ for (final AbstractRelationshipTemplate r : node.getOutgoingRelations()) {
+ if (ModelUtils.getRelationshipTypeHierarchy(r.getRelationshipType())
+ .contains(ModelUtils.TOSCABASETYPE_HOSTEDON)) {
+ return r.getTarget();
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/core/ConfigureRelationsPlugin.java b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/core/ConfigureRelationsPlugin.java
new file mode 100644
index 000000000..12f0da115
--- /dev/null
+++ b/org.opentosca.planbuilder.type.plugin.connectsto/src/org/opentosca/planbuilder/type/plugin/connectsto/core/ConfigureRelationsPlugin.java
@@ -0,0 +1,38 @@
+package org.opentosca.planbuilder.type.plugin.connectsto.core;
+
+import java.util.List;
+
+import org.opentosca.planbuilder.model.tosca.AbstractInterface;
+import org.opentosca.planbuilder.model.tosca.AbstractNodeTemplate;
+import org.opentosca.planbuilder.model.tosca.AbstractRelationshipTemplate;
+import org.opentosca.planbuilder.plugins.IPlanBuilderTypePlugin;
+import org.opentosca.planbuilder.plugins.context.PlanContext;
+
+public abstract class ConfigureRelationsPlugin implements IPlanBuilderTypePlugin {
+
+ public static final String INTERFACE_NAME =
+ "http://docs.oasis-open.org/tosca/ns/2011/12/interfaces/relationship/configure";
+ public static final String OPERATION_POST_CONFIGURE_SOURCE = "postConfigureSource";
+ public static final String OPERATION_POST_CONFIGURE_TARGET = "postConfigureTarget";
+
+ @Override
+ public boolean canHandle(final AbstractNodeTemplate nodeTemplate) {
+ return false;
+ }
+
+ @Override
+ public boolean canHandle(final AbstractRelationshipTemplate relationshipTemplate) {
+ final List interfaces = relationshipTemplate.getRelationshipType().getInterfaces();
+ for (final AbstractInterface i : interfaces) {
+ if (i.getName().equalsIgnoreCase(INTERFACE_NAME)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getID() {
+ return getClass().getCanonicalName();
+ }
+}