You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:17:08 UTC
[27/28] incubator-taverna-common-activities git commit: Revert
"temporarily empty repository"
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/RuntimeEnvironmentConstraint.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/RuntimeEnvironmentConstraint.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/RuntimeEnvironmentConstraint.java
new file mode 100644
index 0000000..baa68d2
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/RuntimeEnvironmentConstraint.java
@@ -0,0 +1,162 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * When use cases present a runtime environment, then they don't want to express
+ * that these would provide such, but that these request such, i.e. they constrain
+ * lists of potentially eligible queues.
+ * @author Steffen Moeller
+ * @since 2008
+ */
+public class RuntimeEnvironmentConstraint extends RuntimeEnvironment {
+
+ private static Logger logger = Logger.getLogger(RuntimeEnvironmentConstraint.class);
+
+ private static String[] ACCEPTED_RELATIONS = new String[] {"=", ">=", "<=", ">", "<"};
+ /**
+ * If there is no relation specified, presume >=
+ */
+ private static String DEFAULT_RELATION = ">=";
+
+ public static String[] getAcceptedRelations() {
+ return ACCEPTED_RELATIONS;
+ }
+
+ public static String getDefaultRelation() {
+ return DEFAULT_RELATION;
+ }
+
+ /**
+ * Identifies the relation between runtime environments to be tested
+ */
+ protected String relation;
+
+ /**
+ * Accessor function for relation
+ */
+ public String getRelation() {
+ return this.relation;
+ }
+
+ /**
+ * Tests of a relation is supported
+ * @param relation
+ * @return true iff in <, > , <=, >=, =
+ */
+ public static boolean acceptedRelation(String relation) {
+ if ((null == relation) || relation.equals("")) {
+ return false;
+ }
+ return relation.equals("=")||relation.equals(">=")||relation.equals("<=")||relation.equals(">")||relation.equals("<");
+ }
+
+ /**
+ * Constructor
+ * @param id - expects the name of the runtime environment together with the version to which the
+ * @param relation - relates to (">","<","=",">=","<=")
+ */
+ public RuntimeEnvironmentConstraint(String id, String relation) {
+ super(id);
+ if (null == relation || relation.equals("")) {
+ relation=RuntimeEnvironmentConstraint.getDefaultRelation();
+ }
+ if (relation.equals("==")) {
+ relation="=";
+ }
+ else if (relation.equals("=<")) {
+ relation="<=";
+ }
+ else if (!RuntimeEnvironmentConstraint.acceptedRelation(relation)) {
+ logger.warn("Unknown relation '"+relation+"', presuming '"+RuntimeEnvironmentConstraint.getDefaultRelation()+"'");
+ relation=RuntimeEnvironmentConstraint.getDefaultRelation();
+ }
+ this.relation=relation;
+ }
+
+ /**
+ * Perfoms test if the RuntimeEnvironment (RE) passed as argument fulfills the requirements set by the constraint.
+ * @param re - RE to test
+ * @return true iff the RE fulfills this REconstraint.
+ */
+ public boolean isFulfilledBy(RuntimeEnvironment re) {
+ logger.info(re.getID()+" " + this.getRelation() + " "+this.getID() + " ?");
+ if (this.getRelation().equals("=")) {
+ logger.info("=");
+ return re.getID().equals(this.getID());
+ }
+ if (!re.getName().equals(this.getName())) {
+ logger.warn("Name match failed");
+ return false;
+ }
+ int c = RuntimeEnvironment.compareVersions(re.getVersion(),this.getVersion());
+ logger.info("c="+c);
+ if (this.getRelation().equals(">")) return c>0;
+ if (this.getRelation().equals(">=")) return c>=0;
+ if (this.getRelation().equals("<=")) return c<=0;
+ if (this.getRelation().equals("<")) return c<0;
+ throw new RuntimeException("Unknown/untreated releation '"+this.getRelation()+"'");
+ }
+
+ /**
+ * Iterates over all the RuntimeEnvironments passed as argument.
+ * @param REs - list of RuntimeEnvironments, mostly those offered at a particular queue
+ * @return true iff any RE among the REs passed as argument are fulfilling the constraint
+ */
+ public boolean isFulfilledByAtLeastOneIn(Collection<RuntimeEnvironment> REs) {
+ boolean fulfilled = false;
+ Iterator<RuntimeEnvironment> i = REs.iterator();
+ while(i.hasNext() && !fulfilled) {
+ RuntimeEnvironment r = i.next();
+ fulfilled = this.isFulfilledBy(r);
+ }
+ return fulfilled;
+ }
+ /**
+ * For testing purposes
+ */
+ public static void main(String argv[]) {
+ try {
+ if (argv[0].equals("--help") || argv.length != 3) {
+ logger.error("Expecting arguments (<|>|=|<=|>=) runtime1-version runtime2-version");
+ }
+ else {
+ RuntimeEnvironmentConstraint r1 = new RuntimeEnvironmentConstraint(argv[1], argv[0]);
+ RuntimeEnvironment r2 = new RuntimeEnvironment(argv[2]);
+ logger.info("r1.getName(): "+r1.getName());
+ logger.info("r1.getVersion(): "+r1.getVersion());
+ logger.info("r1.getRelation(): "+r1.getRelation());
+ logger.info("r2.getName(): "+r2.getName());
+ logger.info("r2.getVersion(): "+r2.getVersion());
+ logger.info("r1.isFulfilledBy(r2): "+String.valueOf(r1.isFulfilledBy(r2)));
+ }
+ }
+ catch (Exception e) {
+ logger.error(e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInput.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInput.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInput.java
new file mode 100644
index 0000000..a9f97b0
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInput.java
@@ -0,0 +1,136 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+
+import java.nio.charset.Charset;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivity;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+
+/**
+ * Integrates inputs to the grid that come from the use case descriptions
+ * with those that are fed through the workflow.
+ *
+ * this class controls name and data storage of one input,
+ * no matter where the data comes from
+ */
+@ConfigurationBean(uri = ExternalToolActivity.URI + "#AbstractScriptInput")
+public abstract class ScriptInput {
+ /**
+ * This input can be referenced under the name 'tag'.
+ */
+ private String tag = null;
+ /**
+ * In most cases, the data will be stored under a specific
+ * filename.
+ */
+ private boolean file = false;
+ /**
+ * Set, if the name of the file to be executed is not
+ * explicitly set but prepared by some automatism and referenced
+ * via the tagging principle.
+ */
+ private boolean tempFile = false;
+ /**
+ * True if (!) the data is binary. (Text otherwise)
+ */
+ private boolean binary = false;
+
+ private String charsetName = Charset.defaultCharset().name();
+ private boolean forceCopy = false;
+
+ /**
+ * @return the tag
+ */
+ public final String getTag() {
+ return tag;
+ }
+ /**
+ * @param tag the tag to set
+ */
+ @ConfigurationProperty(name = "tag", label = "Tag")
+ public final void setTag(String tag) {
+ this.tag = tag;
+ }
+ /**
+ * @return the file
+ */
+ public final boolean isFile() {
+ return file;
+ }
+ /**
+ * @param file the file to set
+ */
+ @ConfigurationProperty(name = "file", label = "File")
+ public final void setFile(boolean file) {
+ this.file = file;
+ }
+ /**
+ * @return the tempFile
+ */
+ public final boolean isTempFile() {
+ return tempFile;
+ }
+ /**
+ * @param tempFile the tempFile to set
+ */
+ @ConfigurationProperty(name = "tempFile", label = "Temporary File")
+ public final void setTempFile(boolean tempFile) {
+ this.tempFile = tempFile;
+ }
+ /**
+ * @return the binary
+ */
+ public final boolean isBinary() {
+ return binary;
+ }
+ /**
+ * @param binary the binary to set
+ */
+ @ConfigurationProperty(name = "binary", label = "Binary")
+ public final void setBinary(boolean binary) {
+ this.binary = binary;
+ }
+
+ public String getCharsetName() {
+ return this.charsetName;
+ }
+ /**
+ * @param charsetName the charsetName to set
+ */
+ @ConfigurationProperty(name = "charsetName", label = "Chararter Set")
+ public void setCharsetName(String charsetName) {
+ this.charsetName = charsetName;
+ }
+
+ @ConfigurationProperty(name = "forceCopy", label = "Force Copy")
+ public final void setForceCopy(boolean forceCopy) {
+ this.forceCopy = forceCopy;
+
+ }
+ /**
+ * @return the forceCopy
+ */
+ public boolean isForceCopy() {
+ return forceCopy;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputStatic.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputStatic.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputStatic.java
new file mode 100644
index 0000000..4e108b9
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputStatic.java
@@ -0,0 +1,75 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivity;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+
+/**
+ * This subclass of script input is used to manage static content
+ * which is embedded into the use case description.
+ */
+@ConfigurationBean(uri = ExternalToolActivity.URI + "#ScriptInputStatic")
+public class ScriptInputStatic extends ScriptInput {
+
+ public ScriptInputStatic() {
+ }
+
+ private String url = null; //if this is set, load content from remote URL
+ private String content = null;
+
+ @Override
+ public String toString() {
+ return "InputStatic[tag: " +
+ getTag() + (isFile() ? ", file" : "") + (isTempFile() ? ", tempfile" : "") + (isBinary() ? ", binary" : "") + ", content: " + content + "]";
+ }
+
+ /**
+ * @return the url
+ */
+ public final String getUrl() {
+ return url;
+ }
+
+ /**
+ * @param url the url to set
+ */
+ @ConfigurationProperty(name = "url", label = "URL", required=false)
+ public final void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * @return the content
+ */
+ public final String getContent() {
+ return content;
+ }
+
+ /**
+ * @param content the content to set
+ */
+ @ConfigurationProperty(name = "content", label = "Content", required=false)
+ public final void setContent(String content) {
+ this.content = content;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputUser.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputUser.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputUser.java
new file mode 100644
index 0000000..858b7fa
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptInputUser.java
@@ -0,0 +1,101 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+import java.util.ArrayList;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivity;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+
+/**
+ * Internal description of output
+ */
+@ConfigurationBean(uri = ExternalToolActivity.URI + "#ScriptInput")
+public class ScriptInputUser extends ScriptInput {
+
+ /**
+ * This input may be fed from multiple ouputs.
+ */
+ private boolean list = false;
+ /**
+ * True if the data from a list input in taverna is concatenated into one single input file.
+ */
+ private boolean concatenate = false;
+
+ private ArrayList<String> mime = new ArrayList<String>();
+
+ @Override
+ public String toString() {
+ return "Input[tag: " + getTag() + (isFile() ? ", file" : "")
+ + (isTempFile() ? ", tempfile" : "")
+ + (isBinary() ? ", binary" : "") + (list ? ", list" : "")
+ + (concatenate ? ", concatenate" : "")
+ + " mime: " + mime.toString() + "]";
+ }
+
+ /**
+ * @return the list
+ */
+ public final boolean isList() {
+ return list;
+ }
+
+ /**
+ * @param list the list to set
+ */
+ @ConfigurationProperty(name = "list", label = "List")
+ public final void setList(boolean list) {
+ this.list = list;
+ }
+
+ /**
+ * @return the concatenate
+ */
+ public final boolean isConcatenate() {
+ return concatenate;
+ }
+
+ /**
+ * @param concatenate the concatenate to set
+ */
+ @ConfigurationProperty(name = "concatenate", label = "Concatenate")
+ public final void setConcatenate(boolean concatenate) {
+ this.concatenate = concatenate;
+ }
+
+ /**
+ * @return the mime
+ */
+ public final ArrayList<String> getMime() {
+ if (mime == null) {
+ mime = new ArrayList<String>();
+ }
+ return mime;
+ }
+
+ /**
+ * @param mime the mime to set
+ */
+ @ConfigurationProperty(name = "mime", label = "Mime Types", required=false)
+ public final void setMime(ArrayList<String> mime) {
+ this.mime = mime;
+ }
+};
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptOutput.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptOutput.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptOutput.java
new file mode 100644
index 0000000..fe63cc9
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/ScriptOutput.java
@@ -0,0 +1,90 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+import java.util.ArrayList;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivity;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+
+/**
+ * Internal description of input
+ */
+@ConfigurationBean(uri = ExternalToolActivity.URI + "#ScriptOutput")
+public class ScriptOutput {
+ private String path;
+ private boolean binary;
+ private ArrayList<String> mime = new ArrayList<String>();
+
+ @Override
+ public String toString() {
+ return "Output[path: " + path + (binary ? ", binary" : "")
+ + " mime: " + mime.toString() + "]";
+ }
+
+ /**
+ * @return the path
+ */
+ public final String getPath() {
+ return path;
+ }
+
+ /**
+ * @param path the path to set
+ */
+ @ConfigurationProperty(name = "path", label = "Path")
+ public final void setPath(String path) {
+ this.path = path;
+ }
+
+ /**
+ * @return the binary
+ */
+ public final boolean isBinary() {
+ return binary;
+ }
+
+ /**
+ * @param binary the binary to set
+ */
+ @ConfigurationProperty(name = "binary", label = "Binary")
+ public final void setBinary(boolean binary) {
+ this.binary = binary;
+ }
+
+ /**
+ * @return the mime
+ */
+ public final ArrayList<String> getMime() {
+ if (mime == null) {
+ mime = new ArrayList<String>();
+ }
+ return mime;
+ }
+
+ /**
+ * @param mime the mime to set
+ */
+ @ConfigurationProperty(name = "mime", label = "Mime Types", required=false)
+ public final void setMime(ArrayList<String> mime) {
+ this.mime = mime;
+ }
+};
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseDescription.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseDescription.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseDescription.java
new file mode 100644
index 0000000..217eae5
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseDescription.java
@@ -0,0 +1,899 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.swing.ImageIcon;
+
+import net.sf.taverna.t2.activities.externaltool.ExternalToolActivity;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;
+import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty.OrderPolicy;
+import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
+import net.sf.taverna.t2.workflowmodel.utils.Tools;
+
+import org.apache.log4j.Logger;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * Class representation of XML-description of UseCases
+ */
+@ConfigurationBean(uri = ExternalToolActivity.URI + "#ToolDescription")
+public class UseCaseDescription {
+
+ private static Logger logger = Logger.getLogger(UseCaseDescription.class);
+
+ /**
+ * Identifier for the retrieval of this UseCase in the sharedRepository
+ * database, respectively its XML export.
+ */
+ private String usecaseid = "";
+ /**
+ * Workflow Elements now can get a group identifier. There may be subgroups
+ * divided by :
+ */
+ private String group = "";
+ /**
+ * Textual description of the use case itself. This description is very
+ * short to fit on the single line that is prepared for such descriptions in
+ * the Taverna workflow element list.
+ */
+ private String description = "";
+ /**
+ * What is actually executed on the shell.
+ */
+ private String command = "";
+
+ /**
+ * Accessor function of command
+ *
+ * @return shell-executable series of commands
+ */
+ public String getCommand() {
+ if (null == command) {
+ // FIXME: Is this possible?
+ return "";
+ } else {
+ return command;
+ }
+ }
+
+ /**
+ * Routine that may be executed as a first check if the program is indeed
+ * installed.
+ */
+ private String test_local = null;
+
+ /**
+ * URL of an icon that would help users to recognise the use case
+ */
+ private String icon_url = null;
+
+ private int preparingTimeoutInSeconds = 20 * 60; // 20 minutes
+ private int executionTimeoutInSeconds = 30 * 60; // 30 minutes
+
+ private List<String> tags = new ArrayList<String>();
+ private List<RuntimeEnvironmentConstraint> REs = new ArrayList<RuntimeEnvironmentConstraint>();
+ private ArrayList<String> queue_preferred = new ArrayList<String>();
+ private ArrayList<String> queue_deny = new ArrayList<String>();
+
+ private List<ScriptInputStatic> static_inputs = new ArrayList<ScriptInputStatic>();
+ private Map<String, ScriptInput> inputs = new HashMap<String, ScriptInput>();
+ private Map<String, ScriptOutput> outputs = new HashMap<String, ScriptOutput>();
+
+ private boolean includeStdIn = false;
+ private boolean includeStdOut = true;
+ private boolean includeStdErr = true;
+
+ private List<Integer> validReturnCodes = new ArrayList<Integer>();
+
+ /**
+ * Default constructor to make xstream happy
+ */
+ public UseCaseDescription() {
+
+ }
+
+ /**
+ * Constructor, for special purpose usecases.
+ *
+ * @param usecaseid
+ */
+ public UseCaseDescription(String usecaseid) {
+ this.setUsecaseid(usecaseid);
+ }
+
+ /**
+ * Constructor, expects an input stream containing the xml. for example, use
+ * getClass().getClassLoader().getResourceAsStream("..") to load a usecase
+ * from your program jar
+ */
+ public UseCaseDescription(InputStream programAsStream) throws DeserializationException {
+ SAXBuilder builder = new SAXBuilder();
+ Document doc;
+ try {
+ doc = builder.build(programAsStream);
+ programAsStream.close();
+ } catch (JDOMException e) {
+ throw new DeserializationException("Error deserializing usecase", e);
+ } catch (IOException e) {
+ throw new DeserializationException("Error deserializing usecase", e);
+ }
+ readFromXmlElement(doc.getRootElement());
+ }
+
+ /**
+ * Constructor, expects an XML-root to dissect.
+ */
+ public UseCaseDescription(Element programNode) throws DeserializationException {
+ readFromXmlElement(programNode);
+ }
+
+/**
+ * Produce an XML description of the UseCaseDescription
+ */
+ public Element writeToXMLElement() {
+ Element programNode = new Element("program");
+ programNode.setAttribute("name", getUsecaseid());
+ programNode.setAttribute("description", getDescription());
+ // Always use element version of command
+// programNode.setAttribute("command", getCommand());
+ Element commandNode = new Element("command");
+ commandNode.addContent(getCommand());
+ programNode.addContent(commandNode);
+ programNode.setAttribute("timeout", Integer.toString(getExecutionTimeoutInSeconds()));
+ programNode.setAttribute("preparing_timeout", Integer.toString(getPreparingTimeoutInSeconds()));
+ programNode.setAttribute("includeStdIn", Boolean.toString(isIncludeStdIn()));
+ programNode.setAttribute("includeStdOut", Boolean.toString(isIncludeStdOut()));
+ programNode.setAttribute("includeStdErr", Boolean.toString(isIncludeStdErr()));
+ for (ScriptInputStatic si : getStatic_inputs()) {
+ Element staticNode = new Element("static");
+ if (si.isBinary()) {
+ staticNode.setAttribute("binary", "true");
+ }
+ if (si.isForceCopy()) {
+ staticNode.setAttribute("forceCopy", "true");
+ }
+ if (si.isFile()) {
+ Element fileNode = new Element("file");
+ fileNode.setAttribute("path", si.getTag());
+ staticNode.addContent(fileNode);
+ } else if (si.isTempFile()) {
+ Element tempfileNode = new Element("tempfile");
+ tempfileNode.setAttribute("tag", si.getTag());
+ staticNode.addContent(tempfileNode);
+ } else {
+ Element replaceNode = new Element("replace");
+ replaceNode.setAttribute("tag", si.getTag());
+ staticNode.addContent(replaceNode);
+ }
+ if (si.getUrl() != null) {
+ Element contentNode = new Element("content");
+ contentNode.setAttribute("url", si.getUrl());
+ staticNode.addContent(contentNode);
+ } else {
+ Element contentNode = new Element("content");
+ contentNode.addContent((String) si.getContent());
+ staticNode.addContent(contentNode);
+ }
+ programNode.addContent(staticNode);
+ }
+ for (Entry<String, ScriptInput> entry : getInputs().entrySet()) {
+ String name = entry.getKey();
+ ScriptInputUser si = (ScriptInputUser) entry.getValue();
+ Element inputNode = new Element("input");
+ inputNode.setAttribute("name", name);
+ if (si.isBinary()) {
+ inputNode.setAttribute("binary", "true");
+ }
+ if (si.isForceCopy()) {
+ inputNode.setAttribute("forceCopy", "true");
+ }
+ if (si.isConcatenate()) {
+ inputNode.setAttribute("concatenate", "true");
+ }
+ if (si.isList()) {
+ inputNode.setAttribute("list", "true");
+ }
+ if (si.isFile()) {
+ Element fileNode = new Element("file");
+ fileNode.setAttribute("path", si.getTag());
+ inputNode.addContent(fileNode);
+ } else if (si.isTempFile()) {
+ Element tempfileNode = new Element("tempfile");
+ tempfileNode.setAttribute("tag", si.getTag());
+ inputNode.addContent(tempfileNode);
+ } else {
+ Element replaceNode = new Element("replace");
+ replaceNode.setAttribute("tag", si.getTag());
+ inputNode.addContent(replaceNode);
+ }
+ for (String mime : si.getMime()) {
+ Element mimeNode = new Element("mime");
+ mimeNode.setAttribute("type", mime);
+ inputNode.addContent(mimeNode);
+ }
+ programNode.addContent(inputNode);
+ }
+ for (Entry<String, ScriptOutput> entry : getOutputs().entrySet()) {
+ String name = entry.getKey();
+ ScriptOutput so = entry.getValue();
+ Element outputNode = new Element("output");
+ outputNode.setAttribute("name", name);
+ if (so.isBinary()) {
+ outputNode.setAttribute("binary", "true");
+ }
+ Element fromfileNode = new Element("fromfile");
+ fromfileNode.setAttribute("path", so.getPath());
+ outputNode.addContent(fromfileNode);
+ for (String mime : so.getMime()) {
+ Element mimeNode = new Element("mime");
+ mimeNode.setAttribute("type", mime);
+ outputNode.addContent(mimeNode);
+ }
+ programNode.addContent(outputNode);
+ }
+ for (RuntimeEnvironmentConstraint rec : getREs()) {
+ Element rteNode = new Element("rte");
+ rteNode.setAttribute("name", rec.getID());
+ rteNode.setAttribute("relation", rec.getRelation());
+ programNode.addContent(rteNode);
+ }
+ if ((group != null) && !group.isEmpty()) {
+ Element groupNode = new Element("group");
+ groupNode.setAttribute("name", group);
+ programNode.addContent(groupNode);
+ }
+ if ((test_local != null) && !test_local.isEmpty()) {
+ Element testNode = new Element("test");
+ testNode.setAttribute("local", test_local);
+ programNode.addContent(testNode);
+ }
+ if ((icon_url != null) && !icon_url.isEmpty()) {
+ Element iconNode = new Element("icon");
+ iconNode.setAttribute("url", icon_url);
+ programNode.addContent(iconNode);
+ }
+ if (!getQueue_preferred().isEmpty() || !getQueue_deny().isEmpty()) {
+ Element queueNode = new Element("queue");
+ for (String url : getQueue_preferred()) {
+ Element preferredNode = new Element("prefer");
+ preferredNode.setAttribute("url", url);
+ queueNode.addContent(preferredNode);
+ }
+ for (String url : getQueue_deny()) {
+ Element denyNode = new Element("deny");
+ denyNode.setAttribute("url", url);
+ queueNode.addContent(denyNode);
+ }
+ programNode.addContent(queueNode);
+ }
+ Element validReturnCodesNode = new Element("validReturnCodes");
+ validReturnCodesNode.setAttribute("codes", getReturnCodesAsText());
+ programNode.addContent(validReturnCodesNode);
+
+ return programNode;
+ }
+ /**
+ * Specifies the UseCaseDescription from the root of an XML description
+ * which is accessible online.
+ *
+ * @param programNode
+ * @throws DeserializationException
+ */
+ private void readFromXmlElement(Element programNode) throws DeserializationException {
+ if (programNode.getName().compareToIgnoreCase("program") != 0)
+ throw new DeserializationException("Expected <program>, read '" + programNode.getName() + "'");
+
+ setUsecaseid(programNode.getAttributeValue("name"));
+ setDescription(programNode.getAttributeValue("description"));
+ setCommand(programNode.getAttributeValue("command"));
+ String timeoutStr = programNode.getAttributeValue("timeout");
+ if (timeoutStr != null)
+ setExecutionTimeoutInSeconds(Integer.parseInt(timeoutStr));
+ timeoutStr = programNode.getAttributeValue("preparing_timeout");
+ if (timeoutStr != null)
+ setPreparingTimeoutInSeconds(Integer.parseInt(timeoutStr));
+
+ String includeStdInStr = programNode.getAttributeValue("includeStdIn");
+ if (includeStdInStr != null && !includeStdInStr.isEmpty()) {
+ setIncludeStdIn(includeStdInStr.equals("true"));
+ }
+
+ String includeStdOutStr = programNode.getAttributeValue("includeStdOut");
+ if (includeStdOutStr != null && !includeStdOutStr.isEmpty()) {
+ setIncludeStdOut(includeStdOutStr.equals("true"));
+ }
+
+ String includeStdErrStr = programNode.getAttributeValue("includeStdErr");
+ if (includeStdErrStr != null && !includeStdErrStr.isEmpty()) {
+ setIncludeStdErr(includeStdErrStr.equals("true"));
+ }
+
+ for (Object cur_ob : programNode.getChildren()) {
+ Element cur = (Element) cur_ob;
+
+ String name = cur.getAttributeValue("name");
+
+ String type = cur.getName();
+ boolean binary = false;
+ if (null != cur.getAttributeValue("binary") && cur.getAttributeValue("binary").equalsIgnoreCase("true")) {
+ binary = true;
+ }
+ boolean list = false;
+ if (null != cur.getAttributeValue("list") && cur.getAttributeValue("list").equalsIgnoreCase("true")) {
+ list = true;
+ }
+ boolean concatenate = false;
+ if (null != cur.getAttributeValue("concatenate") && cur.getAttributeValue("concatenate").equalsIgnoreCase("true")) {
+ concatenate = true;
+ }
+ boolean forceCopy = false;
+ if (null != cur.getAttributeValue("forceCopy") && cur.getAttributeValue("forceCopy").equalsIgnoreCase("true")) {
+ forceCopy = true;
+ }
+
+ Element inner = null;
+ String innerType = null, tag = null, path = null;
+ if (cur.getChildren().size() > 0) {
+ inner = (Element) cur.getChildren().get(0);
+ innerType = inner.getName();
+ tag = inner.getAttributeValue("tag");
+ path = inner.getAttributeValue("path");
+ }
+ // build mime type declaration list
+ ArrayList<String> mime = new ArrayList<String>();
+ for (Object child : cur.getChildren()) {
+ Element curChild = (Element) child;
+ if (curChild.getName().equalsIgnoreCase("mime")) {
+ mime.add(curChild.getAttributeValue("type"));
+ }
+ }
+ if (type.equalsIgnoreCase("static")) {
+ ScriptInputStatic si = new ScriptInputStatic();
+ Element content = cur.getChild("content");
+ if (content == null)
+ throw new DeserializationException("FIXME: script tag without embedded content tag");
+ si.setUrl(content.getAttributeValue("url"));
+ if (si.getUrl() == null)
+ si.setContent(content.getText());
+ fillInputDescription(si, binary, forceCopy, innerType, tag, path);
+ getStatic_inputs().add(si);
+ } else if (type.equalsIgnoreCase("input")) {
+ ScriptInputUser indesc = new ScriptInputUser();
+ indesc.setList(list);
+ indesc.setMime(mime);
+ indesc.setConcatenate(concatenate);
+ fillInputDescription(indesc, binary, forceCopy, innerType, tag, path);
+ getInputs().put(Tools.sanitiseName(name), indesc);
+ } else if (type.equalsIgnoreCase("output")) {
+ ScriptOutput outdesc = new ScriptOutput();
+ outdesc.setMime(mime);
+
+ boolean ok = true;
+ if (null == innerType) {
+ // don't know what to do
+ throw new DeserializationException("FIXME: Found null == innerType for output, is this the bug?");
+ } else if (innerType.equalsIgnoreCase("fromfile")) {
+ outdesc.setPath(path);
+ outdesc.setBinary(binary);
+ } else {
+ throw new DeserializationException("Problem reading output port: unknown innerType '" + innerType + "'");
+ }
+ if (ok) {
+ getOutputs().put(Tools.sanitiseName(name), outdesc);
+ }
+ } else if (type.equalsIgnoreCase("rte") || type.equalsIgnoreCase("re")) {
+ getREs().add(new RuntimeEnvironmentConstraint(name, cur.getAttributeValue("relation")));
+ } else if (type.equalsIgnoreCase("group")) {
+ group = name;
+ } else if (type.equalsIgnoreCase("test")) {
+ test_local = cur.getAttributeValue("local");
+ } else if (type.equalsIgnoreCase("icon")) {
+ icon_url = cur.getAttributeValue("url");
+ } else if (type.equalsIgnoreCase("queue")) {
+ for (Object child_ob : cur.getChildren()) {
+ Element child = (Element) child_ob;
+ if (child.getName().equalsIgnoreCase("prefer"))
+ getQueue_preferred().add(child.getAttributeValue("url"));
+ else if (child.getName().equalsIgnoreCase("deny"))
+ getQueue_deny().add(child.getAttributeValue("url"));
+ else
+ throw new DeserializationException("Error while reading usecase " + this.getUsecaseid() + ": invalid queue entry");
+ }
+ } else if (type.equalsIgnoreCase("command")) {
+ // i like to have the ability to inject complete shell script
+ // fragments into the use case,
+ // so this should be replace and should allow multiple lines
+ if ((getCommand() != null) && !getCommand().isEmpty()) {
+ throw new DeserializationException("You have specified both command attribute and command tag.");
+ }
+ setCommand(cur.getText());
+ } else if (type.equalsIgnoreCase("validReturnCodes")) {
+ String codeString = cur.getAttributeValue("codes");
+ if (codeString != null) {
+ setReturnCodesAsText(codeString);
+ }
+ }
+ else {
+ throw new DeserializationException("Unexpected and uninterpreted attribute " + type);
+ }
+ }
+ }
+
+ private void fillInputDescription(ScriptInput fillMe, boolean binary, boolean forceCopy, String innerType, String tag, String path) throws DeserializationException {
+ fillMe.setBinary(binary);
+ fillMe.setForceCopy(forceCopy);
+ if (null == innerType) {
+ // don't know what to do
+ throw new DeserializationException("FIXME: Found null == innerType for input, is this the bug?");
+ } else if (innerType.equalsIgnoreCase("replace")) {
+ fillMe.setTag(tag);
+ fillMe.setTempFile(false);
+ fillMe.setFile(false);
+ getTags().add(tag);
+ } else if (innerType.equalsIgnoreCase("tempfile")) {
+ fillMe.setTag(tag);
+ fillMe.setTempFile(true);
+ fillMe.setFile(false);
+ getTags().add(tag);
+ } else if (innerType.equalsIgnoreCase("file")) {
+ fillMe.setTag(path);
+ fillMe.setTempFile(false);
+ fillMe.setFile(true);
+ } else {
+ throw new DeserializationException("Problem reading input port: unknown innerType '" + innerType + "'");
+ }
+ }
+
+ /**
+ * returns icon that is referenced in use case description
+ */
+ public ImageIcon getImageIcon() {
+ if (null == icon_url) return null;
+ try {
+ URL u = new URL(icon_url);
+ return new ImageIcon(u, getUsecaseid());
+ } catch (Exception e) {
+ logger.error(e);
+ return null;
+ }
+ }
+
+ /**
+ * String representation of the use case. It also contains interesting
+ * information on the availability of resources in the grid to actually
+ * execute that workflow element.
+ *
+ * @return String
+ */
+ @Override
+ public String toString() {
+ List<String> hlp = new ArrayList<String>();
+ hlp.add("usecaseid: " + getUsecaseid());
+ hlp.add("description: " + getDescription());
+ hlp.add("group: " + group);
+ hlp.add("test: " + test_local);
+ hlp.add("tags: " + getTags());
+ for (Map.Entry<String, ScriptInput> cur : getInputs().entrySet()) {
+ hlp.add(">" + cur.getKey() + ">: " + cur.getValue().toString());
+ }
+ for (Map.Entry<String, ScriptOutput> cur : getOutputs().entrySet()) {
+ hlp.add("<" + cur.getKey() + "<: " + cur.getValue().toString());
+ }
+ hlp.add("RE: " + getREs().toString());
+ hlp.add("preferred queues: " + getQueue_preferred());
+ hlp.add("denied queues: " + getQueue_deny());
+ String tos = super.toString() + "[";
+ for (int i = 0; i < hlp.size(); i++) {
+ if (i != 0)
+ tos += ", ";
+ tos += hlp.get(i);
+ }
+ return tos + " ]";
+ }
+
+ /**
+ * hajo's test just pass an url or file url to an xml file
+ *
+ * @throws IOException
+ * @throws MalformedURLException
+ * @throws DeserializationException
+ */
+ public static void main(String[] argv) throws MalformedURLException, IOException, DeserializationException {
+ UseCaseDescription d = new UseCaseDescription(new URL(argv[0]).openStream());
+ logger.info(d.getCommand());
+ }
+
+ /**
+ * @param command the command to set
+ */
+ @ConfigurationProperty(name = "command", label = "Command", description="What is actually executed on the shell")
+ public void setCommand(String command) {
+ this.command = command;
+ }
+
+ /**
+ * @param description the description to set
+ */
+ @ConfigurationProperty(name = "description", label = "Description", description="Textual description of the tool", required=false, uri="http://purl.org/dc/elements/1.1/description")
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * @return the description
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @param executionTimeoutInSeconds the executionTimeoutInSeconds to set
+ */
+ @ConfigurationProperty(name = "executionTimeoutInSeconds", label = "Execution Timeout In Seconds")
+ public void setExecutionTimeoutInSeconds(int executionTimeoutInSeconds) {
+ this.executionTimeoutInSeconds = executionTimeoutInSeconds;
+ }
+
+ /**
+ * @return the executionTimeoutInSeconds
+ */
+ public int getExecutionTimeoutInSeconds() {
+ return executionTimeoutInSeconds;
+ }
+
+ /**
+ * @param inputs the inputs to set
+ */
+ public void setInputs(Map<String, ScriptInput> inputs) {
+ this.inputs = inputs;
+ }
+
+ @ConfigurationProperty(name = "inputs", label = "Inputs", required=false)
+ public void setInputs(Set<InputMap> inputs) {
+ if (inputs != null) {
+ this.inputs = new HashMap<String, ScriptInput>();
+ for (InputMap inputMap : inputs) {
+ this.inputs.put(inputMap.getPort(), inputMap.getInput());
+ }
+ } else {
+ this.inputs = null;
+ }
+ }
+
+ /**
+ * @return the inputs
+ */
+ public Map<String, ScriptInput> getInputs() {
+ if (inputs == null) {
+ inputs = new HashMap<String, ScriptInput>();
+ }
+ return inputs;
+ }
+
+ /**
+ * @param outputs the outputs to set
+ */
+ public void setOutputs(Map<String, ScriptOutput> outputs) {
+ this.outputs = outputs;
+ }
+
+ @ConfigurationProperty(name = "outputs", label = "Outputs", required=false)
+ public void setOutputs(Set<OutputMap> outputs) {
+ if (outputs != null) {
+ this.outputs = new HashMap<String, ScriptOutput>();
+ for (OutputMap outputMap : outputs) {
+ this.outputs.put(outputMap.getPort(), outputMap.getOutput());
+ }
+ } else {
+ this.outputs = null;
+ }
+ }
+
+ /**
+ * @return the outputs
+ */
+ public Map<String, ScriptOutput> getOutputs() {
+ if (outputs == null) {
+ outputs = new HashMap<String, ScriptOutput>();
+ }
+ return outputs;
+ }
+
+ /**
+ * @param preparingTimeoutInSeconds the preparingTimeoutInSeconds to set
+ */
+ @ConfigurationProperty(name = "preparingTimeoutInSeconds", label = "Preparing Timeout In Seconds")
+ public void setPreparingTimeoutInSeconds(int preparingTimeoutInSeconds) {
+ this.preparingTimeoutInSeconds = preparingTimeoutInSeconds;
+ }
+
+ /**
+ * @return the preparingTimeoutInSeconds
+ */
+ public int getPreparingTimeoutInSeconds() {
+ return preparingTimeoutInSeconds;
+ }
+
+ /**
+ * @param queue_deny the queue_deny to set
+ */
+ public void setQueue_deny(ArrayList<String> queue_deny) {
+ this.queue_deny = queue_deny;
+ }
+
+ /**
+ * @return the queue_deny
+ */
+ public ArrayList<String> getQueue_deny() {
+ if (queue_deny == null) {
+ queue_deny = new ArrayList<String>();
+ }
+ return queue_deny;
+ }
+
+ /**
+ * @param queue_preferred the queue_preferred to set
+ */
+ public void setQueue_preferred(ArrayList<String> queue_preferred) {
+ this.queue_preferred = queue_preferred;
+ }
+
+ /**
+ * @return the queue_preferred
+ */
+ public ArrayList<String> getQueue_preferred() {
+ if (queue_preferred == null) {
+ queue_preferred = new ArrayList<String>();
+ }
+ return queue_preferred;
+ }
+
+ /**
+ * @param rEs the rEs to set
+ */
+ public void setREs(List<RuntimeEnvironmentConstraint> rEs) {
+ REs = rEs;
+ }
+
+ /**
+ * @return the rEs
+ */
+ public List<RuntimeEnvironmentConstraint> getREs() {
+ if (REs == null) {
+ REs = new ArrayList<RuntimeEnvironmentConstraint>();
+ }
+ return REs;
+ }
+
+ /**
+ * @param static_inputs the static_inputs to set
+ */
+ @ConfigurationProperty(name = "staticInputs", label = "Static Inputs", ordering=OrderPolicy.NON_ORDERED, required=false)
+ public void setStatic_inputs(List<ScriptInputStatic> static_inputs) {
+ this.static_inputs = static_inputs;
+ }
+
+ /**
+ * @return the static_inputs
+ */
+ public List<ScriptInputStatic> getStatic_inputs() {
+ if (static_inputs == null) {
+ static_inputs = new ArrayList<ScriptInputStatic>();
+ }
+ return static_inputs;
+ }
+
+ /**
+ * @param tags the tags to set
+ */
+ public void setTags(List<String> tags) {
+ this.tags = tags;
+ }
+
+ /**
+ * @return the tags
+ */
+ public List<String> getTags() {
+ if (tags == null) {
+ tags = new ArrayList<String>();
+ }
+ return tags;
+ }
+
+ /**
+ * @param usecaseid the usecaseid to set
+ */
+ @ConfigurationProperty(name = "usecaseid", label = "Title", uri="http://purl.org/dc/elements/1.1/title", required=false)
+ public void setUsecaseid(String usecaseid) {
+ this.usecaseid = usecaseid;
+ }
+
+ /**
+ * @return the usecaseid
+ */
+ public String getUsecaseid() {
+ return usecaseid;
+ }
+
+ public boolean isIncludeStdIn() {
+ return includeStdIn;
+ }
+
+ @ConfigurationProperty(name = "includeStdIn", label = "Include STDIN")
+ public void setIncludeStdIn(boolean includeStdIn) {
+ this.includeStdIn = includeStdIn;
+ }
+
+ public boolean isIncludeStdOut() {
+ return includeStdOut;
+ }
+
+ @ConfigurationProperty(name = "includeStdOut", label = "Include STDOUT")
+ public void setIncludeStdOut(boolean includeStdOut) {
+ this.includeStdOut = includeStdOut;
+ }
+
+ public boolean isIncludeStdErr() {
+ return includeStdErr;
+ }
+
+ @ConfigurationProperty(name = "includeStdErr", label = "Include STDERR")
+ public void setIncludeStdErr(boolean includeStdErr) {
+ this.includeStdErr = includeStdErr;
+ }
+
+ /**
+ * @return the validReturnCodes
+ */
+ public List<Integer> getValidReturnCodes() {
+ if (validReturnCodes == null) {
+ validReturnCodes = new ArrayList<Integer>();
+ }
+ if (validReturnCodes.isEmpty()) {
+ validReturnCodes.add(0);
+ }
+ return validReturnCodes;
+ }
+
+ /**
+ * @param validReturnCodes the validReturnCodes to set
+ */
+ public void setValidReturnCodes(List<Integer> validReturnCodes) {
+ this.validReturnCodes = validReturnCodes;
+ }
+
+ public String getReturnCodesAsText() {
+ return StringUtils.join(getValidReturnCodes(), ",");
+ }
+
+ public void setReturnCodesAsText(String text) {
+ if (getValidReturnCodes() == null) {
+ validReturnCodes = new ArrayList<Integer>();
+ }
+ validReturnCodes.clear();
+ String[] codes = text.split(",");
+ for (String code : codes) {
+ try {
+ Integer codeInt = new Integer(code);
+ if (!validReturnCodes.contains(codeInt)) {
+ validReturnCodes.add(codeInt);
+ }
+ }
+ catch (NumberFormatException e) {
+ logger.error(e);
+ }
+ }
+ if (validReturnCodes.isEmpty()) {
+ validReturnCodes.add(0);
+ }
+ Collections.sort(validReturnCodes);
+ }
+
+ /**
+ * @return the group
+ */
+ public String getGroup() {
+ return group;
+ }
+
+ /**
+ * @param group the group to set
+ */
+ public void setGroup(String group) {
+ this.group = group;
+ }
+
+ /**
+ * @return the icon_url
+ */
+ public String getIcon_url() {
+ return icon_url;
+ }
+
+ @ConfigurationBean(uri = ExternalToolActivity.URI + "#OutputMap")
+ public static class OutputMap {
+ private String port;
+
+ private ScriptOutput output;
+
+ public String getPort() {
+ return port;
+ }
+
+ @ConfigurationProperty(name = "port", label = "Port")
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public ScriptOutput getOutput() {
+ return output;
+ }
+
+ @ConfigurationProperty(name = "output", label = "Output")
+ public void setOutput(ScriptOutput output) {
+ this.output = output;
+ }
+ }
+
+ @ConfigurationBean(uri = ExternalToolActivity.URI + "#InputMap")
+ public static class InputMap {
+ private String port;
+
+ private ScriptInputUser input;
+
+ public String getPort() {
+ return port;
+ }
+
+ @ConfigurationProperty(name = "port", label = "Port")
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+ public ScriptInputUser getInput() {
+ return input;
+ }
+
+ @ConfigurationProperty(name = "input", label = "Input")
+ public void setInput(ScriptInputUser input) {
+ this.input = input;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseEnumeration.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseEnumeration.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseEnumeration.java
new file mode 100644
index 0000000..ea51c7b
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/UseCaseEnumeration.java
@@ -0,0 +1,114 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
+
+import org.apache.log4j.Logger;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+public class UseCaseEnumeration {
+
+ private static Logger logger = Logger.getLogger(UseCaseEnumeration.class);
+
+ public static List<UseCaseDescription> readDescriptionsFromUrl(String xmlFileUrl) throws IOException {
+
+ List<UseCaseDescription> ret = new ArrayList<UseCaseDescription>();
+ URLConnection con = null;
+ try {
+ URL url = new URL(xmlFileUrl);
+
+ con = url.openConnection();
+ con.setConnectTimeout(4000);
+ ret = readDescriptionsFromStream(con.getInputStream());
+
+ } catch (IOException ioe) {
+ logger.error("Problem retrieving from " + xmlFileUrl);
+ logger.error(ioe);
+ throw ioe;
+ }
+ finally {
+
+ }
+
+ return ret;
+
+ }
+
+ public static List<UseCaseDescription> readDescriptionsFromStream(InputStream is) {
+
+ List<UseCaseDescription> ret = new ArrayList<UseCaseDescription>();
+
+ SAXBuilder builder = new SAXBuilder();
+ Document doc = null;
+ try {
+ doc = builder.build(is);
+ is.close();
+ } catch (JDOMException e1) {
+ logger.error(e1);
+ return ret;
+ } catch (IOException e1) {
+ logger.error(e1);
+ return ret;
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ logger.error(e);
+ }
+ }
+
+ Element usecases = doc.getRootElement();
+ for (Object ochild : usecases.getChildren()) {
+ Element child = (Element) ochild;
+ if (child.getName().equalsIgnoreCase("program")) {
+ try {
+ ret.add(new UseCaseDescription(child));
+ } catch (DeserializationException e) {
+ logger.error(e);
+ }
+ }
+ }
+ return ret;
+ }
+
+ public static UseCaseDescription readDescriptionFromUrl(
+ String repositoryUrl, String id) throws IOException {
+ List<UseCaseDescription> descriptions = readDescriptionsFromUrl(repositoryUrl);
+ for (UseCaseDescription usecase : descriptions) {
+ if (usecase.getUsecaseid().equals(id)) {
+ return usecase;
+ }
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/AskUserForPw.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/AskUserForPw.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/AskUserForPw.java
new file mode 100644
index 0000000..9c54b1d
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/AskUserForPw.java
@@ -0,0 +1,34 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases.invocation;
+
+public interface AskUserForPw {
+
+ // we will try keyfile first
+ public String getKeyfile();
+ public String getPassphrase();
+
+ // then username+password
+ public String getUsername();
+ public String getPassword();
+
+ public void authenticationSucceeded();
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/InvocationException.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/InvocationException.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/InvocationException.java
new file mode 100644
index 0000000..d714ab1
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/InvocationException.java
@@ -0,0 +1,25 @@
+/**
+ *
+ */
+package de.uni_luebeck.inb.knowarc.usecases.invocation;
+
+/**
+ * @author alanrw
+ *
+ */
+public class InvocationException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 437316164959631591L;
+
+ public InvocationException(String string) {
+ super(string);
+ }
+
+ public InvocationException(Exception e) {
+ super(e);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/390c286b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/UseCaseInvocation.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/UseCaseInvocation.java b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/UseCaseInvocation.java
new file mode 100644
index 0000000..6154d05
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/de/uni_luebeck/inb/knowarc/usecases/invocation/UseCaseInvocation.java
@@ -0,0 +1,324 @@
+/* Part of the KnowARC Janitor Use-case processor for taverna
+ * written 2007-2010 by Hajo Nils Krabbenhoeft and Steffen Moeller
+ * University of Luebeck, Institute for Neuro- and Bioinformatics
+ * University of Luebeck, Institute for Dermatolgy
+ *
+ * This package is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this package; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package de.uni_luebeck.inb.knowarc.usecases.invocation;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.io.IOUtils;
+
+import net.sf.taverna.t2.invocation.InvocationContext;
+import net.sf.taverna.t2.reference.ExternalReferenceSPI;
+import net.sf.taverna.t2.reference.Identified;
+import net.sf.taverna.t2.reference.IdentifiedList;
+import net.sf.taverna.t2.reference.ReferenceService;
+import net.sf.taverna.t2.reference.ReferenceServiceException;
+import net.sf.taverna.t2.reference.ReferenceSet;
+import net.sf.taverna.t2.reference.T2Reference;
+import net.sf.taverna.t2.reference.impl.external.object.InlineByteArrayReferenceBuilder;
+import net.sf.taverna.t2.reference.impl.external.object.InlineStringReferenceBuilder;
+import de.uni_luebeck.inb.knowarc.usecases.ScriptInput;
+import de.uni_luebeck.inb.knowarc.usecases.ScriptInputStatic;
+import de.uni_luebeck.inb.knowarc.usecases.ScriptInputUser;
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+
+/**
+ * An abstraction of various forms to bring job using the software that is
+ * referenced as a use case towards their execution.
+ *
+ * @author Hajo Nils Krabbenhoeft with some contribution by
+ * @author Steffen Moeller
+ */
+public abstract class UseCaseInvocation {
+
+ private String runId;
+
+
+ protected static String getActualOsCommand(String osCommand, String pathToOriginal,
+ String targetName, String pathTarget) {
+ String actualOsCommand = osCommand;
+ actualOsCommand = actualOsCommand.replace("%%PATH_TO_ORIGINAL%%", pathToOriginal);
+ actualOsCommand = actualOsCommand.replace("%%TARGET_NAME%%", targetName);
+ actualOsCommand = actualOsCommand.replace("%%PATH_TO_TARGET%%", pathTarget);
+ return actualOsCommand;
+ }
+
+ protected UseCaseDescription usecase;
+ protected final HashMap<String, String> tags = new HashMap<String, String>();
+ protected int nTempFiles = 0;
+ private static int submissionID = 0;
+ protected static InlineByteArrayReferenceBuilder inlineByteArrayReferenceBuilder = new InlineByteArrayReferenceBuilder();
+ protected static InlineStringReferenceBuilder inlineStringReferenceBuilder = new InlineStringReferenceBuilder();
+ private InvocationContext invocationContext;
+ private boolean retrieveData;
+
+ /*
+ * get the class of the data we expect for a given input
+ */
+ @SuppressWarnings("unchecked")
+ public Class getType(String inputName) {
+ if (!usecase.getInputs().containsKey(inputName))
+ return null;
+ ScriptInputUser input = (ScriptInputUser) usecase.getInputs().get(inputName);
+ if (input.isList()) {
+ if (input.isBinary())
+ return List.class;
+ else
+ return List.class;
+ } else {
+ if (input.isBinary())
+ return byte[].class;
+ else
+ return String.class;
+ }
+ }
+
+ /*
+ * get a list of all the input port names
+ */
+ public Set<String> getInputs() {
+ return usecase.getInputs().keySet();
+ }
+
+
+ /*
+ * get a id, incremented with each job. thus, this should be thread-wide
+ * unique
+ */
+ public synchronized int getSubmissionID() {
+ return submissionID++;
+ }
+
+ /*
+ * set the data for the input port with given name
+ */
+ @SuppressWarnings("unchecked")
+ public void setInput(String inputName, ReferenceService referenceService, T2Reference t2Reference) throws InvocationException {
+ if (t2Reference == null) {
+ throw new InvocationException("No input specified for " + inputName);
+ }
+ ScriptInputUser input = (ScriptInputUser) usecase.getInputs().get(inputName);
+ if (input.isList()) {
+ IdentifiedList<T2Reference> listOfReferences = (IdentifiedList<T2Reference>) referenceService
+ .getListService().getList(t2Reference);
+
+ if (!input.isConcatenate()) {
+ // this is a list input (not concatenated)
+ // so write every element to its own temporary file
+ // and create a filelist file
+
+ // we need to write the list elements to temporary files
+ ScriptInputUser listElementTemp = new ScriptInputUser();
+ listElementTemp.setBinary(input.isBinary());
+ listElementTemp.setTempFile(true);
+
+ String lineEndChar = "\n";
+ if (!input.isFile() && !input.isTempFile()) {
+ lineEndChar = " ";
+ }
+
+ String listFileContent = "";
+ String filenamesFileContent = "";
+ // create a list of all temp file names
+ for (T2Reference cur : listOfReferences) {
+ String tmp = setOneInput(referenceService, cur,
+ listElementTemp);
+ listFileContent += tmp + lineEndChar;
+ int ind = tmp.lastIndexOf('/');
+ if (ind == -1) {
+ ind = tmp.lastIndexOf('\\');
+ }
+ if (ind != -1) {
+ tmp = tmp.substring(ind + 1);
+ }
+ filenamesFileContent += tmp + lineEndChar;
+ }
+
+ // how do we want the listfile to be stored?
+ ScriptInputUser listFile = new ScriptInputUser();
+ listFile.setBinary(false); // since its a list file
+ listFile.setFile(input.isFile());
+ listFile.setTempFile(input.isTempFile());
+ listFile.setTag(input.getTag());
+ T2Reference listFileContentReference = referenceService
+ .register(listFileContent, 0, true, invocationContext);
+
+ tags.put(listFile.getTag(), setOneInput(referenceService,
+ listFileContentReference, listFile));
+
+ listFile.setTag(input.getTag() + "_NAMES");
+ T2Reference filenamesFileContentReference = referenceService
+ .register(filenamesFileContent, 0, true, null);
+ tags.put(listFile.getTag(), setOneInput(referenceService,
+ filenamesFileContentReference, listFile));
+ } else {
+ try {
+ // first, concatenate all data
+ if (input.isBinary()) {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ BufferedWriter outputWriter = new BufferedWriter(
+ new OutputStreamWriter(outputStream));
+ for (T2Reference cur : listOfReferences) {
+ InputStreamReader inputReader = new InputStreamReader(
+ getAsStream(referenceService, cur));
+ IOUtils.copyLarge(inputReader, outputWriter);
+ inputReader.close();
+ }
+ outputWriter.close();
+ T2Reference binaryReference = referenceService
+ .register(outputStream.toByteArray(), 0, true,
+ invocationContext);
+ tags.put(input.getTag(), setOneInput(referenceService,
+ binaryReference, input));
+ } else {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ BufferedWriter outputWriter = new BufferedWriter(
+ new OutputStreamWriter(outputStream));
+ for (T2Reference cur : listOfReferences) {
+ InputStreamReader inputReader = new InputStreamReader(
+ getAsStream(referenceService, cur));
+ IOUtils.copyLarge(inputReader, outputWriter);
+ outputWriter.write(" ");
+ inputReader.close();
+ }
+ outputWriter.close();
+ T2Reference binaryReference = referenceService
+ .register(outputStream.toByteArray(), 0, true,
+ invocationContext);
+ tags.put(input.getTag(), setOneInput(referenceService,
+ binaryReference, input));
+ }
+ } catch (IOException e) {
+ throw new InvocationException(e);
+ }
+ }
+ } else {
+ tags.put(input.getTag(), setOneInput(referenceService, t2Reference,
+ input));
+ }
+ }
+
+ /*
+ * submit a grid job and wait for it to finish, then get the result as
+ * on-demand downloads or directly as data (in case of local execution)
+ */
+ public HashMap<String, Object> Submit(ReferenceService referenceService) throws InvocationException {
+ submit_generate_job(referenceService);
+ return submit_wait_fetch_results(referenceService);
+ }
+
+ /*
+ * just submit the job. useful if you want to wait for it to finish later on
+ *
+ * Can the statics be made more static?
+ */
+ public void submit_generate_job(ReferenceService referenceService) throws InvocationException {
+ for (ScriptInputStatic input : usecase.getStatic_inputs()) {
+ T2Reference ref;
+ if (input.getUrl() != null) {
+ // Does this work OK with binary
+ try {
+ ref = referenceService.register(new URL(input.getUrl()), 0, true, null);
+ } catch (ReferenceServiceException e) {
+ throw new InvocationException(e);
+ } catch (MalformedURLException e) {
+ throw new InvocationException(e);
+ }
+ } else {
+ ref = referenceService.register((String) input.getContent(), 0, true, null);
+ }
+ tags.put(input.getTag(), setOneInput(referenceService, ref, input));
+
+ }
+ submit_generate_job_inner();
+ }
+
+ protected abstract void submit_generate_job_inner() throws InvocationException;
+
+ /*
+ * wait for a submitted job to finish and fetch the results
+ */
+ public abstract HashMap<String, Object> submit_wait_fetch_results(ReferenceService referenceService) throws InvocationException;
+
+ public abstract String setOneInput(ReferenceService referenceService, T2Reference t2Reference, ScriptInput input) throws InvocationException;
+
+ protected InputStream getAsStream(ReferenceService referenceService, T2Reference t2Reference) {
+ Identified identified = referenceService.resolveIdentifier(t2Reference, null, null);
+ if (identified instanceof ReferenceSet) {
+ ExternalReferenceSPI ref = ((ReferenceSet) identified).getExternalReferences().iterator().next();
+ return ref.openStream(invocationContext);
+ }
+ return null;
+ }
+
+ public void setContext(InvocationContext context) {
+ this.invocationContext = context;
+
+ }
+
+ public InvocationContext getContext() {
+ return this.invocationContext;
+ }
+
+ public abstract void setStdIn(ReferenceService referenceService,
+ T2Reference t2Reference);
+
+ public abstract void rememberRun(String runId);
+
+ /**
+ * @return the runId
+ */
+ protected String getRunId() {
+ return runId;
+ }
+
+ /**
+ * @param runId the runId to set
+ */
+ protected void setRunId(String runId) {
+ this.runId = runId;
+ }
+
+ /**
+ * @return the retrieveData
+ */
+ protected boolean isRetrieveData() {
+ return retrieveData;
+ }
+
+ /**
+ * @param retrieveData the retrieveData to set
+ */
+ protected void setRetrieveData(boolean retrieveData) {
+ this.retrieveData = retrieveData;
+ }
+
+
+}