package org.alien4cloud.tosca.editor.processors; import javax.inject.Inject; import org.alien4cloud.tosca.editor.EditionContextManager; import org.alien4cloud.tosca.editor.operations.RecoverTopologyOperation; import org.alien4cloud.tosca.editor.services.EditorTopologyRecoveryHelperService; import org.alien4cloud.tosca.model.CSARDependency; import org.alien4cloud.tosca.model.templates.Topology; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Component; import alien4cloud.topology.TopologyService; import alien4cloud.tosca.context.ToscaContext; import alien4cloud.utils.AlienUtils; /** * process {@link RecoverTopologyOperation} * It will recover the topology after a dependency have change. * This can lead to node / relationship deletion or rebuild. */ @Component public class RecoverTopologyProcessor implements IEditorOperationProcessor<RecoverTopologyOperation> { @Inject private EditorTopologyRecoveryHelperService recoveryHelperService; @Inject private TopologyService topologyService; @Override public void process(RecoverTopologyOperation operation) { Topology topology = EditionContextManager.getTopology(); checkOperation(operation, topology); // process every recovery operation // we need a new context here, as we want to have fresh types from elasticsearch recoveryHelperService.processRecoveryOperations(topology, operation.getRecoveringOperations()); // make sure we also synch the dependencies and the caches types for (CSARDependency updatedDependency : AlienUtils.safe(operation.getUpdatedDependencies())) { ToscaContext.get().updateDependency(updatedDependency); } // TODO passing to this function the processRecoveryOperations ToscaContext should help reducing ES requests topologyService.rebuildDependencies(topology); } /** * If the operation is "empty", then try to fill it * * @param operation * @param topology */ private void checkOperation(RecoverTopologyOperation operation, Topology topology) { if (CollectionUtils.isEmpty(operation.getUpdatedDependencies())) { recoveryHelperService.buildRecoveryOperation(topology, operation); } } }