use of org.eclipse.winery.model.tosca.TRequirement in project winery by eclipse.
the class BackendUtils method mergeServiceTemplateAinServiceTemplateB.
public static void mergeServiceTemplateAinServiceTemplateB(ServiceTemplateId serviceTemplateIdA, ServiceTemplateId serviceTemplateIdB) throws IOException {
IRepository repository = RepositoryFactory.getRepository();
TTopologyTemplate topologyTemplateA = repository.getElement(serviceTemplateIdA).getTopologyTemplate();
TServiceTemplate serviceTemplateB = repository.getElement(serviceTemplateIdB);
TTopologyTemplate topologyTemplateB = serviceTemplateB.getTopologyTemplate();
Optional<Integer> shiftLeft = topologyTemplateB.getNodeTemplateOrRelationshipTemplate().stream().filter(x -> x instanceof TNodeTemplate).map(x -> (TNodeTemplate) x).max(Comparator.comparingInt(n -> ModelUtilities.getLeft(n).orElse(0))).map(n -> ModelUtilities.getLeft(n).orElse(0));
if (shiftLeft.isPresent()) {
Map<String, String> idMapping = new HashMap<>();
// collect existing node template ids
topologyTemplateB.getNodeTemplateOrRelationshipTemplate().stream().filter(x -> x instanceof TNodeTemplate).map(x -> (TNodeTemplate) x).forEach(x -> idMapping.put(x.getId(), x.getId()));
// collect existing relationship template ids
topologyTemplateB.getNodeTemplateOrRelationshipTemplate().stream().filter(x -> x instanceof TRelationshipTemplate).map(x -> (TRelationshipTemplate) x).forEach(x -> idMapping.put(x.getId(), x.getId()));
if (topologyTemplateB.getNodeTemplates() != null) {
// collect existing requirement ids
topologyTemplateB.getNodeTemplates().stream().filter(nt -> nt.getRequirements() != null).forEach(nt -> nt.getRequirements().getRequirement().stream().forEach(x -> idMapping.put(x.getId(), x.getId())));
// collect existing capability ids
topologyTemplateB.getNodeTemplates().stream().filter(nt -> nt.getCapabilities() != null).forEach(nt -> nt.getCapabilities().getCapability().stream().forEach(x -> idMapping.put(x.getId(), x.getId())));
}
if (topologyTemplateA.getNodeTemplates() != null) {
// patch ids of reqs change them if required
topologyTemplateA.getNodeTemplates().stream().filter(nt -> nt.getRequirements() != null).forEach(nt -> nt.getRequirements().getRequirement().forEach(req -> {
String oldId = req.getId();
String newId = req.getId();
while (idMapping.containsKey(newId)) {
newId = newId + "-new";
}
idMapping.put(req.getId(), newId);
req.setId(newId);
topologyTemplateA.getRelationshipTemplates().stream().filter(rt -> rt.getSourceElement().getRef() instanceof TRequirement).forEach(rt -> {
TRequirement sourceElement = (TRequirement) rt.getSourceElement().getRef();
if (sourceElement.getId().equalsIgnoreCase(oldId)) {
sourceElement.setId(req.getId());
}
});
}));
// patch ids of caps change them if required
topologyTemplateA.getNodeTemplates().stream().filter(nt -> nt.getCapabilities() != null).forEach(nt -> nt.getCapabilities().getCapability().forEach(cap -> {
String oldId = cap.getId();
String newId = cap.getId();
while (idMapping.containsKey(newId)) {
newId = newId + "-new";
}
idMapping.put(cap.getId(), newId);
cap.setId(newId);
topologyTemplateA.getRelationshipTemplates().stream().filter(rt -> rt.getTargetElement().getRef() instanceof TCapability).forEach(rt -> {
TCapability targetElement = (TCapability) rt.getTargetElement().getRef();
if (targetElement.getId().equalsIgnoreCase(oldId)) {
targetElement.setId(cap.getId());
}
});
}));
}
// patch the ids of node templates and add them
topologyTemplateA.getNodeTemplateOrRelationshipTemplate().stream().filter(x -> x instanceof TNodeTemplate).map(x -> (TNodeTemplate) x).forEach(nt -> {
String newId = nt.getId();
while (idMapping.containsKey(newId)) {
newId = newId + "-new";
}
idMapping.put(nt.getId(), newId);
nt.setId(newId);
int newLeft = ModelUtilities.getLeft((TNodeTemplate) nt).orElse(0) + shiftLeft.get();
((TNodeTemplate) nt).setX(Integer.toString(newLeft));
topologyTemplateB.getNodeTemplateOrRelationshipTemplate().add(nt);
});
// patch the ids of relationship templates and add them
topologyTemplateA.getNodeTemplateOrRelationshipTemplate().stream().filter(x -> x instanceof TRelationshipTemplate).map(x -> (TRelationshipTemplate) x).forEach(rt -> {
String newId = rt.getId();
while (idMapping.containsKey(newId)) {
newId = newId + "-new";
}
idMapping.put(rt.getId(), newId);
rt.setId(newId);
topologyTemplateB.getNodeTemplateOrRelationshipTemplate().add(rt);
});
} else {
topologyTemplateB.getNodeTemplateOrRelationshipTemplate().addAll(topologyTemplateA.getNodeTemplateOrRelationshipTemplate());
}
repository.setElement(serviceTemplateIdB, serviceTemplateB);
}
use of org.eclipse.winery.model.tosca.TRequirement in project winery by eclipse.
the class IGenericRepository method getReferencedDefinitionsChildIds.
default Collection<DefinitionsChildId> getReferencedDefinitionsChildIds(ComplianceRuleId id) {
// We have to use a HashSet to ensure that no duplicate ids are added
// E.g., there may be multiple relationship templates having the same type
Collection<DefinitionsChildId> ids = new HashSet<>();
TComplianceRule complianceRule = this.getElement(id);
// TODO extend to required Structure
if (complianceRule.getIdentifier() != null) {
for (TEntityTemplate entityTemplate : complianceRule.getIdentifier().getNodeTemplateOrRelationshipTemplate()) {
QName qname = entityTemplate.getType();
if (entityTemplate instanceof TNodeTemplate) {
ids.add(new NodeTypeId(qname));
TNodeTemplate n = (TNodeTemplate) entityTemplate;
// crawl through deployment artifacts
TDeploymentArtifacts deploymentArtifacts = n.getDeploymentArtifacts();
if (deploymentArtifacts != null) {
List<TDeploymentArtifact> das = deploymentArtifacts.getDeploymentArtifact();
for (TDeploymentArtifact da : das) {
ids.add(new ArtifactTypeId(da.getArtifactType()));
if ((qname = da.getArtifactRef()) != null) {
ids.add(new ArtifactTemplateId(qname));
}
}
}
// crawl through reqs/caps
TNodeTemplate.Requirements requirements = n.getRequirements();
if (requirements != null) {
for (TRequirement req : requirements.getRequirement()) {
QName type = req.getType();
RequirementTypeId rtId = new RequirementTypeId(type);
ids.add(rtId);
}
}
TNodeTemplate.Capabilities capabilities = n.getCapabilities();
if (capabilities != null) {
for (TCapability cap : capabilities.getCapability()) {
QName type = cap.getType();
CapabilityTypeId ctId = new CapabilityTypeId(type);
ids.add(ctId);
}
}
// crawl through policies
org.eclipse.winery.model.tosca.TNodeTemplate.Policies policies = n.getPolicies();
if (policies != null) {
for (TPolicy pol : policies.getPolicy()) {
QName type = pol.getPolicyType();
PolicyTypeId ctId = new PolicyTypeId(type);
ids.add(ctId);
}
}
} else {
assert (entityTemplate instanceof TRelationshipTemplate);
ids.add(new RelationshipTypeId(qname));
}
}
}
return ids;
}
use of org.eclipse.winery.model.tosca.TRequirement in project winery by eclipse.
the class ServiceTemplateResource method injectNodeTemplates.
@POST
@Path("injector/replace")
@Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
public Response injectNodeTemplates(InjectorReplaceData injectorReplaceData, @Context UriInfo uriInfo) throws Exception, IOException, ParserConfigurationException, SAXException, SplittingException {
if (injectorReplaceData.hostInjections != null) {
Collection<TTopologyTemplate> hostInjectorTopologyTemplates = injectorReplaceData.hostInjections.values();
hostInjectorTopologyTemplates.forEach(t -> {
try {
ModelUtilities.patchAnyAttributes(t.getNodeTemplates());
} catch (IOException e) {
LOGGER.error("XML was invalid", e);
}
});
}
if (injectorReplaceData.connectionInjections != null) {
Collection<TTopologyTemplate> connectionInjectorTopologyTemplates = injectorReplaceData.connectionInjections.values();
connectionInjectorTopologyTemplates.forEach(t -> {
try {
ModelUtilities.patchAnyAttributes(t.getNodeTemplates());
} catch (IOException e) {
LOGGER.error("XML was invalid", e);
}
});
}
Splitting splitting = new Splitting();
TTopologyTemplate matchedHostsTopologyTemplate;
TTopologyTemplate matchedConnectedTopologyTemplate;
// Test Method findOpenRequirements
Map<TRequirement, String> requirementsAndMatchingBasisCapabilityTypes = splitting.getOpenRequirementsAndMatchingBasisCapabilityTypeNames(this.getServiceTemplate().getTopologyTemplate());
// Output check
for (TRequirement req : requirementsAndMatchingBasisCapabilityTypes.keySet()) {
System.out.println("open Requirement: " + req.getId());
System.out.println("matchingbasisType: " + requirementsAndMatchingBasisCapabilityTypes.get(req));
}
if (requirementsAndMatchingBasisCapabilityTypes.containsValue("Container")) {
matchedHostsTopologyTemplate = splitting.injectNodeTemplates(this.getServiceTemplate().getTopologyTemplate(), injectorReplaceData.hostInjections);
if (requirementsAndMatchingBasisCapabilityTypes.containsValue("Endpoint")) {
matchedConnectedTopologyTemplate = splitting.injectConnectionNodeTemplates(matchedHostsTopologyTemplate, injectorReplaceData.connectionInjections);
} else {
matchedConnectedTopologyTemplate = matchedHostsTopologyTemplate;
}
} else if (requirementsAndMatchingBasisCapabilityTypes.containsValue("Endpoint")) {
matchedConnectedTopologyTemplate = splitting.injectConnectionNodeTemplates(this.getServiceTemplate().getTopologyTemplate(), injectorReplaceData.connectionInjections);
} else {
throw new SplittingException("No open Requirements which can be matched");
}
TTopologyTemplate daSpecifiedTopology = matchedConnectedTopologyTemplate;
// Start additional functionality Driver Injection
if (!DASpecification.getNodeTemplatesWithAbstractDAs(matchedConnectedTopologyTemplate).isEmpty() && DASpecification.getNodeTemplatesWithAbstractDAs(matchedConnectedTopologyTemplate) != null) {
daSpecifiedTopology = DriverInjection.injectDriver(matchedConnectedTopologyTemplate);
}
// End additional functionality Driver Injection
this.getServiceTemplate().setTopologyTemplate(daSpecifiedTopology);
LOGGER.debug("Persisting...");
RestUtils.persist(this);
LOGGER.debug("Persisted.");
// No renaming of the Service Template allowed because of the plans
URI url = uriInfo.getBaseUri().resolve(RestUtils.getAbsoluteURL(id));
LOGGER.debug("URI of the old and new service template {}", url.toString());
return Response.created(url).build();
}
use of org.eclipse.winery.model.tosca.TRequirement in project winery by eclipse.
the class ServiceTemplateResource method getInjectorOptions.
@GET
@Path("injector/options")
@Produces({ MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
public Response getInjectorOptions() {
Splitting splitting = new Splitting();
TTopologyTemplate topologyTemplate = this.getServiceTemplate().getTopologyTemplate();
Map<String, List<TTopologyTemplate>> hostMatchingOptions;
Map<String, List<TTopologyTemplate>> connectionMatchingOptions;
InjectorReplaceOptions injectionReplaceOptions = new InjectorReplaceOptions();
try {
Map<TRequirement, String> requirementsAndMatchingBasisCapabilityTypes = splitting.getOpenRequirementsAndMatchingBasisCapabilityTypeNames(this.getServiceTemplate().getTopologyTemplate());
// Output check
for (TRequirement req : requirementsAndMatchingBasisCapabilityTypes.keySet()) {
System.out.println("open Requirement: " + req.getId());
System.out.println("matchingBasisType: " + requirementsAndMatchingBasisCapabilityTypes.get(req));
}
if (requirementsAndMatchingBasisCapabilityTypes.containsValue("Container")) {
hostMatchingOptions = splitting.getHostingMatchingOptionsWithDefaultLabeling(topologyTemplate);
} else {
hostMatchingOptions = null;
}
if (requirementsAndMatchingBasisCapabilityTypes.containsValue("Endpoint")) {
connectionMatchingOptions = splitting.getConnectionInjectionOptions(topologyTemplate);
} else {
connectionMatchingOptions = null;
}
injectionReplaceOptions.setTopologyTemplate(topologyTemplate);
injectionReplaceOptions.setHostInjectionOptions(hostMatchingOptions);
injectionReplaceOptions.setConnectionInjectionOptions(connectionMatchingOptions);
if (hostMatchingOptions == null && connectionMatchingOptions == null) {
return Response.status(Status.BAD_REQUEST).type(MediaType.TEXT_PLAIN).entity("No need for matching").build();
}
} catch (SplittingException e) {
LOGGER.error("Could not match", e);
return Response.status(Status.BAD_REQUEST).entity(e.getMessage()).build();
}
return Response.ok().entity(injectionReplaceOptions).build();
}
use of org.eclipse.winery.model.tosca.TRequirement in project winery by eclipse.
the class RequirementsResource method addNewElement.
/**
* Adds an element using form-encoding
* <p>
* This is necessary as TRequirementRef contains an IDREF and the XML snippet itself does not contain the target id
*
* @param name the optional name of the requirement
* @param reference the reference to a requirement in the topology
*/
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response addNewElement(@FormParam("name") String name, @FormParam("ref") String reference) {
if (reference == null) {
return Response.status(Status.BAD_REQUEST).entity("A reference has to be provided").build();
}
TRequirementRef ref = new TRequirementRef();
// may also be null
ref.setName(name);
// The XML model forces us to put a reference to the object and not just the string
ServiceTemplateResource rs = (ServiceTemplateResource) this.res;
TRequirement resolved = ModelUtilities.resolveRequirement(rs.getServiceTemplate(), reference);
// In case nothing was found: report back to the user
if (resolved == null) {
return Response.status(Status.BAD_REQUEST).entity("Reference could not be resolved").build();
}
ref.setRef(resolved);
// "this.alreadyContains(ref)" cannot be called as this leads to a mappable exception: The data does not contain an id where the given ref attribute may point to
this.list.add(ref);
return CollectionsHelper.persist(this.res, this, ref, true);
}
Aggregations