package org.alien4cloud.tosca.editor.processors.substitution; import java.util.Map; import javax.annotation.Resource; import org.alien4cloud.tosca.editor.EditionContextManager; import org.alien4cloud.tosca.editor.operations.substitution.RemoveSubstitutionTypeOperation; import org.alien4cloud.tosca.editor.processors.IEditorCommitableProcessor; import org.alien4cloud.tosca.model.Csar; import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.types.NodeType; import org.apache.commons.lang3.ArrayUtils; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.FilterBuilders; import org.springframework.stereotype.Component; import alien4cloud.dao.FilterUtil; import alien4cloud.dao.IGenericSearchDAO; import alien4cloud.dao.model.FetchContext; import alien4cloud.dao.model.GetMultipleDataResult; import alien4cloud.exception.DeleteReferencedObjectException; import alien4cloud.exception.NotFoundException; import alien4cloud.topology.TopologyService; /** * Delete the substitute of a topology template. */ @Component public class RemoveSubstitutionTypeProcessor implements IEditorCommitableProcessor<RemoveSubstitutionTypeOperation> { @Resource private TopologyService topologyService; @Resource(name = "alien-es-dao") private IGenericSearchDAO alienDAO; @Override public void process(RemoveSubstitutionTypeOperation operation) { Topology topology = EditionContextManager.getTopology(); if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } NodeType substitutionType = topology.getSubstitutionMapping().getSubstitutionType(); // FIXME alse check if no element inherits from this substitute type // the substitute type os within the topology's archive Csar csar = EditionContextManager.getCsar(); Topology[] topologies = getTopologiesUsing(csar.getName(), csar.getName(), csar.getVersion()); if (ArrayUtils.isNotEmpty(topologies)) { throw new DeleteReferencedObjectException("The substitution can not be removed since it's type is already used in at least another topology"); } topologyService.unloadType(topology, new String[] { substitutionType.getElementId() }); topology.setSubstitutionMapping(null); } @Override public void beforeCommit(RemoveSubstitutionTypeOperation operation) { // here we should eventually remove from the repo the type related to this substitution alienDAO.delete(NodeType.class, EditionContextManager.getTopology().getId()); } private Topology[] getTopologiesUsing(String elementId, String archiveName, String archiveVersion) { FilterBuilder customFilter = FilterBuilders.boolFilter() .mustNot(FilterBuilders.boolFilter().must(FilterBuilders.termFilter("archiveName", archiveName)) .must(FilterBuilders.termFilter("archiveVersion", archiveVersion))) .must(FilterBuilders.nestedFilter("dependencies", FilterBuilders.boolFilter().must(FilterBuilders.termFilter("dependencies.name", archiveName)) .must(FilterBuilders.termFilter("dependencies.version", archiveVersion)))); Map<String, String[]> filter = FilterUtil.singleKeyFilter("nodeTemplates.value.type", elementId); GetMultipleDataResult<Topology> result = alienDAO.search(Topology.class, null, filter, customFilter, FetchContext.SUMMARY, 0, Integer.MAX_VALUE); return result.getData(); } }