package org.alien4cloud.tosca.model.definitions;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;
import alien4cloud.json.deserializer.OperationParameterDeserializer;
import alien4cloud.ui.form.annotation.FormProperties;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.collect.Sets;
/**
* Defines an operation available to manage particular aspects of the Node Type.
*
* @author luc boutier
*/
@Getter
@Setter
@NoArgsConstructor
@FormProperties({ "description" })
public class Operation {
/** Implementation artifact for the interface. */
private ImplementationArtifact implementationArtifact;
/** List of artifacts required by the implementation artifact. */
private List<DeploymentArtifact> dependencies;
/** Description of the operation. */
private String description;
/** This OPTIONAL property contains a list of one or more input parameter definitions. */
@JsonDeserialize(contentUsing = OperationParameterDeserializer.class)
private Map<String, IValue> inputParameters;
/** This element is not part of TOSCA but allows to specifies some portability meta-data on the operation. */
private Map<String, AbstractPropertyValue> portability;
/**
* This OPTIONAL property contains a map of one or more outputs this operation execution might generate.
* This is not part of TOSCA, and is populated when building the plan, based on the use of the get_operation_output function in the types definition
*/
@JsonIgnore
private Set<OperationOutput> outputs = Sets.newHashSet();
/**
* <p>
* Jackson DeSerialization workaround constructor to create an operation with no arguments.
* </p>
*
* @param emptyString The empty string provided by jackson.
*/
@SuppressWarnings("PMD.UnusedFormalParameterRule")
public Operation(String emptyString) {
}
@JsonIgnore
public OperationOutput getOutput(String name) {
OperationOutput toFind = new OperationOutput(name);
for (OperationOutput output : outputs) {
if (output.equals(toFind)) {
return output;
}
}
return null;
}
/**
* add an output, merge if needed the related attributes
*
* @param output
*/
public void addOutput(OperationOutput output) {
if (outputs.contains(output) && CollectionUtils.isNotEmpty(output.getRelatedAttributes())) {
// merge related attributes
getOutput(output.getName()).getRelatedAttributes().addAll(output.getRelatedAttributes());
} else {
outputs.add(output);
}
}
}