package org.alien4cloud.tosca.editor;
import org.alien4cloud.tosca.model.Csar;
import org.alien4cloud.tosca.model.templates.Topology;
import alien4cloud.tosca.context.ToscaContext;
import alien4cloud.utils.DirectoryJSonWalker;
import alien4cloud.utils.TreeNode;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.alien4cloud.tosca.editor.operations.AbstractEditorOperation;
import org.alien4cloud.tosca.editor.operations.RecoverTopologyOperation;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
/**
* Topology edition context is related to a specific topology that is currently under edition.
*
* Edition context is closed automatically when no users are currently editing it or when inactive after 5 minutes.
*/
@Getter
@Setter
@NoArgsConstructor
public class EditionContext {
/** The archive under edition. Note that we don't allow updates to this object in the editor. */
private Csar csar;
// TODO add node types and other elements we can get from a CSAR to enable full archive edition rather than just topology edition.
/** The topology as processed after applying all operations on the saved topology. */
private Topology topology;
/** The tosca context associated with the topology context. It caches the types loaded from ElasticSearch. */
private ToscaContext.Context toscaContext;
/** Path to the topology's local git repository. */
private Path localGitPath;
/** The operation under processing if any or null. */
private AbstractEditorOperation currentOperation;
/** The index of the operation considered as the last operation (may be in the middle based on undo/redo) */
private int lastOperationIndex = -1;
/** The index of the last operation that has been saved (in ES and commit). */
private int lastSavedOperationIndex = -1;
/** List of commands that have been applied to the topology from the last-saved version. */
private List<AbstractEditorOperation> operations = Lists.newArrayList();
/** Root of the file hierarchy. */
private TreeNode archiveContentTree;
/** List of the operations generated to recover the topology */
private RecoverTopologyOperation recoveryOperation;
/**
* Create a new instance of a topology edition context from an existing topology.
*
* @param csar The archive under edition.
* @param topology The topology for which to create the context.
* @param localGitPath The git location associated with the topology.
*/
public EditionContext(Csar csar, Topology topology, Path localGitPath) throws IOException {
this.csar = csar;
this.topology = topology;
this.toscaContext = new ToscaContext.Context(topology.getDependencies());
this.localGitPath = localGitPath;
// initialize the file tree based on the git repository location
this.archiveContentTree = DirectoryJSonWalker.getDirectoryTree(this.localGitPath);
}
/**
* Reset the topology context to it's initial state.
*
* @param editionClone The clone of the initial topology. // TODO better use an inner java cloning.
* @throws IOException In case we wait to initialize the archive content tree.
*/
public void reset(Topology editionClone) throws IOException {
this.topology = editionClone;
this.toscaContext = new ToscaContext.Context(topology.getDependencies());
this.archiveContentTree = DirectoryJSonWalker.getDirectoryTree(this.localGitPath);
}
public void refreshContentTree() throws IOException {
this.archiveContentTree = DirectoryJSonWalker.getDirectoryTree(this.localGitPath);
}
}