package net.sourceforge.seqware.common.model; import java.io.Serializable; import java.util.Date; import java.util.Objects; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import net.sourceforge.seqware.common.security.PermissionsAware; import net.sourceforge.seqware.common.util.jsontools.JsonUtil; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <p> * Workflow class. * </p> * * @author boconnor * @version $Id: $Id */ public class Workflow extends PermissionsAware implements Serializable, Comparable<Workflow>, Annotatable<WorkflowAttribute>, FirstTierModel { /** * LEFT OFF WITH: this needs to be finished */ private static final long serialVersionUID = 1L; private Integer workflowId; private Integer swAccession; private String name; private String description; private String inputAlgorithm; private String version; private String seqwareVersion; private String baseIniFile; private String cwd; private String command; private String template; /** * @deprecated this does not seem to be in use and probably should not be */ private String host; private String username; private String permanentBundleLocation; private String workflowClass; private String workflowType; private String workflowEngine; private Date createTimestamp; private Date updateTimestamp; private boolean isPrivate; private boolean isPublic; private Registration owner; private SortedSet<WorkflowRun> workflowRuns; private SortedSet<WorkflowParam> workflowParams; private Set<WorkflowAttribute> workflowAttributes = new TreeSet<>(); private static final Logger LOGGER = LoggerFactory.getLogger(Workflow.class); /** * <p> * Constructor for Workflow. * </p> */ public Workflow() { super(); } /** * {@inheritDoc} * * @param that */ @Override public int compareTo(Workflow that) { if (that == null) return -1; if (Objects.equals(that.getSwAccession(), this.getSwAccession())) // when both names are // null return 0; if (that.getSwAccession() == null) return -1; // when only the other name is null return (that.getSwAccession().compareTo(this.getSwAccession())); } /** {@inheritDoc} */ @Override public String toString() { return new ToStringBuilder(this).append("swAccession", getSwAccession()).toString(); } /** * {@inheritDoc} * * @param other */ @Override public boolean equals(Object other) { if ((this == other)) return true; if (!(other instanceof Workflow)) return false; Workflow castOther = (Workflow) other; return new EqualsBuilder().append(this.getSwAccession(), castOther.getSwAccession()).isEquals(); } /** {@inheritDoc} */ @Override public int hashCode() { return new HashCodeBuilder().append(getSwAccession()).toHashCode(); } /** * <p> * Getter for the field <code>cwd</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getCwd() { return cwd; } /** * <p> * Setter for the field <code>cwd</code>. * </p> * * @param cwd * a {@link java.lang.String} object. */ public void setCwd(String cwd) { this.cwd = cwd; } /** * <p> * Getter for the field <code>command</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getCommand() { return command; } /** * <p> * Setter for the field <code>command</code>. * </p> * * @param command * a {@link java.lang.String} object. */ public void setCommand(String command) { this.command = command; } /** * <p> * Getter for the field <code>template</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getTemplate() { return template; } /** * <p> * Setter for the field <code>template</code>. * </p> * * @param template * a {@link java.lang.String} object. */ public void setTemplate(String template) { this.template = template; } /** * <p> * Getter for the field <code>workflowId</code>. * </p> * * @return a {@link java.lang.Integer} object. */ public Integer getWorkflowId() { return workflowId; } /** * <p> * Setter for the field <code>workflowId</code>. * </p> * * @param workflowId * a {@link java.lang.Integer} object. */ public void setWorkflowId(Integer workflowId) { this.workflowId = workflowId; } /** * <p> * Getter for the field <code>swAccession</code>. * </p> * * @return a {@link java.lang.Integer} object. */ @Override public Integer getSwAccession() { return swAccession; } /** * <p> * Setter for the field <code>swAccession</code>. * </p> * * @param swAccession * a {@link java.lang.Integer} object. */ public void setSwAccession(Integer swAccession) { this.swAccession = swAccession; } /** * <p> * Getter for the field <code>name</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getName() { return name; } /** * <p> * getJsonEscapeName. * </p> * * @return a {@link java.lang.String} object. */ public String getJsonEscapeName() { return JsonUtil.forJSON(name); } /** * <p> * Setter for the field <code>name</code>. * </p> * * @param name * a {@link java.lang.String} object. */ public void setName(String name) { this.name = name; } /** * <p> * getJsonEscapeDescription. * </p> * * @return a {@link java.lang.String} object. */ public String getJsonEscapeDescription() { return JsonUtil.forJSON(description); } /** * <p> * Getter for the field <code>description</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getDescription() { return description; } /** * <p> * Setter for the field <code>description</code>. * </p> * * @param description * a {@link java.lang.String} object. */ public void setDescription(String description) { this.description = description; } /** * <p> * Getter for the field <code>inputAlgorithm</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getInputAlgorithm() { return inputAlgorithm; } /** * <p> * Setter for the field <code>inputAlgorithm</code>. * </p> * * @param inputAlgorithm * a {@link java.lang.String} object. */ public void setInputAlgorithm(String inputAlgorithm) { this.inputAlgorithm = inputAlgorithm; } /** * <p> * Getter for the field <code>version</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getVersion() { return version; } /** * <p> * Setter for the field <code>version</code>. * </p> * * @param version * a {@link java.lang.String} object. */ public void setVersion(String version) { this.version = version; } /** * <p> * Getter for the field <code>seqwareVersion</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getSeqwareVersion() { return seqwareVersion; } /** * <p> * Setter for the field <code>seqwareVersion</code>. * </p> * * @param seqwareVersion * a {@link java.lang.String} object. */ public void setSeqwareVersion(String seqwareVersion) { this.seqwareVersion = seqwareVersion; } /** * <p> * Getter for the field <code>baseIniFile</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getBaseIniFile() { return baseIniFile; } /** * <p> * Setter for the field <code>baseIniFile</code>. * </p> * * @param baseIniFile * a {@link java.lang.String} object. */ public void setBaseIniFile(String baseIniFile) { this.baseIniFile = baseIniFile; } /** * <p> * Getter for the field <code>host</code>. * </p> * * @deprecated * @return a {@link java.lang.String} object. */ public String getHost() { return host; } /** * <p> * Setter for the field <code>host</code>. * </p> * * @deprecated * @param host * a {@link java.lang.String} object. */ public void setHost(String host) { this.host = host; } /** * <p> * Getter for the field <code>username</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getUsername() { return username; } /** * <p> * Setter for the field <code>username</code>. * </p> * * @param username * a {@link java.lang.String} object. */ public void setUsername(String username) { this.username = username; } /** * <p> * Getter for the field <code>createTimestamp</code>. * </p> * * @return a {@link java.util.Date} object. */ public Date getCreateTimestamp() { return createTimestamp; } /** * <p> * Setter for the field <code>createTimestamp</code>. * </p> * * @param createTimestamp * a {@link java.util.Date} object. */ public void setCreateTimestamp(Date createTimestamp) { this.createTimestamp = createTimestamp; } /** * <p> * Getter for the field <code>updateTimestamp</code>. * </p> * * @return a {@link java.util.Date} object. */ public Date getUpdateTimestamp() { return updateTimestamp; } /** * <p> * Setter for the field <code>updateTimestamp</code>. * </p> * * @param updateTimestamp * a {@link java.util.Date} object. */ public void setUpdateTimestamp(Date updateTimestamp) { this.updateTimestamp = updateTimestamp; } /** * <p> * isPrivate. * </p> * * @return a boolean. */ public boolean isPrivate() { return isPrivate; } /** * <p> * getPrivate. * </p> * * @return a boolean. */ public boolean getPrivate() { return isPrivate; } /** * <p> * setPrivate. * </p> * * @param isPrivate * a boolean. */ public void setPrivate(boolean isPrivate) { this.isPrivate = isPrivate; } /** * <p> * isPublic. * </p> * * @return a boolean. */ public boolean isPublic() { return isPublic; } /** * <p> * getPublic. * </p> * * @return a boolean. */ public boolean getPublic() { return isPublic; } /** * <p> * setPublic. * </p> * * @param isPublic * a boolean. */ public void setPublic(boolean isPublic) { this.isPublic = isPublic; } /** * <p> * Getter for the field <code>owner</code>. * </p> * * @return a {@link net.sourceforge.seqware.common.model.Registration} object. */ public Registration getOwner() { return owner; } /** * <p> * Setter for the field <code>owner</code>. * </p> * * @param owner * a {@link net.sourceforge.seqware.common.model.Registration} object. */ public void setOwner(Registration owner) { this.owner = owner; } /** * <p> * Getter for the field <code>workflowRuns</code>. * </p> * * @return a {@link java.util.SortedSet} object. */ public SortedSet<WorkflowRun> getWorkflowRuns() { return workflowRuns; } /** * <p> * Setter for the field <code>workflowRuns</code>. * </p> * * @param workflowRuns * a {@link java.util.SortedSet} object. */ public void setWorkflowRuns(SortedSet<WorkflowRun> workflowRuns) { this.workflowRuns = workflowRuns; } /** * <p> * Getter for the field <code>workflowParams</code>. * </p> * * @return a {@link java.util.SortedSet} object. */ public SortedSet<WorkflowParam> getWorkflowParams() { return workflowParams; } /** * <p> * getVisibleWorkflowParams. * </p> * * @return a {@link java.util.SortedSet} object. */ public SortedSet<WorkflowParam> getVisibleWorkflowParams() { if (workflowParams == null) return null; SortedSet<WorkflowParam> visibleParams = new TreeSet<>(); for (WorkflowParam workflowParam : workflowParams) { if (workflowParam.getDisplay() != null && workflowParam.getDisplay() && !"file".equals(workflowParam.getType())) { visibleParams.add(workflowParam); } } return visibleParams; } /** * <p> * getVisibleWorkflowParamsWithDifferentValue. * </p> * * @return a {@link java.util.SortedSet} object. */ public SortedSet<WorkflowParam> getVisibleWorkflowParamsWithDifferentValue() { if (workflowParams == null) return null; SortedSet<WorkflowParam> visibleParamsWDV = getVisibleWorkflowParams(); SortedSet<WorkflowParam> res = new TreeSet<>(); for (WorkflowParam workflowParam : visibleParamsWDV) { String defaultValue = workflowParam.getDefaultValue(); if (defaultValue != null) { // logger.debug("New param"); // logger.debug("Def value = " + defaultValue); SortedSet<WorkflowParamValue> differentValues = new TreeSet<>(); SortedSet<WorkflowParamValue> values = workflowParam.getValues(); for (WorkflowParamValue workflowParamValue : values) { // System.out.print("value = " + workflowParamValue.getValue()); if (defaultValue.equals(workflowParamValue.getValue())) { LOGGER.debug("Set Default value = " + workflowParamValue.getDisplayName()); workflowParam.setDisplayName(workflowParamValue.getDisplayName()); } else { LOGGER.debug(" -> Add value!"); differentValues.add(workflowParamValue); } } workflowParam.setValues(differentValues); res.add(workflowParam); } } return res; } /** * <p> * getWorkflowParamsWithDifferentFileMetaType. * </p> * * @return a {@link java.util.SortedSet} object. */ public SortedSet<WorkflowParam> getWorkflowParamsWithDifferentFileMetaType() { // return getVisibleWorkflowParams(); if (workflowParams == null) return null; SortedSet<WorkflowParam> paramsWithDifFMT = new TreeSet<>(); // SortedSet<WorkflowParam> params = getVisibleWorkflowParams(); SortedSet<WorkflowParam> params = workflowParams; for (WorkflowParam param : params) { // boolean isAdd = true; String type = param.getType(); String paramFMT = param.getFileMetaType(); // logger.debug("type = " + type + "; meta type = " + paramFMT); if (paramFMT != null && !"".equals(paramFMT) && type != null && "file".equals(type)) { /* * for(WorkflowParam paramWithDifFMT: paramsWithDifFMT){ if(paramFMT.equals(paramWithDifFMT.getFileMetaType())){ isAdd = * false; break; } } * * if(isAdd){ paramsWithDifFMT.add(param); } */ LOGGER.debug("Add this param"); paramsWithDifFMT.add(param); } } return paramsWithDifFMT; } /** * <p> * isLaunch. * </p> * * @return a boolean. */ public boolean isLaunch() { boolean isLaunch = false; if (this.workflowParams.size() > 0) { isLaunch = true; } return isLaunch; } /** * <p> * Setter for the field <code>workflowParams</code>. * </p> * * @param workflowParams * a {@link java.util.SortedSet} object. */ public void setWorkflowParams(SortedSet<WorkflowParam> workflowParams) { this.workflowParams = workflowParams; } /** * <p> * getFullName. * </p> * * @return a {@link java.lang.String} object. */ public String getFullName() { String fullName = ""; if (name != null) { fullName = name; if (version != null) { fullName = fullName + " " + version; } } return fullName; } /** * <p> * getJsonEscapeFullName. * </p> * * @return a {@link java.lang.String} object. */ public String getJsonEscapeFullName() { return JsonUtil.forJSON(getFullName()); } /** * <p> * Getter for the field <code>permanentBundleLocation</code>. * </p> * * @return a {@link java.lang.String} object. */ public String getPermanentBundleLocation() { return permanentBundleLocation; } public String getWorkflowClass() { return workflowClass; } public void setWorkflowClass(String workflowClass) { this.workflowClass = workflowClass; } public String getWorkflowType() { return workflowType; } public void setWorkflowType(String workflowType) { this.workflowType = workflowType; } public String getWorkflowEngine() { return workflowEngine; } public void setWorkflowEngine(String workflowEngine) { this.workflowEngine = workflowEngine; } /** * <p> * Setter for the field <code>permanentBundleLocation</code>. * </p> * * @param permanentBundleLocation * a {@link java.lang.String} object. */ public void setPermanentBundleLocation(String permanentBundleLocation) { this.permanentBundleLocation = permanentBundleLocation; } /** * {@inheritDoc} * * @return */ @Override public boolean givesPermissionInternal(Registration registration, Set<Integer> considered) { boolean hasPermission = true; if (registration == null) { hasPermission = false; } // else if (registration.equals(owner) || registration.isLIMSAdmin()) // { // hasPermission = true; // } // else // { // hasPermission = false; // } if (!hasPermission) { LOGGER.info("Workflow does not give permission"); throw new SecurityException("User " + registration.getEmailAddress() + " does not have permission to modify aspects of workflow " + this.getName()); } else { LOGGER.info("Workflows are public by default"); } return hasPermission; } /** * <p> * Getter for the field <code>workflowAttributes</code>. * </p> * * @return a {@link java.util.Set} object. */ public Set<WorkflowAttribute> getWorkflowAttributes() { return workflowAttributes; } /** * <p> * Setter for the field <code>workflowAttributes</code>. * </p> * * @param workflowAttributes * a {@link java.util.Set} object. */ public void setWorkflowAttributes(Set<WorkflowAttribute> workflowAttributes) { this.workflowAttributes = workflowAttributes; } @Override public Set<WorkflowAttribute> getAnnotations() { return this.getWorkflowAttributes(); } }