package org.argeo.api.slc.execution; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * * Implements both archetype and implementation of a given process. * * At specification time, executionSpec represents the spec of the * parameters accepted by the process, with, among others: type, default value * and, optionally, possible values for each parameter. Thus ExecutionSpec might * be a huge object. Note that when marshalling only a reference to a specific * ExecutionSpec is stored in the XML to optimize performance and avoid * redundancy between various ExecutionFlowDesciptor that might have the same * ExecutionSpec. * * At runtime, we build a RealizedFlow which references an * ExecutionFlowDescriptor. As it happens AFTER marshalling / unmarshalling * process, the ExecutionSpec is null but we manage to retrieve the * ExecutionSpec and store it in the RealizedFlow, whereas set values of the * parameters are stored in the values map. * * Generally, values object are either a PrimitiveAccessor or a * RefValue but can be other objects. */ public class ExecutionFlowDescriptor implements Serializable, Cloneable { private static final long serialVersionUID = 7101944857038041216L; private String name; private String description; private String path; private Map values; private ExecutionSpec executionSpec; public ExecutionFlowDescriptor() { } public ExecutionFlowDescriptor(String name, String description, Map values, ExecutionSpec executionSpec) { this.name = name; this.values = values; this.executionSpec = executionSpec; } /** The referenced {@link ExecutionSpec} is NOT cloned. */ @Override protected Object clone() throws CloneNotSupportedException { return new ExecutionFlowDescriptor(name, description, new HashMap(values), executionSpec); } public String getName() { return name; } /** * @deprecated will be removed in SLC 2.x, the path should be the part of * the name with '/' */ public String getPath() { return path; } /** * @deprecated will be removed in SLC 2.0, the path should be the part of * the name with '/' */ public void setPath(String path) { this.path = path; } public Map getValues() { return values; } public ExecutionSpec getExecutionSpec() { return executionSpec; } public void setName(String name) { this.name = name; } public void setValues(Map values) { this.values = values; } public void setExecutionSpec(ExecutionSpec executionSpec) { this.executionSpec = executionSpec; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object obj) { if (obj instanceof ExecutionFlowDescriptor) return name.equals(((ExecutionFlowDescriptor) obj).getName()); return false; } @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { return (path != null && !path.trim().equals("") ? path + "/" : "") + name; } }