From 90f8d31ee63e437972386dd7612c4f2d9d05fd57 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Thu, 16 Nov 2023 16:59:10 +0100 Subject: [PATCH 01/18] add endpoint for completing deployment models based on requirement and capabilities --- .../adaptation/placement/PlacementUtils.java | 54 +++++- .../TopologyTemplateResource.java | 19 ++ .../splitting/ProviderRepository.java | 54 +++++- .../repository/splitting/Splitting.java | 163 ++++++++++++++++++ 4 files changed, 283 insertions(+), 7 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 94d1e13f92..1c5e8efb0a 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -104,7 +104,7 @@ public static TTopologyTemplate groupAndPlaceComponents(ServiceTemplateId servic topology = deepCopy(topologyBackup, false); assignToLocation(topology, blackList); assignToProviders(topology, blackList); - completedTopology = completeModel(serviceTemplateId, topology, blackList); + completedTopology = completeModel(serviceTemplateId, topology); } return completedTopology; } @@ -116,13 +116,10 @@ public static TTopologyTemplate groupAndPlaceComponents(ServiceTemplateId servic * * @param serviceTemplateId the ID of the ServiceTemplate to complete * @param topology the incomplete TopologyTemplate to complete - * @param blackList the black list containing the NodeTemplates with the providers that are not usable for - * them * @return the completed TopologyTemplate if completion is successful, the cleared and blacklisted TopologyTemplate * otherwise */ - private static TTopologyTemplate completeModel(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology, - Map> blackList) { + public static TTopologyTemplate completeModel(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { Splitting splitting = new Splitting(); IRepository repo = RepositoryFactory.getRepository(); @@ -637,4 +634,51 @@ private static String getNextProvider(HashMap> provi } return bestProv; } + + /** + * Completes the model based on given nodetype requirements. + * + * @param serviceTemplateId the ID of the ServiceTemplate to complete + * @param topology the incomplete TopologyTemplate to complete + * @return the completed TopologyTemplate if completion is successful, the cleared and blacklisted TopologyTemplate + * otherwise + */ + public static TTopologyTemplate completeModelBasedOnReqs(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { + Splitting splitting = new Splitting(); + IRepository repo = RepositoryFactory.getRepository(); + + try { + // create new temporary ServiceTemplate as working copy + ServiceTemplateId placementId = new ServiceTemplateId(serviceTemplateId.getNamespace().getDecoded(), + VersionSupport.getNewComponentVersionId(serviceTemplateId, "placement"), false); + repo.forceDelete(placementId); + TServiceTemplate placementServiceTemplate = new TServiceTemplate.Builder(placementId.getXmlId().getDecoded(), topology) + .setName(placementId.getXmlId().getDecoded()) + .setTargetNamespace(serviceTemplateId.getNamespace().getDecoded()) + .build(); + + // resolve open requirements until the topology is completed + while (topology != null && !splitting.getOpenRequirements(placementServiceTemplate).isEmpty()) { + // add a target label to the topology based on the provider and location assignment + assignNodesToTargetLabels(topology); + placementServiceTemplate.setTopologyTemplate(topology); + repo.setElement(placementId, placementServiceTemplate); + + // complete next level of requirements + ServiceTemplateId newServiceTemplateId = splitting.completeNextRequirement(placementId); + topology = repo.getElement(newServiceTemplateId).getTopologyTemplate(); + + // delete intermediate result to avoid cluttering + repo.forceDelete(placementId); + placementId = newServiceTemplateId; + } +// repo.forceDelete(placementId); + + // returned completed topology + return topology; + } catch (Exception e) { + LOGGER.error("Exception while completing topology: {}", e.getMessage()); + return topology; + } + } } diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java index 5f09867e81..2ffb7b8cf9 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java @@ -597,4 +597,23 @@ public Response applyGroupingAndPlacement(@Context UriInfo uriInfo) { return Response.serverError().entity(e.getMessage()).build(); } } + + @POST + @Path("completemodel") + @Produces(MediaType.APPLICATION_JSON) + public Response completeModel(@Context UriInfo uriInfo) { + try { + TTopologyTemplate topology = + PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate); + this.parent.setTopology(topology, this.type); + // TODO check - do not overwrite servicetemplate +// RestUtils.persist(this.parent); + ServiceTemplateId thisServiceTemplateId = (ServiceTemplateId) this.parent.getId(); + URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(thisServiceTemplateId)); + return Response.created(url).build(); + } catch (InvalidParameterException e) { + LOGGER.debug("Error while completing model: {}", e.getMessage()); + return Response.serverError().entity(e.getMessage()).build(); + } + } } diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/ProviderRepository.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/ProviderRepository.java index f1ab5915f4..bf51c6a04a 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/ProviderRepository.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/ProviderRepository.java @@ -27,6 +27,7 @@ import org.eclipse.winery.model.ids.definitions.RequirementTypeId; import org.eclipse.winery.model.ids.definitions.ServiceTemplateId; +import org.eclipse.winery.model.tosca.TCapability; import org.eclipse.winery.model.tosca.TEntityTemplate; import org.eclipse.winery.model.tosca.TNodeTemplate; import org.eclipse.winery.model.tosca.TRelationshipTemplate; @@ -40,7 +41,7 @@ public class ProviderRepository { public static final ProviderRepository INSTANCE = new ProviderRepository(); - private static final String NS_NAME_START = "http://www.opentosca.org/providers/"; + private static final String NS_NAME_START = "http://quantil.org"; /** * Pointing to a concrete node template has to be done by putting this node template into a separate namespace

@@ -55,12 +56,21 @@ public List getAllTopologyFragmentsForLocationAndOfferingCapab RequirementTypeId reqTypeId = new RequirementTypeId(reqTypeQName); QName requiredCapabilityType = RepositoryFactory.getRepository().getElement(reqTypeId).getRequiredCapabilityType(); + ArrayList testcap = new ArrayList<>(); + System.out.println(testcap); return getAllTopologyFragmentsForLocation(targetLocation).stream() + .filter(tf -> { + assert tf.getName() != null; + return !tf.getName().contains("placement"); + }) .filter(tf -> getNodesWithOpenCapabilities(tf.getTopologyTemplate()) != null) .filter(tf -> getNodesWithOpenCapabilities(tf.getTopologyTemplate()).stream() .anyMatch(nt -> nt.getCapabilities().stream() - .anyMatch(cap -> cap.getType().equals(requiredCapabilityType)) + .anyMatch(cap -> { + testcap.add(cap); + return cap.getType().equals(requiredCapabilityType); + }) ) ) .collect(Collectors.toList()); @@ -174,4 +184,44 @@ private List breadthFirstSearch(TNodeTemplate nodeTemplate, TTo } return topologyFragmentElements; } + + public List getNodeTemplatesForCapability(String targetLocation, TRequirement requirement) { + QName reqTypeQName = requirement.getType(); + RequirementTypeId reqTypeId = new RequirementTypeId(reqTypeQName); + QName requiredCapabilityType = RepositoryFactory.getRepository().getElement(reqTypeId).getRequiredCapabilityType(); + + ArrayList testcap = new ArrayList<>(); + System.out.println(testcap); + List matchingServiceTemplates = getAllTopologyFragmentsForLocation(targetLocation).stream() + .filter(tf -> { + assert tf.getName() != null; + return !tf.getName().contains("placement"); + }) + .filter(tf -> + { + assert tf.getTopologyTemplate() != null; + return getNodesWithOpenCapabilities(tf.getTopologyTemplate()) != null; + }) + .filter(tf -> getNodesWithOpenCapabilities(tf.getTopologyTemplate()).stream() + .anyMatch(nt -> nt.getCapabilities().stream() + .anyMatch(cap -> { + testcap.add(cap); + return cap.getType().equals(requiredCapabilityType); + }) + ) + ) + .toList(); + + List matchingNodeTemplates = new ArrayList<>(); + matchingServiceTemplates.forEach( st -> { + assert st.getTopologyTemplate() != null; + List ntFullfillingCaps = getNodesWithOpenCapabilities(st.getTopologyTemplate()).stream() + .filter(nt -> nt.getCapabilities().stream() + .anyMatch(cap -> cap.getType().equals(requiredCapabilityType)) + ).toList(); + matchingNodeTemplates.addAll(ntFullfillingCaps); + }); + + return matchingNodeTemplates; + } } diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 075bf701c2..780ec3d1d7 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; import java.util.SortedSet; +import java.util.UUID; import java.util.stream.Collectors; import javax.xml.namespace.QName; @@ -1713,4 +1714,166 @@ private boolean equalsWithDifferentId(TNodeTemplate node1, TNodeTemplate node2) Objects.equals(node1.getMinInstances(), node2.getMinInstances()) && Objects.equals(node1.getMaxInstances(), node2.getMaxInstances()); } + + /** + * Splits the topology template of the given service template. Creates a new service template with "-split" suffix + * as id. Any existing "-split" service template will be deleted. Matches the split topology template to the cloud + * providers according to the target labels. Creates a new service template with "-matched" suffix as id. Any + * existing "-matched" service template will be deleted. + * + * @param id of the ServiceTemplate switch should be split and matched to cloud providers + * @return id of the ServiceTemplate which contains the matched topology + */ + public ServiceTemplateId completeNextRequirement(ServiceTemplateId id) throws Exception { + long start = System.currentTimeMillis(); + IRepository repository = RepositoryFactory.getRepository(); + + TServiceTemplate serviceTemplate = repository.getElement(id); + TTopologyTemplate topologyTemplate = serviceTemplate.getTopologyTemplate(); + + /* + Get all open requirements and the basis type of the required capability type + "Container" which means a hostedOn injection is required + */ + Map requirementsAndMatchingBasisCapabilityTypes = + getOpenRequirementsAndMatchingBasisCapabilityTypeNames(serviceTemplate); + // Output check + LOGGER.debug("Matching for ServiceTemplate with ID: {}", id.getQName()); + for (TRequirement req : requirementsAndMatchingBasisCapabilityTypes.keySet()) { + LOGGER.debug("Open Requirement: {}", req.getId()); + LOGGER.debug("Matching basis type: {}", requirementsAndMatchingBasisCapabilityTypes.get(req)); + } + + // create wrapper service template + ServiceTemplateId matchedServiceTemplateId = new ServiceTemplateId( + id.getNamespace().getDecoded(), + VersionSupport.getNewComponentVersionId(id, "matched"), + false); + RepositoryFactory.getRepository().forceDelete(matchedServiceTemplateId); + RepositoryFactory.getRepository().flagAsExisting(matchedServiceTemplateId); + repository.flagAsExisting(matchedServiceTemplateId); + TServiceTemplate matchedServiceTemplate = BackendUtils.clone(serviceTemplate); + matchedServiceTemplate.setName(matchedServiceTemplateId.getXmlId().getDecoded()); + matchedServiceTemplate.setId(matchedServiceTemplate.getName()); + matchedServiceTemplate.setTargetNamespace(id.getNamespace().getDecoded()); + matchedServiceTemplate.setTags(serviceTemplate.getTags()); + topologyTemplate.getNodeTemplates().forEach(t -> ModelUtilities.setTargetLabel(t, "*")); + matchedServiceTemplate.setTopologyTemplate(getMatchingTopology(BackendUtils.clone(matchedServiceTemplate))); + + TTopologyTemplate daSpecifiedTopology = matchedServiceTemplate.getTopologyTemplate(); + + matchedServiceTemplate.setTopologyTemplate(daSpecifiedTopology); + LOGGER.debug("Persisting..."); + repository.setElement(matchedServiceTemplateId, matchedServiceTemplate); + LOGGER.debug("Persisted."); + + long duration = System.currentTimeMillis() - start; + LOGGER.debug("Execution Time in millisec: " + duration + "ms"); + + return matchedServiceTemplateId; + } + +// public TTopologyTemplate retrieveMatchingCapabilitiy(TServiceTemplate serviceTemplate) throws +// SplittingException { +// TServiceTemplate newServiceTemplate = BackendUtils.clone(serviceTemplate); +// return getMatchingServiceTemplates(newServiceTemplate); +// } + + public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) throws + SplittingException { + ProviderRepository repository = new ProviderRepository(); + List lowLevelNodeTemplates = getNodeTemplatesWithoutOutgoingHostedOnRelationships(serviceTemplate); + List nodesToCheck = new ArrayList<>(); + + //Find lowest level nodes with open requirements which means they can be hosted by an other component + for (TNodeTemplate nodeTemplateCandidate : lowLevelNodeTemplates) { + if (hasNodeOpenRequirement(serviceTemplate, nodeTemplateCandidate)) { + if (nodeTemplateCandidate.getRequirements() != null && nodeTemplateCandidate.getRequirements().stream() +// .anyMatch(req -> getBasisCapabilityType(getRequiredCapabilityTypeQNameOfRequirement(req)).getName().equalsIgnoreCase("Container"))) { + .anyMatch(req -> true)) { + nodesToCheck.add(nodeTemplateCandidate); + } + } + } + + TTopologyTemplate topologyToComplete = serviceTemplate.getTopologyTemplate(); + + LOGGER.debug("Start..."); + if (!nodesToCheck.isEmpty()) { + //Check all lowest level nodes with open requirements if a compatible node is available + for (TNodeTemplate needHostNode : nodesToCheck) { + Optional label = ModelUtilities.getTargetLabel(needHostNode); + if (!label.isPresent()) { + LOGGER.error("No target label present"); + LOGGER.error("id " + needHostNode.getId()); + throw new SplittingException("No target label present for Node Template " + needHostNode.getId()); + } + + //noinspection OptionalGetWithoutIsPresent + String targetLabel = ModelUtilities.getTargetLabel(needHostNode).get(); + +// List openHostedOnRequirements = needHostNode.getRequirements().stream() +// .filter(req -> getBasisCapabilityType(getRequiredCapabilityTypeQNameOfRequirement(req)).getName().equalsIgnoreCase("Container")).toList(); + List openHostedOnRequirements = needHostNode.getRequirements(); + + for (TRequirement requirement: openHostedOnRequirements) { + List compatibleNodeTemplates = repository + .getNodeTemplatesForCapability(targetLabel, requirement); + + LOGGER.debug("Found {} compatible topology fragments for NodeTemplate {}", + compatibleNodeTemplates.size(), needHostNode.getId()); + + // TODO do proper selection based on policies + TNodeTemplate selectedTemplate = compatibleNodeTemplates.get(0); + + // check if suitable nodetemplate already exists in topology, if so reuse it instead of creating new one. + assert topologyToComplete != null; + for( TNodeTemplate nt: topologyToComplete.getNodeTemplates()){ + if (nt.getType().equals(selectedTemplate.getType())){ + selectedTemplate = nt; + } + } + + topologyToComplete.addNodeTemplate(selectedTemplate); + + TRelationshipTemplate newHostedOnRelationship = new TRelationshipTemplate(); + String id = UUID.randomUUID().toString(); + newHostedOnRelationship.setId(id); + newHostedOnRelationship.setName("hostedOn"); + + TRelationshipTemplate.SourceOrTargetElement sourceElement = new TRelationshipTemplate.SourceOrTargetElement(); + TRelationshipTemplate.SourceOrTargetElement targetElement = new TRelationshipTemplate.SourceOrTargetElement(); + sourceElement.setRef(needHostNode); + targetElement.setRef(selectedTemplate); + newHostedOnRelationship.setSourceElement(sourceElement); + newHostedOnRelationship.setTargetElement(targetElement); + QName reqTypeQName = requirement.getType(); + RequirementTypeId reqTypeId = new RequirementTypeId(reqTypeQName); + QName requiredCapabilityType = RepositoryFactory.getRepository().getElement(reqTypeId).getRequiredCapabilityType(); + TCapability requiredCapability = selectedTemplate.getCapabilities().stream().filter(cap -> cap.getType().equals(requiredCapabilityType)).toList().get(0); +// TRelationshipType relationshipType = getMatchingRelationshipType(requirement, requiredCapability); + + SortedSet relTypeIds = RepositoryFactory.getRepository().getAllDefinitionsChildIds(RelationshipTypeId.class); + List relationshipTypes = new ArrayList<>(); + for (RelationshipTypeId typeId : relTypeIds) { + relationshipTypes.add(RepositoryFactory.getRepository().getElement(typeId)); + } + //TODO do proper relation selection + TRelationshipType relationshipType = relationshipTypes.stream().filter(type -> { + assert type.getName() != null; + return type.getName().equals("HostedOn"); + }).toList().get(0); + + if (relationshipType != null) { + assert relationshipType.getName() != null; + QName relationshipTypeQName = new QName(relationshipType.getTargetNamespace(), relationshipType.getName()); + newHostedOnRelationship.setType(relationshipTypeQName); + topologyToComplete.addRelationshipTemplate(newHostedOnRelationship); + } + } + } + } + return topologyToComplete; + } + } From fda9e635c888ac98e1630da36c5ce0ca7d6ae47d Mon Sep 17 00:00:00 2001 From: mbeisel Date: Thu, 16 Nov 2023 17:29:44 +0100 Subject: [PATCH 02/18] removed unnecessary code --- .../model/adaptation/placement/PlacementUtils.java | 1 + .../winery/repository/splitting/Splitting.java | 12 ------------ 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 1c5e8efb0a..0bf0cc0d3e 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -675,6 +675,7 @@ public static TTopologyTemplate completeModelBasedOnReqs(ServiceTemplateId servi // repo.forceDelete(placementId); // returned completed topology + LOGGER.debug("bla {}",placementId); return topology; } catch (Exception e) { LOGGER.error("Exception while completing topology: {}", e.getMessage()); diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 780ec3d1d7..7860301b35 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1731,18 +1731,6 @@ public ServiceTemplateId completeNextRequirement(ServiceTemplateId id) throws Ex TServiceTemplate serviceTemplate = repository.getElement(id); TTopologyTemplate topologyTemplate = serviceTemplate.getTopologyTemplate(); - /* - Get all open requirements and the basis type of the required capability type - "Container" which means a hostedOn injection is required - */ - Map requirementsAndMatchingBasisCapabilityTypes = - getOpenRequirementsAndMatchingBasisCapabilityTypeNames(serviceTemplate); - // Output check - LOGGER.debug("Matching for ServiceTemplate with ID: {}", id.getQName()); - for (TRequirement req : requirementsAndMatchingBasisCapabilityTypes.keySet()) { - LOGGER.debug("Open Requirement: {}", req.getId()); - LOGGER.debug("Matching basis type: {}", requirementsAndMatchingBasisCapabilityTypes.get(req)); - } // create wrapper service template ServiceTemplateId matchedServiceTemplateId = new ServiceTemplateId( From 07e3ad233890928821d9db4afdbe4da594221782 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Fri, 17 Nov 2023 13:51:18 +0100 Subject: [PATCH 03/18] add complete and equivalencycheck endpoints --- .../adaptation/placement/PlacementUtils.java | 66 +++++++++++++++++-- .../CompletionInputData.java | 46 +++++++++++++ .../TopologyTemplateResource.java | 42 +++++++++--- .../repository/splitting/Splitting.java | 29 ++++---- 4 files changed, 151 insertions(+), 32 deletions(-) create mode 100644 org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 0bf0cc0d3e..bc847dbd58 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -28,6 +28,8 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import javax.xml.namespace.QName; + import org.eclipse.winery.model.ids.definitions.ServiceTemplateId; import org.eclipse.winery.model.tosca.TEntityTemplate; import org.eclipse.winery.model.tosca.TNodeTemplate; @@ -643,7 +645,7 @@ private static String getNextProvider(HashMap> provi * @return the completed TopologyTemplate if completion is successful, the cleared and blacklisted TopologyTemplate * otherwise */ - public static TTopologyTemplate completeModelBasedOnReqs(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { + public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology, List blacklist, Map policies) { Splitting splitting = new Splitting(); IRepository repo = RepositoryFactory.getRepository(); @@ -665,21 +667,71 @@ public static TTopologyTemplate completeModelBasedOnReqs(ServiceTemplateId servi repo.setElement(placementId, placementServiceTemplate); // complete next level of requirements - ServiceTemplateId newServiceTemplateId = splitting.completeNextRequirement(placementId); + ServiceTemplateId newServiceTemplateId = splitting.completeNextRequirement(placementId, blacklist, policies); topology = repo.getElement(newServiceTemplateId).getTopologyTemplate(); // delete intermediate result to avoid cluttering repo.forceDelete(placementId); placementId = newServiceTemplateId; } -// repo.forceDelete(placementId); - // returned completed topology - LOGGER.debug("bla {}",placementId); - return topology; + // returned completed topologyId + return placementId; } catch (Exception e) { LOGGER.error("Exception while completing topology: {}", e.getMessage()); - return topology; + return null; } } + + /** + * Checks if the repository contains equivalent servicetemplates + * + * @param serviceTemplateId Id of the servicetemplate to check for equivalency + * @param topology topology of the servicetemplate to check for equivalency + * @return + */ + public static List checkServiceTemplateForEquivalency(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { + Splitting splitting = new Splitting(); + IRepository repo = RepositoryFactory.getRepository(); + TServiceTemplate serviceTemplate = RepositoryFactory.getRepository().getElement(serviceTemplateId); + List nodeTemplates = topology.getNodeTemplates(); + List relationshipTemplates = topology.getRelationshipTemplates(); + + List equivalentServiceTemplateIds = RepositoryFactory.getRepository().getAllDefinitionsChildIds(ServiceTemplateId.class).stream() + // get all contained node templates + .filter(id -> { + TServiceTemplate serviceTemplateFilter = RepositoryFactory.getRepository().getElement(id); + TTopologyTemplate topologyTemplateFilter = serviceTemplateFilter.getTopologyTemplate(); + + assert topologyTemplateFilter != null; + if (topology.getNodeTemplateOrRelationshipTemplate().size() != topologyTemplateFilter.getNodeTemplateOrRelationshipTemplate().size()){ + return false; + } + List nodeTemplatesFilter = topologyTemplateFilter.getNodeTemplates(); + if (nodeTemplates.stream().anyMatch( nt -> !nodeTemplatesFilter.contains(nt))){ + return false; + } + List relationshipTemplatesFilter = topologyTemplateFilter.getRelationshipTemplates(); + if (relationshipTemplates.stream().anyMatch( rt -> !relationshipTemplatesFilter.contains(rt))){ + return false; + } + return true; + }) + .toList(); + + return equivalentServiceTemplateIds; + } + + /** + * Checks if the a given servicetemplate is complete + * + * @param serviceTemplateId Id of the servicetemplate to check for equivalency + * @param topology topology of the servicetemplate to check for equivalency + * @return true if deployment model is complete, false if incomplete + */ + public static boolean checkIfDeploymentModelIsComplete(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { + Splitting splitting = new Splitting(); + TServiceTemplate serviceTemplate = RepositoryFactory.getRepository().getElement(serviceTemplateId); + return splitting.getOpenRequirements(serviceTemplate).isEmpty(); + } } diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java new file mode 100644 index 0000000000..9326221e67 --- /dev/null +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + +package org.eclipse.winery.repository.rest.resources.servicetemplates.topologytemplates; + +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; + +public class CompletionInputData { + // Nodetypes not allowed due to, e.g., unfulfilled requirements + private List blacklistedNodetypes; + + // Policies, e.g., location, cloudType + private Map policies; + + public CompletionInputData() { } + + public List getBlacklistedNodetypes() { + return blacklistedNodetypes; + } + + public void setBlacklistedNodetypes(List blacklistedNodetypes) { + this.blacklistedNodetypes = blacklistedNodetypes; + } + + public Map getPolicies() { + return policies; + } + + public void setPolicies(Map policies) { + this.policies = policies; + } +} diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java index 2ffb7b8cf9..91415d8ad7 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java @@ -600,20 +600,46 @@ public Response applyGroupingAndPlacement(@Context UriInfo uriInfo) { @POST @Path("completemodel") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response completeModel(@Context UriInfo uriInfo) { + public Response completeModel(@Context UriInfo uriInfo, CompletionInputData completionInputData) { try { - TTopologyTemplate topology = - PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate); - this.parent.setTopology(topology, this.type); - // TODO check - do not overwrite servicetemplate -// RestUtils.persist(this.parent); - ServiceTemplateId thisServiceTemplateId = (ServiceTemplateId) this.parent.getId(); - URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(thisServiceTemplateId)); + ServiceTemplateId newServiceTemplateId = + PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate, completionInputData.getBlacklistedNodetypes(), completionInputData.getPolicies()); + URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(newServiceTemplateId)); return Response.created(url).build(); } catch (InvalidParameterException e) { LOGGER.debug("Error while completing model: {}", e.getMessage()); return Response.serverError().entity(e.getMessage()).build(); } } + + @POST + @Path("checkForEquivalentCSARS") + @Produces(MediaType.APPLICATION_JSON) + public Response checkEquivalency(@Context UriInfo uriInfo) { + try { + List equivalentTemplateIds = + PlacementUtils.checkServiceTemplateForEquivalency((ServiceTemplateId) this.parent.getId(), this.topologyTemplate); + List urls = equivalentTemplateIds.stream().map( id -> uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(id))).toList(); + return Response.ok(urls).build(); + } catch (InvalidParameterException e) { + LOGGER.debug("Error while completing model: {}", e.getMessage()); + return Response.serverError().entity(e.getMessage()).build(); + } + } + + @POST + @Path("isComplete") + @Produces(MediaType.APPLICATION_JSON) + public Response isComplete(@Context UriInfo uriInfo) { + try { + Boolean isComplete = + PlacementUtils.checkIfDeploymentModelIsComplete((ServiceTemplateId) this.parent.getId(), this.topologyTemplate); + return Response.ok(isComplete).build(); + } catch (InvalidParameterException e) { + LOGGER.debug("Error while completing model: {}", e.getMessage()); + return Response.serverError().entity(e.getMessage()).build(); + } + } } diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 7860301b35..f7a2130791 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1724,7 +1724,7 @@ private boolean equalsWithDifferentId(TNodeTemplate node1, TNodeTemplate node2) * @param id of the ServiceTemplate switch should be split and matched to cloud providers * @return id of the ServiceTemplate which contains the matched topology */ - public ServiceTemplateId completeNextRequirement(ServiceTemplateId id) throws Exception { + public ServiceTemplateId completeNextRequirement(ServiceTemplateId id, List blacklist, Map policies) throws Exception { long start = System.currentTimeMillis(); IRepository repository = RepositoryFactory.getRepository(); @@ -1746,7 +1746,7 @@ public ServiceTemplateId completeNextRequirement(ServiceTemplateId id) throws Ex matchedServiceTemplate.setTargetNamespace(id.getNamespace().getDecoded()); matchedServiceTemplate.setTags(serviceTemplate.getTags()); topologyTemplate.getNodeTemplates().forEach(t -> ModelUtilities.setTargetLabel(t, "*")); - matchedServiceTemplate.setTopologyTemplate(getMatchingTopology(BackendUtils.clone(matchedServiceTemplate))); + matchedServiceTemplate.setTopologyTemplate(getMatchingTopology(BackendUtils.clone(matchedServiceTemplate), blacklist, policies)); TTopologyTemplate daSpecifiedTopology = matchedServiceTemplate.getTopologyTemplate(); @@ -1760,14 +1760,8 @@ public ServiceTemplateId completeNextRequirement(ServiceTemplateId id) throws Ex return matchedServiceTemplateId; } - -// public TTopologyTemplate retrieveMatchingCapabilitiy(TServiceTemplate serviceTemplate) throws -// SplittingException { -// TServiceTemplate newServiceTemplate = BackendUtils.clone(serviceTemplate); -// return getMatchingServiceTemplates(newServiceTemplate); -// } - - public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) throws + + public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, List blacklist, Map policies) throws SplittingException { ProviderRepository repository = new ProviderRepository(); List lowLevelNodeTemplates = getNodeTemplatesWithoutOutgoingHostedOnRelationships(serviceTemplate); @@ -1776,9 +1770,7 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) t //Find lowest level nodes with open requirements which means they can be hosted by an other component for (TNodeTemplate nodeTemplateCandidate : lowLevelNodeTemplates) { if (hasNodeOpenRequirement(serviceTemplate, nodeTemplateCandidate)) { - if (nodeTemplateCandidate.getRequirements() != null && nodeTemplateCandidate.getRequirements().stream() -// .anyMatch(req -> getBasisCapabilityType(getRequiredCapabilityTypeQNameOfRequirement(req)).getName().equalsIgnoreCase("Container"))) { - .anyMatch(req -> true)) { + if (nodeTemplateCandidate.getRequirements() != null) { nodesToCheck.add(nodeTemplateCandidate); } } @@ -1797,11 +1789,7 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) t throw new SplittingException("No target label present for Node Template " + needHostNode.getId()); } - //noinspection OptionalGetWithoutIsPresent String targetLabel = ModelUtilities.getTargetLabel(needHostNode).get(); - -// List openHostedOnRequirements = needHostNode.getRequirements().stream() -// .filter(req -> getBasisCapabilityType(getRequiredCapabilityTypeQNameOfRequirement(req)).getName().equalsIgnoreCase("Container")).toList(); List openHostedOnRequirements = needHostNode.getRequirements(); for (TRequirement requirement: openHostedOnRequirements) { @@ -1812,6 +1800,12 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) t compatibleNodeTemplates.size(), needHostNode.getId()); // TODO do proper selection based on policies + compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> !blacklist.contains(nt.getType())).toList(); + +// if(completionInputData.getPolicies().containsKey("cloudType")){ +// compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> nt.get); +// } + TNodeTemplate selectedTemplate = compatibleNodeTemplates.get(0); // check if suitable nodetemplate already exists in topology, if so reuse it instead of creating new one. @@ -1864,4 +1858,5 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate) t return topologyToComplete; } + } From 5e7d449cc8cb074fe99e3e2940fd5187f44b6256 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Fri, 17 Nov 2023 17:29:40 +0100 Subject: [PATCH 04/18] updating content for equivalency and complete DM --- .../adaptation/placement/PlacementUtils.java | 39 ++++++++++++++----- .../CompletionInputData.java | 6 ++- .../TopologyTemplateResource.java | 8 ++-- .../repository/splitting/Splitting.java | 15 ++++--- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index bc847dbd58..4f24a5ad2c 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -691,35 +691,54 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi * @return */ public static List checkServiceTemplateForEquivalency(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { - Splitting splitting = new Splitting(); - IRepository repo = RepositoryFactory.getRepository(); - TServiceTemplate serviceTemplate = RepositoryFactory.getRepository().getElement(serviceTemplateId); List nodeTemplates = topology.getNodeTemplates(); List relationshipTemplates = topology.getRelationshipTemplates(); - List equivalentServiceTemplateIds = RepositoryFactory.getRepository().getAllDefinitionsChildIds(ServiceTemplateId.class).stream() - // get all contained node templates + return RepositoryFactory.getRepository().getAllDefinitionsChildIds(ServiceTemplateId.class).stream() + // remove self + .filter(id -> !id.equals(serviceTemplateId)) + // remove topologies that contain different nodetemplates/relationshiptemplates .filter(id -> { TServiceTemplate serviceTemplateFilter = RepositoryFactory.getRepository().getElement(id); TTopologyTemplate topologyTemplateFilter = serviceTemplateFilter.getTopologyTemplate(); - assert topologyTemplateFilter != null; + + // check if number of nodetemplates matches if (topology.getNodeTemplateOrRelationshipTemplate().size() != topologyTemplateFilter.getNodeTemplateOrRelationshipTemplate().size()){ return false; } + + // check if type of all nodetemplates match List nodeTemplatesFilter = topologyTemplateFilter.getNodeTemplates(); - if (nodeTemplates.stream().anyMatch( nt -> !nodeTemplatesFilter.contains(nt))){ + if (!nodeTemplates.stream().allMatch( nt -> nodeTemplatesFilter.stream().anyMatch( ntFilter -> nt.getType().equals(ntFilter.getType())))){ return false; } + + // check if deployment artifacts of all nodetemplates match + if (!nodeTemplates.stream().allMatch( nt -> nodeTemplatesFilter.stream().anyMatch( ntFilter -> { + // if both nodetemplates have no DAs return match + if (ntFilter.getDeploymentArtifacts() == null && nt.getDeploymentArtifacts() == null){ + return true; + } + // if one of the nodetemplates does not have any DAs but the other does, return no match + if (ntFilter.getDeploymentArtifacts() == null || nt.getDeploymentArtifacts() == null){ + return false; + } + + // check if the artifactRef of all DAs of the nodetemplate also exist in the other nodetemplate + return nt.getDeploymentArtifacts().stream().allMatch(da -> ntFilter.getDeploymentArtifacts().stream().anyMatch(daFilter -> da.getArtifactRef().equals(daFilter.getArtifactRef()))); + }))){ + return false; + } + + // check if types of all relationship templates match List relationshipTemplatesFilter = topologyTemplateFilter.getRelationshipTemplates(); - if (relationshipTemplates.stream().anyMatch( rt -> !relationshipTemplatesFilter.contains(rt))){ + if (!relationshipTemplates.stream().allMatch( rt -> relationshipTemplatesFilter.stream().anyMatch( rtFilter -> rt.getType().equals(rtFilter.getType())))){ return false; } return true; }) .toList(); - - return equivalentServiceTemplateIds; } /** diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java index 9326221e67..43b42d992d 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/CompletionInputData.java @@ -14,6 +14,8 @@ package org.eclipse.winery.repository.rest.resources.servicetemplates.topologytemplates; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -21,10 +23,10 @@ public class CompletionInputData { // Nodetypes not allowed due to, e.g., unfulfilled requirements - private List blacklistedNodetypes; + private List blacklistedNodetypes = new ArrayList<>(); // Policies, e.g., location, cloudType - private Map policies; + private Map policies = new HashMap<>(); public CompletionInputData() { } diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java index 91415d8ad7..916dd2eadf 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java @@ -603,9 +603,11 @@ public Response applyGroupingAndPlacement(@Context UriInfo uriInfo) { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response completeModel(@Context UriInfo uriInfo, CompletionInputData completionInputData) { + List blacklist = completionInputData == null ? new ArrayList<>() : completionInputData.getBlacklistedNodetypes(); + Map policies = completionInputData == null ? new HashMap<>() : completionInputData.getPolicies(); try { ServiceTemplateId newServiceTemplateId = - PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate, completionInputData.getBlacklistedNodetypes(), completionInputData.getPolicies()); + PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate, blacklist, policies); URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(newServiceTemplateId)); return Response.created(url).build(); } catch (InvalidParameterException e) { @@ -615,7 +617,7 @@ public Response completeModel(@Context UriInfo uriInfo, CompletionInputData comp } @POST - @Path("checkForEquivalentCSARS") + @Path("checkforequivalentcsars") @Produces(MediaType.APPLICATION_JSON) public Response checkEquivalency(@Context UriInfo uriInfo) { try { @@ -630,7 +632,7 @@ public Response checkEquivalency(@Context UriInfo uriInfo) { } @POST - @Path("isComplete") + @Path("iscomplete") @Produces(MediaType.APPLICATION_JSON) public Response isComplete(@Context UriInfo uriInfo) { try { diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index f7a2130791..2664bc06a5 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1810,13 +1810,17 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L // check if suitable nodetemplate already exists in topology, if so reuse it instead of creating new one. assert topologyToComplete != null; + boolean suitableNodeTemplateAlreadyExists = false; for( TNodeTemplate nt: topologyToComplete.getNodeTemplates()){ if (nt.getType().equals(selectedTemplate.getType())){ selectedTemplate = nt; + suitableNodeTemplateAlreadyExists = true; } } + if (!suitableNodeTemplateAlreadyExists){ + topologyToComplete.addNodeTemplate(selectedTemplate); + } - topologyToComplete.addNodeTemplate(selectedTemplate); TRelationshipTemplate newHostedOnRelationship = new TRelationshipTemplate(); String id = UUID.randomUUID().toString(); @@ -1829,18 +1833,13 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L targetElement.setRef(selectedTemplate); newHostedOnRelationship.setSourceElement(sourceElement); newHostedOnRelationship.setTargetElement(targetElement); - QName reqTypeQName = requirement.getType(); - RequirementTypeId reqTypeId = new RequirementTypeId(reqTypeQName); - QName requiredCapabilityType = RepositoryFactory.getRepository().getElement(reqTypeId).getRequiredCapabilityType(); - TCapability requiredCapability = selectedTemplate.getCapabilities().stream().filter(cap -> cap.getType().equals(requiredCapabilityType)).toList().get(0); -// TRelationshipType relationshipType = getMatchingRelationshipType(requirement, requiredCapability); - + + // HostedOn is always selected as relationshipType SortedSet relTypeIds = RepositoryFactory.getRepository().getAllDefinitionsChildIds(RelationshipTypeId.class); List relationshipTypes = new ArrayList<>(); for (RelationshipTypeId typeId : relTypeIds) { relationshipTypes.add(RepositoryFactory.getRepository().getElement(typeId)); } - //TODO do proper relation selection TRelationshipType relationshipType = relationshipTypes.stream().filter(type -> { assert type.getName() != null; return type.getName().equals("HostedOn"); From 6e3193a35d63cad92626b476f1461f1757f25d0b Mon Sep 17 00:00:00 2001 From: mbeisel Date: Fri, 17 Nov 2023 18:52:22 +0100 Subject: [PATCH 05/18] update policy handling for completion --- .../repository/splitting/Splitting.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 2664bc06a5..650d890027 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -46,6 +46,7 @@ import org.eclipse.winery.model.tosca.TRequirement; import org.eclipse.winery.model.tosca.TRequirementType; import org.eclipse.winery.model.tosca.TServiceTemplate; +import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; import org.eclipse.winery.model.tosca.constants.OpenToscaBaseTypes; import org.eclipse.winery.model.tosca.constants.ToscaBaseTypes; @@ -1766,6 +1767,7 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L ProviderRepository repository = new ProviderRepository(); List lowLevelNodeTemplates = getNodeTemplatesWithoutOutgoingHostedOnRelationships(serviceTemplate); List nodesToCheck = new ArrayList<>(); + //Find lowest level nodes with open requirements which means they can be hosted by an other component for (TNodeTemplate nodeTemplateCandidate : lowLevelNodeTemplates) { @@ -1799,12 +1801,28 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L LOGGER.debug("Found {} compatible topology fragments for NodeTemplate {}", compatibleNodeTemplates.size(), needHostNode.getId()); - // TODO do proper selection based on policies + // Filter NodeTemplates based on Blacklist compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> !blacklist.contains(nt.getType())).toList(); - -// if(completionInputData.getPolicies().containsKey("cloudType")){ -// compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> nt.get); -// } + + // Filter NodeTemplates based on Policies + IRepository repositoryFactory = RepositoryFactory.getRepository(); + Map nodeTypes = repositoryFactory.getQNameToElementMapping(NodeTypeId.class); + for (Map.Entry entry : policies.entrySet()) { + compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> { + //get NodeType of NodeTemplate + TNodeType matchingType = nodeTypes.get(nt.getType()); + + if (matchingType.getTags() == null){ + return true; + } + // check if NodeType has given Tag -> If it does have the tag it must be set as desrcibed by the policy, otherwise it is ignored + List filteredTagList = matchingType.getTags().stream().filter(tag -> tag.getName().equalsIgnoreCase(entry.getKey())).toList(); + if (filteredTagList.size() > 0){ + return entry.getValue().equalsIgnoreCase(filteredTagList.get(0).getValue()); + } + return true; + }).toList(); + } TNodeTemplate selectedTemplate = compatibleNodeTemplates.get(0); From c21c1f99854f978ef8cdb74aa26b86aad911ce54 Mon Sep 17 00:00:00 2001 From: Benjamin Weder Date: Mon, 20 Nov 2023 12:46:34 +0100 Subject: [PATCH 06/18] Fix checkstyle --- .../winery/repository/splitting/Splitting.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 650d890027..49e340b967 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1732,7 +1732,6 @@ public ServiceTemplateId completeNextRequirement(ServiceTemplateId id, List blacklist, Map policies) throws - SplittingException { + public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, List blacklist, Map policies) throws SplittingException { ProviderRepository repository = new ProviderRepository(); List lowLevelNodeTemplates = getNodeTemplatesWithoutOutgoingHostedOnRelationships(serviceTemplate); List nodesToCheck = new ArrayList<>(); - //Find lowest level nodes with open requirements which means they can be hosted by an other component for (TNodeTemplate nodeTemplateCandidate : lowLevelNodeTemplates) { @@ -1812,12 +1809,12 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L //get NodeType of NodeTemplate TNodeType matchingType = nodeTypes.get(nt.getType()); - if (matchingType.getTags() == null){ + if (matchingType.getTags() == null) { return true; } // check if NodeType has given Tag -> If it does have the tag it must be set as desrcibed by the policy, otherwise it is ignored List filteredTagList = matchingType.getTags().stream().filter(tag -> tag.getName().equalsIgnoreCase(entry.getKey())).toList(); - if (filteredTagList.size() > 0){ + if (filteredTagList.size() > 0) { return entry.getValue().equalsIgnoreCase(filteredTagList.get(0).getValue()); } return true; @@ -1829,16 +1826,15 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L // check if suitable nodetemplate already exists in topology, if so reuse it instead of creating new one. assert topologyToComplete != null; boolean suitableNodeTemplateAlreadyExists = false; - for( TNodeTemplate nt: topologyToComplete.getNodeTemplates()){ - if (nt.getType().equals(selectedTemplate.getType())){ + for (TNodeTemplate nt: topologyToComplete.getNodeTemplates()) { + if (nt.getType().equals(selectedTemplate.getType())) { selectedTemplate = nt; suitableNodeTemplateAlreadyExists = true; } } - if (!suitableNodeTemplateAlreadyExists){ + if (!suitableNodeTemplateAlreadyExists) { topologyToComplete.addNodeTemplate(selectedTemplate); } - TRelationshipTemplate newHostedOnRelationship = new TRelationshipTemplate(); String id = UUID.randomUUID().toString(); @@ -1874,6 +1870,4 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L } return topologyToComplete; } - - } From cb1bc76a10518803ef01f41fb9edb2b679da59fe Mon Sep 17 00:00:00 2001 From: Benjamin Weder Date: Mon, 20 Nov 2023 12:49:03 +0100 Subject: [PATCH 07/18] Fix further checksytle errors --- .../model/adaptation/placement/PlacementUtils.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 4f24a5ad2c..e70d7c5757 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -704,36 +704,36 @@ public static List checkServiceTemplateForEquivalency(Service assert topologyTemplateFilter != null; // check if number of nodetemplates matches - if (topology.getNodeTemplateOrRelationshipTemplate().size() != topologyTemplateFilter.getNodeTemplateOrRelationshipTemplate().size()){ + if (topology.getNodeTemplateOrRelationshipTemplate().size() != topologyTemplateFilter.getNodeTemplateOrRelationshipTemplate().size()) { return false; } // check if type of all nodetemplates match List nodeTemplatesFilter = topologyTemplateFilter.getNodeTemplates(); - if (!nodeTemplates.stream().allMatch( nt -> nodeTemplatesFilter.stream().anyMatch( ntFilter -> nt.getType().equals(ntFilter.getType())))){ + if (!nodeTemplates.stream().allMatch( nt -> nodeTemplatesFilter.stream().anyMatch( ntFilter -> nt.getType().equals(ntFilter.getType())))) { return false; } // check if deployment artifacts of all nodetemplates match if (!nodeTemplates.stream().allMatch( nt -> nodeTemplatesFilter.stream().anyMatch( ntFilter -> { // if both nodetemplates have no DAs return match - if (ntFilter.getDeploymentArtifacts() == null && nt.getDeploymentArtifacts() == null){ + if (ntFilter.getDeploymentArtifacts() == null && nt.getDeploymentArtifacts() == null) { return true; } // if one of the nodetemplates does not have any DAs but the other does, return no match - if (ntFilter.getDeploymentArtifacts() == null || nt.getDeploymentArtifacts() == null){ + if (ntFilter.getDeploymentArtifacts() == null || nt.getDeploymentArtifacts() == null) { return false; } // check if the artifactRef of all DAs of the nodetemplate also exist in the other nodetemplate return nt.getDeploymentArtifacts().stream().allMatch(da -> ntFilter.getDeploymentArtifacts().stream().anyMatch(daFilter -> da.getArtifactRef().equals(daFilter.getArtifactRef()))); - }))){ + }))) { return false; } // check if types of all relationship templates match List relationshipTemplatesFilter = topologyTemplateFilter.getRelationshipTemplates(); - if (!relationshipTemplates.stream().allMatch( rt -> relationshipTemplatesFilter.stream().anyMatch( rtFilter -> rt.getType().equals(rtFilter.getType())))){ + if (!relationshipTemplates.stream().allMatch( rt -> relationshipTemplatesFilter.stream().anyMatch( rtFilter -> rt.getType().equals(rtFilter.getType())))) { return false; } return true; From d415e73b5b0210daada46b2c2851561572571e52 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Mon, 20 Nov 2023 19:38:13 +0100 Subject: [PATCH 08/18] adding selfserviceurl --- .../adaptation/placement/PlacementUtils.java | 52 ++++++++++++++++++- .../repository/splitting/Splitting.java | 1 + 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index e70d7c5757..009abc1e55 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -31,9 +31,11 @@ import javax.xml.namespace.QName; import org.eclipse.winery.model.ids.definitions.ServiceTemplateId; +import org.eclipse.winery.model.tosca.TBoundaryDefinitions; import org.eclipse.winery.model.tosca.TEntityTemplate; import org.eclipse.winery.model.tosca.TNodeTemplate; import org.eclipse.winery.model.tosca.TPolicy; +import org.eclipse.winery.model.tosca.TPropertyMapping; import org.eclipse.winery.model.tosca.TRelationshipTemplate; import org.eclipse.winery.model.tosca.TServiceTemplate; import org.eclipse.winery.model.tosca.TTag; @@ -650,6 +652,7 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi IRepository repo = RepositoryFactory.getRepository(); try { + ServiceTemplateId newId = null; // create new temporary ServiceTemplate as working copy ServiceTemplateId placementId = new ServiceTemplateId(serviceTemplateId.getNamespace().getDecoded(), VersionSupport.getNewComponentVersionId(serviceTemplateId, "placement"), false); @@ -675,8 +678,55 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi placementId = newServiceTemplateId; } + // Set selfserviceUrl for completed Templates + + TServiceTemplate completedST = repo.getElement(placementId); + + final List allowedPortNames = List.of("VMOpenPorts"); + final List allowedIPNames = List.of("VMIP"); + + TBoundaryDefinitions definitions = new TBoundaryDefinitions(); + TBoundaryDefinitions.Properties properties = new TBoundaryDefinitions.Properties(); + List propertyMappings = new ArrayList<>(); + + assert completedST.getTopologyTemplate() != null; + for (TEntityTemplate nt: completedST.getTopologyTemplate().getNodeTemplateOrRelationshipTemplate()) { + String suitableIPKey = null; + String suitablePortKey = null; + if( nt.getProperties() != null){ + LinkedHashMap kvProperties = ((TEntityTemplate.WineryKVProperties) nt.getProperties()).getKVProperties(); + for ( Map.Entry entry : kvProperties.entrySet()) { + if (allowedIPNames.contains(entry.getKey())){ + suitableIPKey = entry.getKey(); + } if (allowedPortNames.contains(entry.getKey())){ + suitablePortKey = entry.getKey(); + } + } + if (suitableIPKey != null && suitablePortKey != null) { + String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + "')"; + TPropertyMapping selfserviceProperty = new TPropertyMapping("/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); + propertyMappings.add(selfserviceProperty); + properties.setPropertyMappings(propertyMappings); + definitions.setProperties(properties); + completedST.setBoundaryDefinitions(definitions); +// repo.setElement(placementId, completedST); + + //save completed ServiceTemplate using originalname + completed + newId = new ServiceTemplateId( + serviceTemplateId.getNamespace().getDecoded(), + VersionSupport.getNewComponentVersionId(serviceTemplateId, "completed"), + false); + completedST.setId(newId.getXmlId().getDecoded()); + completedST.setName(newId.getXmlId().getDecoded()); + repo.setElement(newId, completedST); + repo.forceDelete(placementId); + break; + } + } + } + // returned completed topologyId - return placementId; + return newId; } catch (Exception e) { LOGGER.error("Exception while completing topology: {}", e.getMessage()); return null; diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 49e340b967..1087f5c5f3 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1800,6 +1800,7 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L // Filter NodeTemplates based on Blacklist compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> !blacklist.contains(nt.getType())).toList(); +// compatibleNodeTemplates = compatibleNodeTemplates.stream().filter(nt -> blacklist.stream().noneMatch(bl -> bl.getLocalPart().equals(nt.getType().getLocalPart()))).toList(); // Filter NodeTemplates based on Policies IRepository repositoryFactory = RepositoryFactory.getRepository(); From d7ea8d7938fd358857a1f448ca4ba91536c78d2f Mon Sep 17 00:00:00 2001 From: mbeisel Date: Tue, 21 Nov 2023 21:09:48 +0100 Subject: [PATCH 09/18] enable selfserviceapplicationurls in servicetemplates fix id scheme for relations during completion --- .../adaptation/placement/PlacementUtils.java | 43 +++++----- .../model/tosca/TBoundaryDefinitions.java | 15 +++- .../tosca/TSelfServiceApplicationUrl.java | 68 +++++++++++++++ .../winery/model/tosca/visitor/Visitor.java | 5 ++ .../tosca/xml/XTBoundaryDefinitions.java | 13 ++- .../xml/XTSelfServiceApplicationUrl.java | 86 +++++++++++++++++++ .../model/tosca/xml/visitor/Visitor.java | 5 ++ .../TopologyTemplateResource.java | 4 +- .../repository/splitting/Splitting.java | 7 +- .../xml/converter/FromCanonical.java | 13 +++ .../repository/xml/converter/ToCanonical.java | 13 +++ 11 files changed, 247 insertions(+), 25 deletions(-) create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TSelfServiceApplicationUrl.java create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTSelfServiceApplicationUrl.java diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 009abc1e55..d64452e538 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -37,6 +37,7 @@ import org.eclipse.winery.model.tosca.TPolicy; import org.eclipse.winery.model.tosca.TPropertyMapping; import org.eclipse.winery.model.tosca.TRelationshipTemplate; +import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; @@ -642,24 +643,26 @@ private static String getNextProvider(HashMap> provi /** * Completes the model based on given nodetype requirements. * - * @param serviceTemplateId the ID of the ServiceTemplate to complete + * @param incompleteServiceTemplateId the ID of the ServiceTemplate to complete * @param topology the incomplete TopologyTemplate to complete * @return the completed TopologyTemplate if completion is successful, the cleared and blacklisted TopologyTemplate * otherwise */ - public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology, List blacklist, Map policies) { + public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incompleteServiceTemplateId, TTopologyTemplate topology, List blacklist, Map policies) throws Exception { Splitting splitting = new Splitting(); IRepository repo = RepositoryFactory.getRepository(); try { ServiceTemplateId newId = null; // create new temporary ServiceTemplate as working copy - ServiceTemplateId placementId = new ServiceTemplateId(serviceTemplateId.getNamespace().getDecoded(), - VersionSupport.getNewComponentVersionId(serviceTemplateId, "placement"), false); + TServiceTemplate incompleteServiceTemplate = repo.getElement(incompleteServiceTemplateId); + ServiceTemplateId placementId = new ServiceTemplateId(incompleteServiceTemplateId.getNamespace().getDecoded(), + VersionSupport.getNewComponentVersionId(incompleteServiceTemplateId, "placement"), false); repo.forceDelete(placementId); TServiceTemplate placementServiceTemplate = new TServiceTemplate.Builder(placementId.getXmlId().getDecoded(), topology) .setName(placementId.getXmlId().getDecoded()) - .setTargetNamespace(serviceTemplateId.getNamespace().getDecoded()) + .setTargetNamespace(incompleteServiceTemplateId.getNamespace().getDecoded()) +// .setBoundaryDefinitions(incompleteServiceTemplate.getBoundaryDefinitions()) .build(); // resolve open requirements until the topology is completed @@ -678,27 +681,27 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi placementId = newServiceTemplateId; } - // Set selfserviceUrl for completed Templates - + // Set selfserviceUrl for completed Templates that DO SPECIFY BOUNDARYDEFINITIONS required for selfserviceurl TServiceTemplate completedST = repo.getElement(placementId); - + final List allowedPortNames = List.of("VMOpenPorts"); final List allowedIPNames = List.of("VMIP"); TBoundaryDefinitions definitions = new TBoundaryDefinitions(); TBoundaryDefinitions.Properties properties = new TBoundaryDefinitions.Properties(); List propertyMappings = new ArrayList<>(); - + assert completedST.getTopologyTemplate() != null; - for (TEntityTemplate nt: completedST.getTopologyTemplate().getNodeTemplateOrRelationshipTemplate()) { + for (TEntityTemplate nt : completedST.getTopologyTemplate().getNodeTemplateOrRelationshipTemplate()) { String suitableIPKey = null; String suitablePortKey = null; - if( nt.getProperties() != null){ + if (nt.getProperties() != null) { LinkedHashMap kvProperties = ((TEntityTemplate.WineryKVProperties) nt.getProperties()).getKVProperties(); - for ( Map.Entry entry : kvProperties.entrySet()) { - if (allowedIPNames.contains(entry.getKey())){ + for (Map.Entry entry : kvProperties.entrySet()) { + if (allowedIPNames.contains(entry.getKey())) { suitableIPKey = entry.getKey(); - } if (allowedPortNames.contains(entry.getKey())){ + } + if (allowedPortNames.contains(entry.getKey())) { suitablePortKey = entry.getKey(); } } @@ -707,14 +710,15 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi TPropertyMapping selfserviceProperty = new TPropertyMapping("/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); properties.setPropertyMappings(propertyMappings); + + properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); definitions.setProperties(properties); completedST.setBoundaryDefinitions(definitions); -// repo.setElement(placementId, completedST); - + //save completed ServiceTemplate using originalname + completed newId = new ServiceTemplateId( - serviceTemplateId.getNamespace().getDecoded(), - VersionSupport.getNewComponentVersionId(serviceTemplateId, "completed"), + incompleteServiceTemplateId.getNamespace().getDecoded(), + VersionSupport.getNewComponentVersionId(incompleteServiceTemplateId, "completed"), false); completedST.setId(newId.getXmlId().getDecoded()); completedST.setName(newId.getXmlId().getDecoded()); @@ -724,12 +728,11 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId servi } } } - // returned completed topologyId return newId; } catch (Exception e) { LOGGER.error("Exception while completing topology: {}", e.getMessage()); - return null; + throw new Exception(e); } } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java index fdb743ec7f..9fde3b160b 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java @@ -150,7 +150,8 @@ public void accept(Visitor visitor) { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "any", - "propertyMappings" + "propertyMappings", + "selfServiceApplicationUrl" }) public static class Properties implements Serializable { @@ -159,6 +160,18 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; + @XmlElement(name = "SelfServiceApplicationUrl") + protected TSelfServiceApplicationUrl selfServiceApplicationUrl; + + @Nullable + public TSelfServiceApplicationUrl getSelfServiceApplicationUrl() { + return selfServiceApplicationUrl; + } + + public void setSelfServiceApplicationUrl(TSelfServiceApplicationUrl selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + @Nullable public Object getAny() { diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TSelfServiceApplicationUrl.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TSelfServiceApplicationUrl.java new file mode 100644 index 0000000000..dfe5834f03 --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TSelfServiceApplicationUrl.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + +package org.eclipse.winery.model.tosca; + +import java.io.Serializable; +import java.util.Objects; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import org.eclipse.winery.model.tosca.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "tSelfServiceApplicationUrl") +public class TSelfServiceApplicationUrl implements Serializable { + + public String getSelfServiceApplicationUrl() { + return selfServiceApplicationUrl; + } + + public void setSelfServiceApplicationUrl(String selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + + @XmlAttribute(name = "xmlns") + protected String selfServiceApplicationUrl; + + @Deprecated // used for XML deserialization of API request content + public TSelfServiceApplicationUrl() { + } + + public TSelfServiceApplicationUrl(@NonNull String selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl)) return false; + org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl that = (org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl) o; + return Objects.equals(selfServiceApplicationUrl, that.selfServiceApplicationUrl); + } + + @Override + public int hashCode() { + return Objects.hash(selfServiceApplicationUrl); + } + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java index c619d52415..848ce519a9 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java @@ -44,6 +44,7 @@ import org.eclipse.winery.model.tosca.TRelationshipTemplate; import org.eclipse.winery.model.tosca.TRequirement; import org.eclipse.winery.model.tosca.TRequirementRef; +import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; @@ -326,6 +327,10 @@ public void visit(TBoundaryDefinitions.Properties properties) { } } + public void visit(TSelfServiceApplicationUrl applicationUrl) { + // this is a leaf, so no action to take + } + public void visit(TPropertyMapping propertyMapping) { // this is a leaf, so no action to take } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java index 180f0737a2..bdef99d8fd 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java @@ -150,7 +150,8 @@ public void accept(Visitor visitor) { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "any", - "propertyMappings" + "propertyMappings", + "selfServiceApplicationUrl" }) public static class Properties implements Serializable { @@ -159,7 +160,17 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; + @XmlElement(name = "SelfServiceApplicationUrl") + protected XTSelfServiceApplicationUrl selfServiceApplicationUrl; + @Nullable + public XTSelfServiceApplicationUrl getSelfServiceApplicationUrl() { + return selfServiceApplicationUrl; + } + + public void setSelfServiceApplicationUrl(XTSelfServiceApplicationUrl selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } @Nullable public Object getAny() { return any; diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTSelfServiceApplicationUrl.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTSelfServiceApplicationUrl.java new file mode 100644 index 0000000000..068aa008e3 --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTSelfServiceApplicationUrl.java @@ -0,0 +1,86 @@ +package org.eclipse.winery.model.tosca.xml; /******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + + +import java.io.Serializable; +import java.util.Objects; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import org.eclipse.winery.model.tosca.xml.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "tSelfServiceApplicationUrl") +public class XTSelfServiceApplicationUrl implements Serializable { + + public String getSelfServiceApplicationUrl() { + return selfServiceApplicationUrl; + } + + public void setSelfServiceApplicationUrl(String selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + + @XmlAttribute(name = "xmlns") + protected String selfServiceApplicationUrl; + + @Deprecated // used for XML deserialization of API request content + public XTSelfServiceApplicationUrl() { + } + + public XTSelfServiceApplicationUrl(@NonNull String selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + + private XTSelfServiceApplicationUrl(XTSelfServiceApplicationUrl.Builder builder) { + this.selfServiceApplicationUrl = builder.selfServiceApplicationUrl; + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl)) return false; + org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl that = (org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl) o; + return Objects.equals(selfServiceApplicationUrl, that.selfServiceApplicationUrl); + } + + @Override + public int hashCode() { + return Objects.hash(selfServiceApplicationUrl); + } + + + public static class Builder { + + private final String selfServiceApplicationUrl; + + public Builder(String selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; + } + + public XTSelfServiceApplicationUrl build() { + return new XTSelfServiceApplicationUrl(this); + } + } + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java index f927f5a5be..b5abe88e96 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java @@ -42,6 +42,7 @@ import org.eclipse.winery.model.tosca.xml.XTRelationshipTemplate; import org.eclipse.winery.model.tosca.xml.XTRequirement; import org.eclipse.winery.model.tosca.xml.XTRequirementRef; +import org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.xml.XTServiceTemplate; import org.eclipse.winery.model.tosca.xml.XTTag; import org.eclipse.winery.model.tosca.xml.XTTopologyTemplate; @@ -312,6 +313,10 @@ public void visit(XTBoundaryDefinitions.Properties properties) { } } + public void visit(XTSelfServiceApplicationUrl selfServiceApplicationUrl) { + // this is a leaf, so no action to take + } + public void visit(XTPropertyMapping propertyMapping) { // this is a leaf, so no action to take } diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java index 916dd2eadf..25882249c0 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java @@ -610,7 +610,7 @@ public Response completeModel(@Context UriInfo uriInfo, CompletionInputData comp PlacementUtils.completeModelBasedOnReqs((ServiceTemplateId) this.parent.getId(), this.topologyTemplate, blacklist, policies); URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(newServiceTemplateId)); return Response.created(url).build(); - } catch (InvalidParameterException e) { + } catch (Exception e) { LOGGER.debug("Error while completing model: {}", e.getMessage()); return Response.serverError().entity(e.getMessage()).build(); } @@ -633,7 +633,7 @@ public Response checkEquivalency(@Context UriInfo uriInfo) { @POST @Path("iscomplete") - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) public Response isComplete(@Context UriInfo uriInfo) { try { Boolean isComplete = diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 1087f5c5f3..652fd33af6 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1822,6 +1822,10 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L }).toList(); } + if (compatibleNodeTemplates.size() == 0){ + LOGGER.error("All matched nodetemplates were filtered - hence the completion had to be aborted"); + throw new SplittingException("All matched nodetemplates were filtered - hence the completion had to be aborted"); + } TNodeTemplate selectedTemplate = compatibleNodeTemplates.get(0); // check if suitable nodetemplate already exists in topology, if so reuse it instead of creating new one. @@ -1838,7 +1842,8 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L } TRelationshipTemplate newHostedOnRelationship = new TRelationshipTemplate(); - String id = UUID.randomUUID().toString(); + int idNumber = (int) (Math.random() * 200000000) + 1; + String id = "con_HostedOn_" + idNumber; newHostedOnRelationship.setId(id); newHostedOnRelationship.setName("hostedOn"); diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java index f4b50adaa2..b26dc2bf41 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java @@ -66,6 +66,7 @@ import org.eclipse.winery.model.tosca.TRequirementDefinition; import org.eclipse.winery.model.tosca.TRequirementRef; import org.eclipse.winery.model.tosca.TRequirementType; +import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; @@ -133,6 +134,7 @@ import org.eclipse.winery.model.tosca.xml.XTRequirementDefinition; import org.eclipse.winery.model.tosca.xml.XTRequirementRef; import org.eclipse.winery.model.tosca.xml.XTRequirementType; +import org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.xml.XTServiceTemplate; import org.eclipse.winery.model.tosca.xml.XTTag; import org.eclipse.winery.model.tosca.xml.XTTopologyTemplate; @@ -710,6 +712,11 @@ private XTBoundaryDefinitions convert(@Nullable TBoundaryDefinitions canonical) if (canonical.getProperties() != null) { XTBoundaryDefinitions.Properties props = new XTBoundaryDefinitions.Properties(); props.setAny(canonical.getProperties().getAny()); + if (canonical.getProperties().getSelfServiceApplicationUrl() != null){ + props.setSelfServiceApplicationUrl( + convert(canonical.getProperties().getSelfServiceApplicationUrl()) + ); + } if (canonical.getProperties().getPropertyMappings() != null) { props.setPropertyMappings( canonical.getProperties().getPropertyMappings().stream() @@ -851,6 +858,12 @@ private XTPropertyMapping convert(TPropertyMapping canonical) { ).build(); } + private XTSelfServiceApplicationUrl convert(TSelfServiceApplicationUrl canonical) { + return new XTSelfServiceApplicationUrl.Builder( + canonical.getSelfServiceApplicationUrl() + ).build(); + } + @Nullable private XTTopologyTemplate convert(@Nullable TTopologyTemplate canonical) { if (canonical == null) { diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java index fa9d80d759..01ca860295 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java @@ -70,6 +70,7 @@ import org.eclipse.winery.model.tosca.TRequirementDefinition; import org.eclipse.winery.model.tosca.TRequirementRef; import org.eclipse.winery.model.tosca.TRequirementType; +import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; @@ -137,6 +138,7 @@ import org.eclipse.winery.model.tosca.xml.XTRequirementDefinition; import org.eclipse.winery.model.tosca.xml.XTRequirementRef; import org.eclipse.winery.model.tosca.xml.XTRequirementType; +import org.eclipse.winery.model.tosca.xml.XTSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.xml.XTServiceTemplate; import org.eclipse.winery.model.tosca.xml.XTTag; import org.eclipse.winery.model.tosca.xml.XTTopologyTemplate; @@ -810,6 +812,11 @@ private TBoundaryDefinitions convert(XTBoundaryDefinitions xml) { if (xml.getProperties() != null) { TBoundaryDefinitions.Properties props = new TBoundaryDefinitions.Properties(); props.setAny(xml.getProperties().getAny()); + if (xml.getProperties().getSelfServiceApplicationUrl() != null) { + props.setSelfServiceApplicationUrl( + convert(xml.getProperties().getSelfServiceApplicationUrl()) + ); + } if (xml.getProperties().getPropertyMappings() != null) { props.setPropertyMappings( convertList(xml.getProperties().getPropertyMappings(), this::convert) @@ -944,6 +951,12 @@ private TPropertyMapping convert(XTPropertyMapping xml) { ); } + private TSelfServiceApplicationUrl convert(XTSelfServiceApplicationUrl xml) { + return new TSelfServiceApplicationUrl( + xml.getSelfServiceApplicationUrl() + ); + } + @Nullable private TTopologyTemplate convert(XTTopologyTemplate xml) { if (xml == null) { From 9f96ab3078ad20dcf93f57cc1ad698ddbbabe6db Mon Sep 17 00:00:00 2001 From: mbeisel Date: Mon, 4 Dec 2023 16:26:04 +0100 Subject: [PATCH 10/18] fix selfservice stuff --- .../model/adaptation/placement/PlacementUtils.java | 12 +++++++----- .../winery/model/tosca/TBoundaryDefinitions.java | 2 +- .../model/tosca/xml/XTBoundaryDefinitions.java | 2 +- .../topologytemplates/TopologyTemplateResource.java | 7 +++++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index d64452e538..fd7396768c 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -706,7 +706,7 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom } } if (suitableIPKey != null && suitablePortKey != null) { - String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + "')"; + String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + ")"; TPropertyMapping selfserviceProperty = new TPropertyMapping("/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); properties.setPropertyMappings(propertyMappings); @@ -743,13 +743,15 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom * @param topology topology of the servicetemplate to check for equivalency * @return */ - public static List checkServiceTemplateForEquivalency(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology) { + public static List checkServiceTemplateForEquivalency(ServiceTemplateId serviceTemplateId, TTopologyTemplate topology, Boolean includeSelf) { List nodeTemplates = topology.getNodeTemplates(); List relationshipTemplates = topology.getRelationshipTemplates(); + Set serviceTemplateIds = RepositoryFactory.getRepository().getAllDefinitionsChildIds(ServiceTemplateId.class); + if (!includeSelf) { + serviceTemplateIds = serviceTemplateIds.stream().filter(id -> !id.equals(serviceTemplateId)).collect(Collectors.toSet()); + } - return RepositoryFactory.getRepository().getAllDefinitionsChildIds(ServiceTemplateId.class).stream() - // remove self - .filter(id -> !id.equals(serviceTemplateId)) + return serviceTemplateIds.stream() // remove topologies that contain different nodetemplates/relationshiptemplates .filter(id -> { TServiceTemplate serviceTemplateFilter = RepositoryFactory.getRepository().getElement(id); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java index 9fde3b160b..97b5ccaf7a 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java @@ -160,7 +160,7 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; - @XmlElement(name = "SelfServiceApplicationUrl") + @XmlElement(name = "selfserviceApplicationUrl") protected TSelfServiceApplicationUrl selfServiceApplicationUrl; @Nullable diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java index bdef99d8fd..c50fd89367 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java @@ -160,7 +160,7 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; - @XmlElement(name = "SelfServiceApplicationUrl") + @XmlElement(name = "selfserviceApplicationUrl") protected XTSelfServiceApplicationUrl selfServiceApplicationUrl; @Nullable diff --git a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java index 25882249c0..0a8992dadd 100644 --- a/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java +++ b/org.eclipse.winery.repository.rest/src/main/java/org/eclipse/winery/repository/rest/resources/servicetemplates/topologytemplates/TopologyTemplateResource.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; @@ -619,10 +620,12 @@ public Response completeModel(@Context UriInfo uriInfo, CompletionInputData comp @POST @Path("checkforequivalentcsars") @Produces(MediaType.APPLICATION_JSON) - public Response checkEquivalency(@Context UriInfo uriInfo) { + public Response checkEquivalency(@Context UriInfo uriInfo, + @DefaultValue("false") + @QueryParam(value = "includeSelf") Boolean includeSelf) { try { List equivalentTemplateIds = - PlacementUtils.checkServiceTemplateForEquivalency((ServiceTemplateId) this.parent.getId(), this.topologyTemplate); + PlacementUtils.checkServiceTemplateForEquivalency((ServiceTemplateId) this.parent.getId(), this.topologyTemplate, includeSelf); List urls = equivalentTemplateIds.stream().map( id -> uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(id))).toList(); return Response.ok(urls).build(); } catch (InvalidParameterException e) { From 758bec49e4f7c592df8dab7d17dd345d33202efd Mon Sep 17 00:00:00 2001 From: mbeisel Date: Mon, 4 Dec 2023 17:53:55 +0100 Subject: [PATCH 11/18] add QProvEndpoint to BoundaryDefinitions --- .../adaptation/placement/PlacementUtils.java | 16 +++- .../model/tosca/TBoundaryDefinitions.java | 15 +++- .../eclipse/winery/model/tosca/TQProvUrl.java | 68 +++++++++++++++ .../winery/model/tosca/visitor/Visitor.java | 5 ++ .../tosca/xml/XTBoundaryDefinitions.java | 13 ++- .../winery/model/tosca/xml/XTQProvUrl.java | 86 +++++++++++++++++++ .../model/tosca/xml/visitor/Visitor.java | 5 ++ .../xml/converter/FromCanonical.java | 13 +++ .../repository/xml/converter/ToCanonical.java | 12 +++ 9 files changed, 230 insertions(+), 3 deletions(-) create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTQProvUrl.java diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index fd7396768c..5afb52479f 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -36,6 +36,7 @@ import org.eclipse.winery.model.tosca.TNodeTemplate; import org.eclipse.winery.model.tosca.TPolicy; import org.eclipse.winery.model.tosca.TPropertyMapping; +import org.eclipse.winery.model.tosca.TQProvUrl; import org.eclipse.winery.model.tosca.TRelationshipTemplate; import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; @@ -709,9 +710,22 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + ")"; TPropertyMapping selfserviceProperty = new TPropertyMapping("/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); - properties.setPropertyMappings(propertyMappings); + properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); + + +// +// +// +// + String targetPropertyRefQProv = nt.getId() + ".Properties.QProvEndpoint"; + TPropertyMapping qprovProperty = new TPropertyMapping("/*[local-name()='qprovUrl']", nt, targetPropertyRefQProv); + propertyMappings.add(qprovProperty); + properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); + + properties.setPropertyMappings(propertyMappings); + definitions.setProperties(properties); completedST.setBoundaryDefinitions(definitions); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java index 97b5ccaf7a..63274cddde 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java @@ -151,7 +151,8 @@ public void accept(Visitor visitor) { @XmlType(name = "", propOrder = { "any", "propertyMappings", - "selfServiceApplicationUrl" + "selfServiceApplicationUrl", + "qprovUrl" }) public static class Properties implements Serializable { @@ -163,6 +164,18 @@ public static class Properties implements Serializable { @XmlElement(name = "selfserviceApplicationUrl") protected TSelfServiceApplicationUrl selfServiceApplicationUrl; + @XmlElement(name = "QProvEndpoint") + protected TQProvUrl qprovUrl; + + public TQProvUrl getQprovUrl() { + return qprovUrl; + } + + public void setQprovUrl(TQProvUrl qprovUrl) { + this.qprovUrl = qprovUrl; + } + + @Nullable public TSelfServiceApplicationUrl getSelfServiceApplicationUrl() { return selfServiceApplicationUrl; diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java new file mode 100644 index 0000000000..4adbc607dc --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + +package org.eclipse.winery.model.tosca; + +import java.io.Serializable; +import java.util.Objects; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import org.eclipse.winery.model.tosca.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "tQProvUrl") +public class TQProvUrl implements Serializable { + + public String getQProvUrl() { + return qProvUrl; + } + + public void setQProvUrl(String qProvUrl) { + this.qProvUrl = qProvUrl; + } + + @XmlAttribute(name = "xmlns") + protected String qProvUrl; + + @Deprecated // used for XML deserialization of API request content + public TQProvUrl() { + } + + public TQProvUrl(@NonNull String qProvUrl) { + this.qProvUrl = qProvUrl; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TQProvUrl)) return false; + TQProvUrl that = (TQProvUrl) o; + return Objects.equals(qProvUrl, that.qProvUrl); + } + + @Override + public int hashCode() { + return Objects.hash(qProvUrl); + } + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java index 848ce519a9..ae41786dbb 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java @@ -46,6 +46,7 @@ import org.eclipse.winery.model.tosca.TRequirementRef; import org.eclipse.winery.model.tosca.TSelfServiceApplicationUrl; import org.eclipse.winery.model.tosca.TServiceTemplate; +import org.eclipse.winery.model.tosca.TQProvUrl; import org.eclipse.winery.model.tosca.TTag; import org.eclipse.winery.model.tosca.TTopologyTemplate; @@ -330,6 +331,10 @@ public void visit(TBoundaryDefinitions.Properties properties) { public void visit(TSelfServiceApplicationUrl applicationUrl) { // this is a leaf, so no action to take } + + public void visit(TQProvUrl applicationUrl) { + // this is a leaf, so no action to take + } public void visit(TPropertyMapping propertyMapping) { // this is a leaf, so no action to take diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java index c50fd89367..b09d1305cd 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java @@ -151,7 +151,8 @@ public void accept(Visitor visitor) { @XmlType(name = "", propOrder = { "any", "propertyMappings", - "selfServiceApplicationUrl" + "selfServiceApplicationUrl", + "qprovUrl" }) public static class Properties implements Serializable { @@ -162,6 +163,16 @@ public static class Properties implements Serializable { protected List propertyMappings; @XmlElement(name = "selfserviceApplicationUrl") protected XTSelfServiceApplicationUrl selfServiceApplicationUrl; + @XmlElement(name = "qprovUrl") + protected XTQProvUrl qprovUrl; + + public XTQProvUrl getQprovUrl() { + return qprovUrl; + } + + public void setQprovUrl(XTQProvUrl qprovUrl) { + this.qprovUrl = qprovUrl; + } @Nullable public XTSelfServiceApplicationUrl getSelfServiceApplicationUrl() { diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTQProvUrl.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTQProvUrl.java new file mode 100644 index 0000000000..76aa9fa2a9 --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTQProvUrl.java @@ -0,0 +1,86 @@ +package org.eclipse.winery.model.tosca.xml; /******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + + +import java.io.Serializable; +import java.util.Objects; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlType; + +import org.eclipse.winery.model.tosca.xml.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "tQProvUrl") +public class XTQProvUrl implements Serializable { + + public String getqProvUrl() { + return qProvUrl; + } + + public void setqProvUrl(String qProvUrl) { + this.qProvUrl = qProvUrl; + } + + @XmlAttribute(name = "xmlns") + protected String qProvUrl; + + @Deprecated // used for XML deserialization of API request content + public XTQProvUrl() { + } + + public XTQProvUrl(@NonNull String qProvUrl) { + this.qProvUrl = qProvUrl; + } + + private XTQProvUrl(XTQProvUrl.Builder builder) { + this.qProvUrl = builder.QProvUrl; + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof XTQProvUrl)) return false; + XTQProvUrl that = (XTQProvUrl) o; + return Objects.equals(qProvUrl, that.qProvUrl); + } + + @Override + public int hashCode() { + return Objects.hash(qProvUrl); + } + + + public static class Builder { + + private final String QProvUrl; + + public Builder(String QProvUrl) { + this.QProvUrl = QProvUrl; + } + + public XTQProvUrl build() { + return new XTQProvUrl(this); + } + } + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java index b5abe88e96..c9829ddee9 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java @@ -39,6 +39,7 @@ import org.eclipse.winery.model.tosca.xml.XTPolicy; import org.eclipse.winery.model.tosca.xml.XTPropertyConstraint; import org.eclipse.winery.model.tosca.xml.XTPropertyMapping; +import org.eclipse.winery.model.tosca.xml.XTQProvUrl; import org.eclipse.winery.model.tosca.xml.XTRelationshipTemplate; import org.eclipse.winery.model.tosca.xml.XTRequirement; import org.eclipse.winery.model.tosca.xml.XTRequirementRef; @@ -316,6 +317,10 @@ public void visit(XTBoundaryDefinitions.Properties properties) { public void visit(XTSelfServiceApplicationUrl selfServiceApplicationUrl) { // this is a leaf, so no action to take } + + public void visit(XTQProvUrl selfServiceApplicationUrl) { + // this is a leaf, so no action to take + } public void visit(XTPropertyMapping propertyMapping) { // this is a leaf, so no action to take diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java index b26dc2bf41..9f09e55077 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java @@ -58,6 +58,7 @@ import org.eclipse.winery.model.tosca.TPolicyType; import org.eclipse.winery.model.tosca.TPropertyConstraint; import org.eclipse.winery.model.tosca.TPropertyMapping; +import org.eclipse.winery.model.tosca.TQProvUrl; import org.eclipse.winery.model.tosca.TRelationshipTemplate; import org.eclipse.winery.model.tosca.TRelationshipType; import org.eclipse.winery.model.tosca.TRelationshipTypeImplementation; @@ -126,6 +127,7 @@ import org.eclipse.winery.model.tosca.xml.XTPolicyType; import org.eclipse.winery.model.tosca.xml.XTPropertyConstraint; import org.eclipse.winery.model.tosca.xml.XTPropertyMapping; +import org.eclipse.winery.model.tosca.xml.XTQProvUrl; import org.eclipse.winery.model.tosca.xml.XTRelationshipTemplate; import org.eclipse.winery.model.tosca.xml.XTRelationshipType; import org.eclipse.winery.model.tosca.xml.XTRelationshipTypeImplementation; @@ -717,6 +719,11 @@ private XTBoundaryDefinitions convert(@Nullable TBoundaryDefinitions canonical) convert(canonical.getProperties().getSelfServiceApplicationUrl()) ); } + if (canonical.getProperties().getQprovUrl() != null){ + props.setQprovUrl( + convert(canonical.getProperties().getQprovUrl()) + ); + } if (canonical.getProperties().getPropertyMappings() != null) { props.setPropertyMappings( canonical.getProperties().getPropertyMappings().stream() @@ -864,6 +871,12 @@ private XTSelfServiceApplicationUrl convert(TSelfServiceApplicationUrl canonical ).build(); } + private XTQProvUrl convert(TQProvUrl canonical) { + return new XTQProvUrl.Builder( + canonical.getQProvUrl() + ).build(); + } + @Nullable private XTTopologyTemplate convert(@Nullable TTopologyTemplate canonical) { if (canonical == null) { diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java index 01ca860295..dff127c4fe 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java @@ -62,6 +62,7 @@ import org.eclipse.winery.model.tosca.TPolicyType; import org.eclipse.winery.model.tosca.TPropertyConstraint; import org.eclipse.winery.model.tosca.TPropertyMapping; +import org.eclipse.winery.model.tosca.TQProvUrl; import org.eclipse.winery.model.tosca.TRelationshipTemplate; import org.eclipse.winery.model.tosca.TRelationshipType; import org.eclipse.winery.model.tosca.TRelationshipTypeImplementation; @@ -130,6 +131,7 @@ import org.eclipse.winery.model.tosca.xml.XTPolicyType; import org.eclipse.winery.model.tosca.xml.XTPropertyConstraint; import org.eclipse.winery.model.tosca.xml.XTPropertyMapping; +import org.eclipse.winery.model.tosca.xml.XTQProvUrl; import org.eclipse.winery.model.tosca.xml.XTRelationshipTemplate; import org.eclipse.winery.model.tosca.xml.XTRelationshipType; import org.eclipse.winery.model.tosca.xml.XTRelationshipTypeImplementation; @@ -817,6 +819,11 @@ private TBoundaryDefinitions convert(XTBoundaryDefinitions xml) { convert(xml.getProperties().getSelfServiceApplicationUrl()) ); } + if (xml.getProperties().getQprovUrl() != null) { + props.setQprovUrl( + convert(xml.getProperties().getQprovUrl()) + ); + } if (xml.getProperties().getPropertyMappings() != null) { props.setPropertyMappings( convertList(xml.getProperties().getPropertyMappings(), this::convert) @@ -957,6 +964,11 @@ private TSelfServiceApplicationUrl convert(XTSelfServiceApplicationUrl xml) { ); } + private TQProvUrl convert(XTQProvUrl xml) { + return new TQProvUrl( + xml.getqProvUrl() + ); + } @Nullable private TTopologyTemplate convert(XTTopologyTemplate xml) { if (xml == null) { From b3b019c459bcc5ccee349b21ad6c5e9882284ff9 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Tue, 5 Dec 2023 01:29:43 +0100 Subject: [PATCH 12/18] add Selfservice property --- .../adaptation/placement/PlacementUtils.java | 30 ++++-- .../model/tosca/TBoundaryDefinitions.java | 19 +++- .../winery/model/tosca/TBoundaryXML.java | 84 ++++++++++++++++ .../eclipse/winery/model/tosca/TQProvUrl.java | 6 +- .../winery/model/tosca/visitor/Visitor.java | 7 +- .../tosca/xml/XTBoundaryDefinitions.java | 13 ++- .../winery/model/tosca/xml/XTBoundaryXML.java | 99 +++++++++++++++++++ .../model/tosca/xml/visitor/Visitor.java | 8 +- .../xml/converter/FromCanonical.java | 15 +++ .../repository/xml/converter/ToCanonical.java | 14 +++ 10 files changed, 279 insertions(+), 16 deletions(-) create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java create mode 100644 org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 5afb52479f..c4ca942d3b 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -28,10 +28,13 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; + import javax.xml.namespace.QName; import org.eclipse.winery.model.ids.definitions.ServiceTemplateId; import org.eclipse.winery.model.tosca.TBoundaryDefinitions; +import org.eclipse.winery.model.tosca.TBoundaryXML; import org.eclipse.winery.model.tosca.TEntityTemplate; import org.eclipse.winery.model.tosca.TNodeTemplate; import org.eclipse.winery.model.tosca.TPolicy; @@ -712,17 +715,30 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom propertyMappings.add(selfserviceProperty); - properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); - +// properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); -// -// -// -// String targetPropertyRefQProv = nt.getId() + ".Properties.QProvEndpoint"; TPropertyMapping qprovProperty = new TPropertyMapping("/*[local-name()='qprovUrl']", nt, targetPropertyRefQProv); propertyMappings.add(qprovProperty); - properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); +// properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); + + TBoundaryXML boundaryXML = new TBoundaryXML(); + boundaryXML.setQProvUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); + boundaryXML.setSelfserviceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); + properties.setBoundaryXML(boundaryXML); + + +// String xmlString = ""; +// +// XmlMapper xmlMapper = new XmlMapper(); +// PropertiesNS props = xmlMapper.readValue(xmlString, PropertiesNS.class); +// props.setQprovUrl("http://www.eclipse.org/winery/model/selfservice"); +// props.setSelfserviceApplicationUrl("http://www.eclipse.org/winery/model/selfservice"); +// +// System.out.println("selfserviceApplicationUrl: " + props.getSelfserviceApplicationUrl()); +// System.out.println("qprovUrl: " + props.getQprovUrl()); +// properties.setAny(props); + properties.setPropertyMappings(propertyMappings); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java index 63274cddde..a72706ebaf 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java @@ -152,7 +152,8 @@ public void accept(Visitor visitor) { "any", "propertyMappings", "selfServiceApplicationUrl", - "qprovUrl" + "qprovUrl", + "boundaryXML" }) public static class Properties implements Serializable { @@ -164,9 +165,21 @@ public static class Properties implements Serializable { @XmlElement(name = "selfserviceApplicationUrl") protected TSelfServiceApplicationUrl selfServiceApplicationUrl; - @XmlElement(name = "QProvEndpoint") + @XmlElement(name = "qprovUrl") protected TQProvUrl qprovUrl; + @XmlElement(name = "ServiceTemplateProperties") + protected TBoundaryXML boundaryXML; + + public TBoundaryXML getBoundaryXML() { + return boundaryXML; + } + + public void setBoundaryXML(TBoundaryXML boundaryXML) { + this.boundaryXML = boundaryXML; + } + + public TQProvUrl getQprovUrl() { return qprovUrl; } @@ -174,7 +187,7 @@ public TQProvUrl getQprovUrl() { public void setQprovUrl(TQProvUrl qprovUrl) { this.qprovUrl = qprovUrl; } - + @Nullable public TSelfServiceApplicationUrl getSelfServiceApplicationUrl() { diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java new file mode 100644 index 0000000000..042876217c --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + +package org.eclipse.winery.model.tosca; + +import java.io.Serializable; +import java.util.Objects; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + +import org.eclipse.winery.model.tosca.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "qProvUrl", + "selfserviceApplicationUrl" +}) +public class TBoundaryXML implements Serializable { + + @XmlElement(name = "qProvUrl") + protected TQProvUrl qProvUrl; + + @XmlElement(name = "selfserviceApplicationUrl") + protected TSelfServiceApplicationUrl selfserviceApplicationUrl; + + public TSelfServiceApplicationUrl getSelfserviceApplicationUrl() { + return selfserviceApplicationUrl; + } + + public void setSelfserviceApplicationUrl(TSelfServiceApplicationUrl selfserviceApplicationUrl) { + this.selfserviceApplicationUrl = selfserviceApplicationUrl; + } + + public TQProvUrl getQProvUrl() { + return qProvUrl; + } + + public void setQProvUrl(TQProvUrl qProvUrl) { + this.qProvUrl = qProvUrl; + } + + @Deprecated // used for XML deserialization of API request content + public TBoundaryXML() { + } + + public TBoundaryXML(@NonNull TSelfServiceApplicationUrl selfServiceApplicationUrl, @NonNull TQProvUrl qProvUrl) { + this.qProvUrl = qProvUrl; + this.selfserviceApplicationUrl = selfServiceApplicationUrl; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TBoundaryXML)) return false; + TBoundaryXML that = (TBoundaryXML) o; + return Objects.equals(qProvUrl, that.qProvUrl); + } + + @Override + public int hashCode() { + return Objects.hash(qProvUrl); + } + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java index 4adbc607dc..d386475f4a 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TQProvUrl.java @@ -30,6 +30,9 @@ @XmlType(name = "tQProvUrl") public class TQProvUrl implements Serializable { + @XmlAttribute(name = "xmlns") + protected String qProvUrl; + public String getQProvUrl() { return qProvUrl; } @@ -38,9 +41,6 @@ public void setQProvUrl(String qProvUrl) { this.qProvUrl = qProvUrl; } - @XmlAttribute(name = "xmlns") - protected String qProvUrl; - @Deprecated // used for XML deserialization of API request content public TQProvUrl() { } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java index ae41786dbb..ce86046cb7 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/visitor/Visitor.java @@ -23,6 +23,7 @@ import org.eclipse.winery.model.tosca.HasId; import org.eclipse.winery.model.tosca.RelationshipSourceOrTarget; import org.eclipse.winery.model.tosca.TBoundaryDefinitions; +import org.eclipse.winery.model.tosca.TBoundaryXML; import org.eclipse.winery.model.tosca.TCapability; import org.eclipse.winery.model.tosca.TCapabilityRef; import org.eclipse.winery.model.tosca.TCondition; @@ -332,7 +333,11 @@ public void visit(TSelfServiceApplicationUrl applicationUrl) { // this is a leaf, so no action to take } - public void visit(TQProvUrl applicationUrl) { + public void visit(TBoundaryXML boundaryXML) { + // this is a leaf, so no action to take + } + + public void visit(TQProvUrl tqProvUrl) { // this is a leaf, so no action to take } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java index b09d1305cd..9556a87f03 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java @@ -152,7 +152,8 @@ public void accept(Visitor visitor) { "any", "propertyMappings", "selfServiceApplicationUrl", - "qprovUrl" + "qprovUrl", + "boundaryXML" }) public static class Properties implements Serializable { @@ -166,6 +167,16 @@ public static class Properties implements Serializable { @XmlElement(name = "qprovUrl") protected XTQProvUrl qprovUrl; + @XmlElement(name = "ServiceTemplateProperties") + protected XTBoundaryXML boundaryXML; + + public XTBoundaryXML getBoundaryXML() { + return boundaryXML; + } + + public void setBoundaryXML(XTBoundaryXML boundaryXML) { + this.boundaryXML = boundaryXML; + } public XTQProvUrl getQprovUrl() { return qprovUrl; } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java new file mode 100644 index 0000000000..1d4d51a46a --- /dev/null +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 + *******************************************************************************/ + +package org.eclipse.winery.model.tosca.xml; + +import java.io.Serializable; +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; +import org.eclipse.winery.model.tosca.xml.visitor.Visitor; + +import org.eclipse.jdt.annotation.NonNull; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "qProvUrl", + "selfserviceApplicationUrl" +}) +public class XTBoundaryXML implements Serializable { + + @XmlElement(name = "qProvUrl") + protected XTQProvUrl qProvUrl; + + @XmlElement(name = "selfserviceApplicationUrl") + protected XTSelfServiceApplicationUrl selfserviceApplicationUrl; + + public XTSelfServiceApplicationUrl getSelfserviceApplicationUrl() { + return selfserviceApplicationUrl; + } + + public void setSelfserviceApplicationUrl(XTSelfServiceApplicationUrl selfserviceApplicationUrl) { + this.selfserviceApplicationUrl = selfserviceApplicationUrl; + } + + public XTQProvUrl getQProvUrl() { + return qProvUrl; + } + + public void setQProvUrl(XTQProvUrl qProvUrl) { + this.qProvUrl = qProvUrl; + } + + @Deprecated // used for XML deserialization of API request content + public XTBoundaryXML() { + } + + public XTBoundaryXML(Builder builder) { + this.qProvUrl = builder.qProvUrl; + this.selfserviceApplicationUrl = builder.selfServiceApplicationUrl; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof XTBoundaryXML)) return false; + XTBoundaryXML that = (XTBoundaryXML) o; + return Objects.equals(qProvUrl, that.qProvUrl); + } + + @Override + public int hashCode() { + return Objects.hash(selfserviceApplicationUrl, qProvUrl); + } + + + public static class Builder { + + private final XTSelfServiceApplicationUrl selfServiceApplicationUrl; + private final XTQProvUrl qProvUrl; + + public Builder(XTSelfServiceApplicationUrl selfserviceApplicationUrl, XTQProvUrl qProvUrl) { + this.qProvUrl = qProvUrl; + this.selfServiceApplicationUrl = selfserviceApplicationUrl; + } + + public XTBoundaryXML build() { + return new XTBoundaryXML(this); + } + } + + + public void accept(Visitor visitor) { + visitor.visit(this); + } +} diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java index c9829ddee9..850b15dafa 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/visitor/Visitor.java @@ -23,6 +23,7 @@ import org.eclipse.winery.model.tosca.xml.XHasId; import org.eclipse.winery.model.tosca.xml.XRelationshipSourceOrTarget; import org.eclipse.winery.model.tosca.xml.XTBoundaryDefinitions; +import org.eclipse.winery.model.tosca.xml.XTBoundaryXML; import org.eclipse.winery.model.tosca.xml.XTCapability; import org.eclipse.winery.model.tosca.xml.XTCapabilityRef; import org.eclipse.winery.model.tosca.xml.XTCondition; @@ -313,12 +314,17 @@ public void visit(XTBoundaryDefinitions.Properties properties) { } } } + public void visit(XTSelfServiceApplicationUrl selfServiceApplicationUrl) { // this is a leaf, so no action to take } - public void visit(XTQProvUrl selfServiceApplicationUrl) { + public void visit(XTQProvUrl xtqProvUrl) { + // this is a leaf, so no action to take + } + + public void visit(XTBoundaryXML boundaryXML) { // this is a leaf, so no action to take } diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java index 9f09e55077..25ea17db69 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java @@ -27,6 +27,7 @@ import org.eclipse.winery.model.tosca.TArtifactTemplate; import org.eclipse.winery.model.tosca.TArtifactType; import org.eclipse.winery.model.tosca.TBoundaryDefinitions; +import org.eclipse.winery.model.tosca.TBoundaryXML; import org.eclipse.winery.model.tosca.TCapability; import org.eclipse.winery.model.tosca.TCapabilityDefinition; import org.eclipse.winery.model.tosca.TCapabilityRef; @@ -96,6 +97,7 @@ import org.eclipse.winery.model.tosca.xml.XTArtifactType; import org.eclipse.winery.model.tosca.xml.XTBoolean; import org.eclipse.winery.model.tosca.xml.XTBoundaryDefinitions; +import org.eclipse.winery.model.tosca.xml.XTBoundaryXML; import org.eclipse.winery.model.tosca.xml.XTCapability; import org.eclipse.winery.model.tosca.xml.XTCapabilityDefinition; import org.eclipse.winery.model.tosca.xml.XTCapabilityRef; @@ -724,6 +726,11 @@ private XTBoundaryDefinitions convert(@Nullable TBoundaryDefinitions canonical) convert(canonical.getProperties().getQprovUrl()) ); } + if (canonical.getProperties().getBoundaryXML() != null){ + props.setBoundaryXML( + convert(canonical.getProperties().getBoundaryXML()) + ); + } if (canonical.getProperties().getPropertyMappings() != null) { props.setPropertyMappings( canonical.getProperties().getPropertyMappings().stream() @@ -865,6 +872,14 @@ private XTPropertyMapping convert(TPropertyMapping canonical) { ).build(); } + private XTBoundaryXML convert(TBoundaryXML canonical) { + return new XTBoundaryXML.Builder( + convert(canonical.getSelfserviceApplicationUrl()), + convert(canonical.getQProvUrl()) + ).build(); + } + + private XTSelfServiceApplicationUrl convert(TSelfServiceApplicationUrl canonical) { return new XTSelfServiceApplicationUrl.Builder( canonical.getSelfServiceApplicationUrl() diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java index dff127c4fe..288185db91 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java @@ -30,6 +30,7 @@ import org.eclipse.winery.model.tosca.TArtifactTemplate; import org.eclipse.winery.model.tosca.TArtifactType; import org.eclipse.winery.model.tosca.TBoundaryDefinitions; +import org.eclipse.winery.model.tosca.TBoundaryXML; import org.eclipse.winery.model.tosca.TCapability; import org.eclipse.winery.model.tosca.TCapabilityDefinition; import org.eclipse.winery.model.tosca.TCapabilityRef; @@ -101,6 +102,7 @@ import org.eclipse.winery.model.tosca.xml.XTArtifactType; import org.eclipse.winery.model.tosca.xml.XTBoolean; import org.eclipse.winery.model.tosca.xml.XTBoundaryDefinitions; +import org.eclipse.winery.model.tosca.xml.XTBoundaryXML; import org.eclipse.winery.model.tosca.xml.XTCapability; import org.eclipse.winery.model.tosca.xml.XTCapabilityDefinition; import org.eclipse.winery.model.tosca.xml.XTCapabilityRef; @@ -829,6 +831,11 @@ private TBoundaryDefinitions convert(XTBoundaryDefinitions xml) { convertList(xml.getProperties().getPropertyMappings(), this::convert) ); } + if (xml.getProperties().getBoundaryXML() != null) { + props.setBoundaryXML( + convert(xml.getProperties().getBoundaryXML()) + ); + } builder.setProperties(props); } if (xml.getRequirements() != null) { @@ -958,6 +965,13 @@ private TPropertyMapping convert(XTPropertyMapping xml) { ); } + private TBoundaryXML convert(XTBoundaryXML xml) { + return new TBoundaryXML( + convert(xml.getSelfserviceApplicationUrl()), + convert(xml.getQProvUrl()) + ); + } + private TSelfServiceApplicationUrl convert(XTSelfServiceApplicationUrl xml) { return new TSelfServiceApplicationUrl( xml.getSelfServiceApplicationUrl() From 79d29726cea36fa5f4f8d7007d7b9e4f16275939 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Tue, 5 Dec 2023 01:58:18 +0100 Subject: [PATCH 13/18] add namespace to selfserviceproperty --- .../adaptation/placement/PlacementUtils.java | 1 + .../winery/model/tosca/TBoundaryXML.java | 15 +++++++++++++-- .../winery/model/tosca/xml/XTBoundaryXML.java | 19 ++++++++++++++++--- .../xml/converter/FromCanonical.java | 3 ++- .../repository/xml/converter/ToCanonical.java | 3 ++- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index c4ca942d3b..73e01d77bd 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -723,6 +723,7 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom // properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); TBoundaryXML boundaryXML = new TBoundaryXML(); + boundaryXML.setNamespace("http://www.eclipse.org/winery/model/selfservice"); boundaryXML.setQProvUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); boundaryXML.setSelfserviceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); properties.setBoundaryXML(boundaryXML); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java index 042876217c..f44116d6e9 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java @@ -33,7 +33,9 @@ "selfserviceApplicationUrl" }) public class TBoundaryXML implements Serializable { - + @XmlAttribute(name = "xmlns") + protected String namespace; + @XmlElement(name = "qProvUrl") protected TQProvUrl qProvUrl; @@ -56,13 +58,22 @@ public void setQProvUrl(TQProvUrl qProvUrl) { this.qProvUrl = qProvUrl; } + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + @Deprecated // used for XML deserialization of API request content public TBoundaryXML() { } - public TBoundaryXML(@NonNull TSelfServiceApplicationUrl selfServiceApplicationUrl, @NonNull TQProvUrl qProvUrl) { + public TBoundaryXML(@NonNull TSelfServiceApplicationUrl selfServiceApplicationUrl, @NonNull TQProvUrl qProvUrl, @NonNull String namespace) { this.qProvUrl = qProvUrl; this.selfserviceApplicationUrl = selfServiceApplicationUrl; + this.namespace = namespace; } @Override diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java index 1d4d51a46a..2815a13142 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java @@ -19,6 +19,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; import org.eclipse.winery.model.tosca.xml.visitor.Visitor; @@ -31,7 +32,8 @@ "selfserviceApplicationUrl" }) public class XTBoundaryXML implements Serializable { - + @XmlAttribute(name = "xmlns") + protected String namespace; @XmlElement(name = "qProvUrl") protected XTQProvUrl qProvUrl; @@ -54,6 +56,14 @@ public void setQProvUrl(XTQProvUrl qProvUrl) { this.qProvUrl = qProvUrl; } + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + @Deprecated // used for XML deserialization of API request content public XTBoundaryXML() { } @@ -61,6 +71,7 @@ public XTBoundaryXML() { public XTBoundaryXML(Builder builder) { this.qProvUrl = builder.qProvUrl; this.selfserviceApplicationUrl = builder.selfServiceApplicationUrl; + this.namespace = builder.namespace; } @Override @@ -73,7 +84,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(selfserviceApplicationUrl, qProvUrl); + return Objects.hash(selfserviceApplicationUrl, qProvUrl, namespace); } @@ -81,10 +92,12 @@ public static class Builder { private final XTSelfServiceApplicationUrl selfServiceApplicationUrl; private final XTQProvUrl qProvUrl; + private final String namespace; - public Builder(XTSelfServiceApplicationUrl selfserviceApplicationUrl, XTQProvUrl qProvUrl) { + public Builder(XTSelfServiceApplicationUrl selfserviceApplicationUrl, XTQProvUrl qProvUrl, String namespace) { this.qProvUrl = qProvUrl; this.selfServiceApplicationUrl = selfserviceApplicationUrl; + this.namespace = namespace; } public XTBoundaryXML build() { diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java index 25ea17db69..dca374cde4 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/FromCanonical.java @@ -875,7 +875,8 @@ private XTPropertyMapping convert(TPropertyMapping canonical) { private XTBoundaryXML convert(TBoundaryXML canonical) { return new XTBoundaryXML.Builder( convert(canonical.getSelfserviceApplicationUrl()), - convert(canonical.getQProvUrl()) + convert(canonical.getQProvUrl()), + canonical.getNamespace() ).build(); } diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java index 288185db91..911b397fed 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/xml/converter/ToCanonical.java @@ -968,7 +968,8 @@ private TPropertyMapping convert(XTPropertyMapping xml) { private TBoundaryXML convert(XTBoundaryXML xml) { return new TBoundaryXML( convert(xml.getSelfserviceApplicationUrl()), - convert(xml.getQProvUrl()) + convert(xml.getQProvUrl()), + xml.getNamespace() ); } From 6ab75a2467d9085844cf7a3cb4beb4d9001f021c Mon Sep 17 00:00:00 2001 From: mbeisel Date: Tue, 5 Dec 2023 11:35:22 +0100 Subject: [PATCH 14/18] update xpath reference for selfserviceapplicationurl --- .../winery/model/adaptation/placement/PlacementUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 73e01d77bd..6d49b8bc96 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -711,14 +711,14 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom } if (suitableIPKey != null && suitablePortKey != null) { String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + ")"; - TPropertyMapping selfserviceProperty = new TPropertyMapping("/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); + TPropertyMapping selfserviceProperty = new TPropertyMapping("/*/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); // properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); String targetPropertyRefQProv = nt.getId() + ".Properties.QProvEndpoint"; - TPropertyMapping qprovProperty = new TPropertyMapping("/*[local-name()='qprovUrl']", nt, targetPropertyRefQProv); + TPropertyMapping qprovProperty = new TPropertyMapping("/*/*[local-name()='qprovUrl']", nt, targetPropertyRefQProv); propertyMappings.add(qprovProperty); // properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); From f0318cee272d2464bcacb645305827650b823485 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Fri, 8 Dec 2023 15:19:22 +0100 Subject: [PATCH 15/18] rename xml properties --- .../winery/model/adaptation/placement/PlacementUtils.java | 4 ++-- .../org/eclipse/winery/model/tosca/TBoundaryDefinitions.java | 2 +- .../eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 6d49b8bc96..1f2eaa76d1 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -711,14 +711,14 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom } if (suitableIPKey != null && suitablePortKey != null) { String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + ")"; - TPropertyMapping selfserviceProperty = new TPropertyMapping("/*/*[local-name()='selfserviceApplicationUrl']", nt, targetPropertyRef); + TPropertyMapping selfserviceProperty = new TPropertyMapping("/*/*[local-name()='selfServiceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); // properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); String targetPropertyRefQProv = nt.getId() + ".Properties.QProvEndpoint"; - TPropertyMapping qprovProperty = new TPropertyMapping("/*/*[local-name()='qprovUrl']", nt, targetPropertyRefQProv); + TPropertyMapping qprovProperty = new TPropertyMapping("/*/*[local-name()='qProvUrl']", nt, targetPropertyRefQProv); propertyMappings.add(qprovProperty); // properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java index a72706ebaf..58ed2d92bd 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryDefinitions.java @@ -162,7 +162,7 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; - @XmlElement(name = "selfserviceApplicationUrl") + @XmlElement(name = "selfServiceApplicationUrl") protected TSelfServiceApplicationUrl selfServiceApplicationUrl; @XmlElement(name = "qprovUrl") diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java index 9556a87f03..d234923071 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryDefinitions.java @@ -162,7 +162,7 @@ public static class Properties implements Serializable { @XmlElementWrapper(name = "PropertyMappings") @XmlElement(name = "PropertyMapping", required = true) protected List propertyMappings; - @XmlElement(name = "selfserviceApplicationUrl") + @XmlElement(name = "selfServiceApplicationUrl") protected XTSelfServiceApplicationUrl selfServiceApplicationUrl; @XmlElement(name = "qprovUrl") protected XTQProvUrl qprovUrl; From 93b373e48dcba68591d900fa5bbc0748b665cc22 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Fri, 8 Dec 2023 19:07:47 +0100 Subject: [PATCH 16/18] refactor selfServiceApplicationUrl --- .../adaptation/placement/PlacementUtils.java | 4 ++-- .../winery/model/tosca/TBoundaryXML.java | 14 ++++++------- .../winery/model/tosca/xml/XTBoundaryXML.java | 20 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 1f2eaa76d1..25e2c1601e 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -729,14 +729,14 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom properties.setBoundaryXML(boundaryXML); -// String xmlString = ""; +// String xmlString = ""; // // XmlMapper xmlMapper = new XmlMapper(); // PropertiesNS props = xmlMapper.readValue(xmlString, PropertiesNS.class); // props.setQprovUrl("http://www.eclipse.org/winery/model/selfservice"); // props.setSelfserviceApplicationUrl("http://www.eclipse.org/winery/model/selfservice"); // -// System.out.println("selfserviceApplicationUrl: " + props.getSelfserviceApplicationUrl()); +// System.out.println("selfServiceApplicationUrl: " + props.getSelfserviceApplicationUrl()); // System.out.println("qprovUrl: " + props.getQprovUrl()); // properties.setAny(props); diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java index f44116d6e9..696665d755 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TBoundaryXML.java @@ -30,7 +30,7 @@ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "qProvUrl", - "selfserviceApplicationUrl" + "selfServiceApplicationUrl" }) public class TBoundaryXML implements Serializable { @XmlAttribute(name = "xmlns") @@ -39,15 +39,15 @@ public class TBoundaryXML implements Serializable { @XmlElement(name = "qProvUrl") protected TQProvUrl qProvUrl; - @XmlElement(name = "selfserviceApplicationUrl") - protected TSelfServiceApplicationUrl selfserviceApplicationUrl; + @XmlElement(name = "selfServiceApplicationUrl") + protected TSelfServiceApplicationUrl selfServiceApplicationUrl; public TSelfServiceApplicationUrl getSelfserviceApplicationUrl() { - return selfserviceApplicationUrl; + return selfServiceApplicationUrl; } - public void setSelfserviceApplicationUrl(TSelfServiceApplicationUrl selfserviceApplicationUrl) { - this.selfserviceApplicationUrl = selfserviceApplicationUrl; + public void setSelfserviceApplicationUrl(TSelfServiceApplicationUrl selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; } public TQProvUrl getQProvUrl() { @@ -72,7 +72,7 @@ public TBoundaryXML() { public TBoundaryXML(@NonNull TSelfServiceApplicationUrl selfServiceApplicationUrl, @NonNull TQProvUrl qProvUrl, @NonNull String namespace) { this.qProvUrl = qProvUrl; - this.selfserviceApplicationUrl = selfServiceApplicationUrl; + this.selfServiceApplicationUrl = selfServiceApplicationUrl; this.namespace = namespace; } diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java index 2815a13142..67480d43e8 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.xml/src/main/java/org/eclipse/winery/model/tosca/xml/XTBoundaryXML.java @@ -29,7 +29,7 @@ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "qProvUrl", - "selfserviceApplicationUrl" + "selfServiceApplicationUrl" }) public class XTBoundaryXML implements Serializable { @XmlAttribute(name = "xmlns") @@ -37,15 +37,15 @@ public class XTBoundaryXML implements Serializable { @XmlElement(name = "qProvUrl") protected XTQProvUrl qProvUrl; - @XmlElement(name = "selfserviceApplicationUrl") - protected XTSelfServiceApplicationUrl selfserviceApplicationUrl; + @XmlElement(name = "selfServiceApplicationUrl") + protected XTSelfServiceApplicationUrl selfServiceApplicationUrl; public XTSelfServiceApplicationUrl getSelfserviceApplicationUrl() { - return selfserviceApplicationUrl; + return selfServiceApplicationUrl; } - public void setSelfserviceApplicationUrl(XTSelfServiceApplicationUrl selfserviceApplicationUrl) { - this.selfserviceApplicationUrl = selfserviceApplicationUrl; + public void setSelfserviceApplicationUrl(XTSelfServiceApplicationUrl selfServiceApplicationUrl) { + this.selfServiceApplicationUrl = selfServiceApplicationUrl; } public XTQProvUrl getQProvUrl() { @@ -70,7 +70,7 @@ public XTBoundaryXML() { public XTBoundaryXML(Builder builder) { this.qProvUrl = builder.qProvUrl; - this.selfserviceApplicationUrl = builder.selfServiceApplicationUrl; + this.selfServiceApplicationUrl = builder.selfServiceApplicationUrl; this.namespace = builder.namespace; } @@ -84,7 +84,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(selfserviceApplicationUrl, qProvUrl, namespace); + return Objects.hash(selfServiceApplicationUrl, qProvUrl, namespace); } @@ -94,9 +94,9 @@ public static class Builder { private final XTQProvUrl qProvUrl; private final String namespace; - public Builder(XTSelfServiceApplicationUrl selfserviceApplicationUrl, XTQProvUrl qProvUrl, String namespace) { + public Builder(XTSelfServiceApplicationUrl selfServiceApplicationUrl, XTQProvUrl qProvUrl, String namespace) { this.qProvUrl = qProvUrl; - this.selfServiceApplicationUrl = selfserviceApplicationUrl; + this.selfServiceApplicationUrl = selfServiceApplicationUrl; this.namespace = namespace; } From 88b64e3e7533b4cfef5968687b2bd331ce58096b Mon Sep 17 00:00:00 2001 From: mbeisel Date: Thu, 11 Jan 2024 13:38:21 +0100 Subject: [PATCH 17/18] include tags --- .../winery/model/adaptation/placement/PlacementUtils.java | 1 + .../org/eclipse/winery/model/tosca/TServiceTemplate.java | 5 +++++ .../org/eclipse/winery/repository/splitting/Splitting.java | 1 + 3 files changed, 7 insertions(+) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 25e2c1601e..5c763b1579 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -667,6 +667,7 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom .setName(placementId.getXmlId().getDecoded()) .setTargetNamespace(incompleteServiceTemplateId.getNamespace().getDecoded()) // .setBoundaryDefinitions(incompleteServiceTemplate.getBoundaryDefinitions()) + .setTags(incompleteServiceTemplate.getTags()) .build(); // resolve open requirements until the topology is completed diff --git a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TServiceTemplate.java b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TServiceTemplate.java index 0474cd60cf..cdab66c53d 100644 --- a/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TServiceTemplate.java +++ b/org.eclipse.winery.model/org.eclipse.winery.model.tosca.canonical/src/main/java/org/eclipse/winery/model/tosca/TServiceTemplate.java @@ -215,6 +215,11 @@ public Builder setSubstitutableNodeType(QName substitutableNodeType) { return this; } + public Builder setTags(List tags) { + super.addTags(tags); + return this; + } + @Override public Builder self() { return this; diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 652fd33af6..2f84f295be 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1745,6 +1745,7 @@ public ServiceTemplateId completeNextRequirement(ServiceTemplateId id, List ModelUtilities.setTargetLabel(t, "*")); matchedServiceTemplate.setTopologyTemplate(getMatchingTopology(BackendUtils.clone(matchedServiceTemplate), blacklist, policies)); From 6f5f5451ac96a3cf069f176fbf369132ff3388f8 Mon Sep 17 00:00:00 2001 From: mbeisel Date: Thu, 11 Jan 2024 15:43:32 +0100 Subject: [PATCH 18/18] improve layouting --- .../adaptation/placement/PlacementUtils.java | 17 ----------------- .../winery/repository/splitting/Splitting.java | 11 +++++++++++ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java index 5c763b1579..9de8634185 100644 --- a/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java +++ b/org.eclipse.winery.model.adaptation/src/main/java/org/eclipse/winery/model/adaptation/placement/PlacementUtils.java @@ -714,14 +714,10 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom String targetPropertyRef = "concat('http://', " + nt.getId() + ".Properties." + suitableIPKey + ", ':', " + nt.getId() + ".Properties." + suitablePortKey + ")"; TPropertyMapping selfserviceProperty = new TPropertyMapping("/*/*[local-name()='selfServiceApplicationUrl']", nt, targetPropertyRef); propertyMappings.add(selfserviceProperty); - -// properties.setSelfServiceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); - String targetPropertyRefQProv = nt.getId() + ".Properties.QProvEndpoint"; TPropertyMapping qprovProperty = new TPropertyMapping("/*/*[local-name()='qProvUrl']", nt, targetPropertyRefQProv); propertyMappings.add(qprovProperty); -// properties.setQprovUrl(new TQProvUrl("http://www.eclipse.org/winery/model/selfservice")); TBoundaryXML boundaryXML = new TBoundaryXML(); boundaryXML.setNamespace("http://www.eclipse.org/winery/model/selfservice"); @@ -729,19 +725,6 @@ public static ServiceTemplateId completeModelBasedOnReqs(ServiceTemplateId incom boundaryXML.setSelfserviceApplicationUrl(new TSelfServiceApplicationUrl("http://www.eclipse.org/winery/model/selfservice")); properties.setBoundaryXML(boundaryXML); - -// String xmlString = ""; -// -// XmlMapper xmlMapper = new XmlMapper(); -// PropertiesNS props = xmlMapper.readValue(xmlString, PropertiesNS.class); -// props.setQprovUrl("http://www.eclipse.org/winery/model/selfservice"); -// props.setSelfserviceApplicationUrl("http://www.eclipse.org/winery/model/selfservice"); -// -// System.out.println("selfServiceApplicationUrl: " + props.getSelfserviceApplicationUrl()); -// System.out.println("qprovUrl: " + props.getQprovUrl()); -// properties.setAny(props); - - properties.setPropertyMappings(propertyMappings); definitions.setProperties(properties); diff --git a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java index 2f84f295be..595825c970 100644 --- a/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java +++ b/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/splitting/Splitting.java @@ -1781,6 +1781,9 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L LOGGER.debug("Start..."); if (!nodesToCheck.isEmpty()) { //Check all lowest level nodes with open requirements if a compatible node is available + + // Counter is used for horizontally distributed positioning of new nodes + int newNodesAddedCounter = 0; for (TNodeTemplate needHostNode : nodesToCheck) { Optional label = ModelUtilities.getTargetLabel(needHostNode); if (!label.isPresent()) { @@ -1839,7 +1842,15 @@ public TTopologyTemplate getMatchingTopology(TServiceTemplate serviceTemplate, L } } if (!suitableNodeTemplateAlreadyExists) { + assert needHostNode.getX() != null; + assert needHostNode.getY() != null; + int coordinateX = Integer.parseInt(needHostNode.getX()) - newNodesAddedCounter * 350; + int coordinateY = Integer.parseInt(needHostNode.getY()) + 180; + selectedTemplate.setX(String.valueOf(coordinateX)); + selectedTemplate.setY(String.valueOf(coordinateY)); + topologyToComplete.addNodeTemplate(selectedTemplate); + newNodesAddedCounter += 1; } TRelationshipTemplate newHostedOnRelationship = new TRelationshipTemplate();