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(); + } +}