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/17 12:37:15 UTC
[55/70] [abbrv] incubator-taverna-common-activities git commit:
taverna-external-tool-activity/
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/manager/impl/InvocationGroupManagerImpl.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/manager/impl/InvocationGroupManagerImpl.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/manager/impl/InvocationGroupManagerImpl.java
new file mode 100644
index 0000000..af18938
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/manager/impl/InvocationGroupManagerImpl.java
@@ -0,0 +1,446 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.manager.impl;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import net.sf.taverna.t2.activities.externaltool.local.ExternalToolLocalInvocationMechanism;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroup;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupAddedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupChangedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManager;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupRemovedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationManagerEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismAddedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismChangedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanismRemovedEvent;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister;
+import net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator;
+import net.sf.taverna.t2.lang.observer.MultiCaster;
+import net.sf.taverna.t2.lang.observer.Observable;
+import net.sf.taverna.t2.lang.observer.Observer;
+
+import org.apache.log4j.Logger;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+
+import uk.org.taverna.configuration.app.ApplicationConfiguration;
+
+
+/**
+ * @author alanrw
+ *
+ */
+public class InvocationGroupManagerImpl implements Observable<InvocationManagerEvent>, InvocationGroupManager{
+
+ private static final String DEFAULT_MECHANISM_NAME = "default local";
+ private static final String DEFAULT_GROUP_NAME = "default";
+ private HashSet<InvocationGroup> groups = new HashSet<InvocationGroup>();
+ private InvocationGroup defaultGroup = null;
+
+ private HashSet<InvocationMechanism> mechanisms = new HashSet<InvocationMechanism>();
+
+ private static XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
+ private static SAXBuilder builder = new SAXBuilder();
+
+ private static Logger logger = Logger.getLogger(InvocationGroupManagerImpl.class);
+
+ private Map<InvocationGroup, InvocationGroup> groupReplacements = Collections.synchronizedMap(new HashMap<InvocationGroup, InvocationGroup>());
+
+ private Map<String, InvocationMechanism> mechanismReplacements = Collections.synchronizedMap(new HashMap<String, InvocationMechanism>());
+
+ private Map<String, InvocationGroup> groupImports = Collections.synchronizedMap(new HashMap<String, InvocationGroup> ());
+
+ private Map<String, InvocationMechanism> mechanismImports = Collections.synchronizedMap(new HashMap<String, InvocationMechanism> ());
+
+ private final ApplicationConfiguration applicationConfiguration;
+
+ private final List<MechanismCreator> mechanismCreators;
+
+ private final List<InvocationPersister> invocationPersisters;
+
+ protected MultiCaster<InvocationManagerEvent> observers = new MultiCaster<InvocationManagerEvent>(
+ this);
+
+ private InvocationMechanism defaultMechanism = null;
+
+ public InvocationGroupManagerImpl(ApplicationConfiguration applicationConfiguration, List<MechanismCreator> mechanismCreators, List<InvocationPersister> invocationPersisters) {
+ this.applicationConfiguration = applicationConfiguration;
+ this.mechanismCreators = mechanismCreators;
+ this.invocationPersisters = invocationPersisters;
+ readConfiguration();
+ defaultMechanism = getInvocationMechanism(DEFAULT_MECHANISM_NAME);
+ if (defaultMechanism == null) {
+ createDefaultMechanism();
+ }
+ defaultGroup = getInvocationGroup(DEFAULT_GROUP_NAME);
+ if (defaultGroup == null) {
+ createDefaultGroup();
+ }
+
+ saveConfiguration();
+ }
+
+ @Override
+ public void addInvocationGroup(InvocationGroup group) {
+ groups.add(group);
+ observers.notify(new InvocationGroupAddedEvent(group));
+ }
+
+ @Override
+ public void replaceInvocationGroup(InvocationGroup originalGroup, InvocationGroup replacementGroup) {
+ Set<String> toReplaceImports = new HashSet<String>();
+ for (Entry<String, InvocationGroup> entry : groupImports.entrySet()) {
+ if (entry.getValue() == originalGroup) {
+ toReplaceImports.add(entry.getKey());
+ }
+ }
+ for (String spec : toReplaceImports) {
+ if (replacementGroup == null) {
+ groupImports.remove(spec);
+ } else {
+ groupImports.put(spec, replacementGroup);
+ }
+ }
+ if (replacementGroup != null) {
+ groupReplacements.put(originalGroup, replacementGroup);
+ }
+ observers.notify(new InvocationGroupRemovedEvent(originalGroup, (replacementGroup == null? getDefaultGroup(): replacementGroup)));
+ }
+
+ @Override
+ public void removeInvocationGroup(InvocationGroup group) {
+ groups.remove(group);
+ replaceInvocationGroup(group, getDefaultGroup());
+ }
+
+ @Override
+ public void replaceInvocationMechanism(InvocationMechanism originalMechanism, InvocationMechanism replacementMechanism) {
+ for (InvocationGroup g : groups) {
+ if (g.getMechanism().equals(originalMechanism)) {
+ if (replacementMechanism == null) {
+ g.setMechanism(getDefaultMechanism());
+ } else {
+ g.setMechanism(replacementMechanism);
+ }
+ }
+ }
+ Set<String> toRemoveImports = new HashSet<String>();
+ for (Entry<String, InvocationMechanism> entry : mechanismImports.entrySet()) {
+ if (entry.getValue() == originalMechanism) {
+ toRemoveImports.add(entry.getKey());
+ }
+ }
+ for (String spec : toRemoveImports) {
+ if (replacementMechanism == null) {
+ mechanismImports.remove(spec);
+ } else {
+ mechanismImports.put(spec, replacementMechanism);
+ }
+ }
+ if (replacementMechanism != null) {
+ mechanismReplacements.put(originalMechanism.getName() + ":" + originalMechanism.getXML(), replacementMechanism);
+ }
+ observers.notify(new InvocationMechanismRemovedEvent(originalMechanism, (replacementMechanism == null? getDefaultMechanism(): replacementMechanism)));
+ }
+
+ @Override
+ public void removeMechanism(InvocationMechanism mechanism) {
+ mechanisms.remove(mechanism);
+ replaceInvocationMechanism(mechanism, getDefaultMechanism());
+ }
+
+ @Override
+ public HashSet<InvocationGroup> getInvocationGroups() {
+ return groups;
+ }
+
+ @Override
+ public InvocationGroup getDefaultGroup() {
+ if (defaultGroup == null) {
+ createDefaultGroup();
+ }
+ return defaultGroup;
+ }
+
+ @Override
+ public Set<InvocationMechanism> getMechanisms() {
+ return mechanisms;
+ }
+
+ @Override
+ public void addMechanism(InvocationMechanism mechanism) {
+ mechanisms.add(mechanism);
+ observers.notify(new InvocationMechanismAddedEvent(mechanism));
+ }
+
+ @Override
+ public InvocationMechanism getDefaultMechanism() {
+ if (defaultMechanism == null) {
+ createDefaultMechanism();
+ }
+ return defaultMechanism;
+ }
+
+ @Override
+ public boolean containsGroup(InvocationGroup group) {
+ return groups.contains(group);
+ }
+
+ @Override
+ public InvocationMechanism getInvocationMechanism(
+ String defaultMechanismName) {
+ for (InvocationMechanism m : mechanisms) {
+ if (m.getName().equals(defaultMechanismName)) {
+ return m;
+ }
+ }
+ return null;
+ }
+
+ InvocationGroup getInvocationGroup(String groupName) {
+ for (InvocationGroup g : groups) {
+ if (g.getName().equals(groupName)) {
+ return g;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void mechanismChanged(InvocationMechanism im) {
+ observers.notify(new InvocationMechanismChangedEvent(im));
+ }
+
+
+ private void createDefaultMechanism() {
+ defaultMechanism = new ExternalToolLocalInvocationMechanism();
+ defaultMechanism.setName(DEFAULT_MECHANISM_NAME);
+ mechanisms.add(defaultMechanism);
+ }
+
+ private void createDefaultGroup() {
+ defaultGroup = new InvocationGroup(mechanismCreators);
+ defaultGroup.setName(DEFAULT_GROUP_NAME);
+ defaultGroup.setMechanism(defaultMechanism);
+ groups.add(defaultGroup);
+ }
+
+ private void readConfiguration() {
+ File f = new File(getInvocationManagerDirectory(), "invocationManager.xml");
+ if (!f.exists()) {
+ return;
+ }
+ try {
+ Document document = null;
+ synchronized (builder) {
+ document = builder.build(f);
+ }
+ Element topElement = document.getRootElement();
+ Element mechanismsElement = topElement.getChild("invocationMechanisms");
+ for (Object mechanismObject : mechanismsElement.getChildren("invocationMechanism")) {
+ Element mechanismElement = (Element) mechanismObject;
+ Element mechanismNameElement = mechanismElement.getChild("invocationMechanismName");
+ String mechanismName = mechanismNameElement.getText();
+ Element mechanismTypeElement = mechanismElement.getChild("invocationMechanismType");
+ String mechanismType = mechanismTypeElement.getText();
+ Element mechanismDetailsElement = mechanismElement.getChild("mechanismDetails");
+ Element detailsElement = (Element) mechanismDetailsElement.getChildren().get(0);
+ InvocationMechanism mechanism = null;
+ for (MechanismCreator mc : mechanismCreators) {
+ if (mc.canHandle(mechanismType)) {
+ mechanism = mc.convert(detailsElement, mechanismName);
+ }
+ }
+ if (mechanism != null) {
+ this.addMechanism(mechanism);
+ }
+ }
+
+ Element groupsElement = topElement.getChild("invocationGroups");
+ for (Object groupObject : groupsElement.getChildren("invocationGroup")) {
+ Element groupElement = (Element) groupObject;
+ Element groupNameElement = groupElement.getChild("invocationGroupName");
+ String groupName = groupNameElement.getText();
+ Element mechanismNameElement = groupElement.getChild("mechanismName");
+ String mechanismName = mechanismNameElement.getText();
+ InvocationMechanism mechanism = getInvocationMechanism(mechanismName);
+ if (mechanism == null) {
+ logger.warn("Could not find mechanism " + mechanismName);
+ mechanism = getDefaultMechanism();
+ }
+ InvocationGroup group = new InvocationGroup(mechanismCreators);
+ group.setName(groupName);
+ group.setMechanism(mechanism);
+ group.convertMechanismToDetails();
+ this.addInvocationGroup(group);
+ }
+ } catch (JDOMException e) {
+ logger.error("XML parsing problem", e);
+ } catch (IOException e) {
+ logger.error("Unable to read invocation manager", e);
+ }
+ }
+
+ /**
+ * Get the directory where the invocation information will be/is saved to.
+ */
+ @Override
+ public File getInvocationManagerDirectory() {
+
+ File home = applicationConfiguration.getApplicationHomeDir();
+
+ File invocationManagerDirectory = new File(home,"externaltool");
+ if (!invocationManagerDirectory.exists()) {
+ invocationManagerDirectory.mkdir();
+ }
+ return invocationManagerDirectory;
+ }
+
+ @Override
+ public void saveConfiguration() {
+ File f = new File(getInvocationManagerDirectory(), "invocationManager.xml");
+
+ Document configDocument = new Document();
+ Element topElement = new Element("invocationManager");
+ Element mechanismsElement = new Element("invocationMechanisms");
+
+ for (InvocationMechanism m : mechanisms) {
+ Element mechanismElement = new Element("invocationMechanism");
+ Element nameElement = new Element("invocationMechanismName");
+ nameElement.setText(m.getName());
+ mechanismElement.addContent(nameElement);
+ Element typeElement = new Element("invocationMechanismType");
+ typeElement.setText(m.getType());
+ mechanismElement.addContent(typeElement);
+ Element mechanismDetails = new Element("mechanismDetails");
+ mechanismDetails.addContent(m.getXMLElement());
+ mechanismElement.addContent(mechanismDetails);
+
+ mechanismsElement.addContent(mechanismElement);
+ }
+ topElement.addContent(mechanismsElement);
+
+ Element groupsElement = new Element("invocationGroups");
+ for (InvocationGroup g : groups) {
+ Element groupElement = new Element("invocationGroup");
+ Element nameElement = new Element("invocationGroupName");
+ nameElement.setText(g.getName());
+ groupElement.addContent(nameElement);
+ Element mechanismNameElement = new Element("mechanismName");
+ mechanismNameElement.setText(g.getMechanism().getName());
+ groupElement.addContent(mechanismNameElement);
+ groupsElement.addContent(groupElement);
+ }
+ topElement.addContent(groupsElement);
+
+ configDocument.setRootElement(topElement);
+
+ FileWriter writer;
+ try {
+ writer = new FileWriter(f);
+ synchronized (outputter) {
+ outputter.output(configDocument, writer);
+ }
+ writer.close();
+ } catch (IOException e) {
+ logger.error("Unable to save invocation manager", e);
+ }
+ }
+
+ @Override
+ public void groupChanged(InvocationGroup group) {
+ observers.notify(new InvocationGroupChangedEvent(group));
+ }
+
+ @Override
+ public void addObserver(Observer<InvocationManagerEvent> observer) {
+ observers.addObserver(observer);
+ }
+
+ @Override
+ public List<Observer<InvocationManagerEvent>> getObservers() {
+ return observers.getObservers();
+ }
+
+ @Override
+ public void removeObserver(Observer<InvocationManagerEvent> observer) {
+ observers.removeObserver(observer);
+ }
+
+ @Override
+ public void deleteRun(String runId) {
+ for (InvocationPersister persister : invocationPersisters) {
+ persister.deleteRun(runId);
+ }
+ }
+
+ @Override
+ public void persistInvocations() {
+ for (InvocationPersister persister : invocationPersisters) {
+ persister.persist(getInvocationManagerDirectory());
+ }
+ }
+
+ @Override
+ public void loadInvocations() {
+ for (InvocationPersister persister : invocationPersisters) {
+ persister.load(getInvocationManagerDirectory());
+ }
+ }
+
+ @Override
+ public boolean containsMechanism(InvocationMechanism invocationMechanism) {
+ return mechanisms.contains(invocationMechanism);
+ }
+
+ @Override
+ public InvocationGroup getGroupReplacement(InvocationGroup group) {
+ return groupReplacements.get(group);
+ }
+
+ @Override
+ public InvocationMechanism getMechanismReplacement(String invocationMechanismSpecification) {
+ return mechanismReplacements.get(invocationMechanismSpecification);
+ }
+
+ @Override
+ public InvocationGroup getImportedGroup(String groupSpecification) {
+ return groupImports.get(groupSpecification);
+ }
+
+ @Override
+ public InvocationMechanism getImportedMechanism(String mechanismSpecification) {
+ return mechanismImports.get(mechanismSpecification);
+ }
+
+ @Override
+ public void importMechanism(String invocationMechanismSpecification,
+ InvocationMechanism createdMechanism) {
+ addMechanism(createdMechanism);
+ mechanismImports.put(invocationMechanismSpecification, createdMechanism);
+ }
+
+ @Override
+ public void importInvocationGroup(String invocationGroupSpecification,
+ InvocationGroup invocationGroup) {
+ addInvocationGroup(invocationGroup);
+ groupImports.put(invocationGroupSpecification, invocationGroup);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/package.html
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/package.html b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/package.html
new file mode 100644
index 0000000..b07bedc
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/package.html
@@ -0,0 +1,3 @@
+<body>
+Contains the activity classes required to interact with use cases.
+</body>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/repository/ExternalToolRepositoryUtil.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/repository/ExternalToolRepositoryUtil.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/repository/ExternalToolRepositoryUtil.java
new file mode 100644
index 0000000..5bfcc63
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/repository/ExternalToolRepositoryUtil.java
@@ -0,0 +1,12 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.repository;
+
+/**
+ * @author alanrw
+ *
+ */
+public class ExternalToolRepositoryUtil {
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/ExternalToolSshInvocationMechanism.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/ExternalToolSshInvocationMechanism.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/ExternalToolSshInvocationMechanism.java
new file mode 100644
index 0000000..0b89175
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/ExternalToolSshInvocationMechanism.java
@@ -0,0 +1,96 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.ssh;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.Text;
+
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNodeFactory;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUseCaseInvocation;
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
+
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNode;
+
+/**
+ * @author alanrw
+ *
+ */
+public class ExternalToolSshInvocationMechanism extends InvocationMechanism {
+
+ private List<SshNode> nodes = new ArrayList<SshNode>();
+
+ /* (non-Javadoc)
+ * @see net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism#getType()
+ */
+ @Override
+ public String getType() {
+ return SshUseCaseInvocation.SSH_USE_CASE_INVOCATION_TYPE;
+ }
+
+ /**
+ * @param list the nodes to set
+ */
+ public void setNodes(List<SshNode> list) {
+ this.nodes = list;
+ }
+
+ public List<SshNode> getNodes() {
+ if (this.nodes.isEmpty()) {
+ this.nodes.add(SshNodeFactory.getInstance().getDefaultNode());
+ }
+ return this.nodes;
+ }
+
+ @Override
+ public Element getXMLElement() {
+ Element top = new Element("sshInvocation");
+ for (SshNode node : nodes) {
+ Element nodeElement = new Element("sshNode");
+ String host = node.getHost();
+ if (host != null) {
+ Element hostElement = new Element("host");
+ hostElement.addContent(new Text(host));
+ nodeElement.addContent(hostElement);
+ }
+ int port = node.getPort();
+ Element portElement = new Element("port");
+ portElement.addContent(new Text(Integer.toString(port)));
+ nodeElement.addContent(portElement);
+
+ String directory = node.getDirectory();
+ if (directory != null) {
+ Element directoryElement = new Element("directory");
+ directoryElement.addContent(new Text(directory));
+ nodeElement.addContent(directoryElement);
+ }
+
+ String linkCommand = node.getLinkCommand();
+ if (linkCommand != null) {
+ Element linkCommandElement = new Element("linkCommand");
+ linkCommandElement.addContent(new Text(linkCommand));
+ nodeElement.addContent(linkCommandElement);
+ }
+
+ String copyCommand = node.getCopyCommand();
+ if (copyCommand != null) {
+ Element copyCommandElement = new Element("copyCommand");
+ copyCommandElement.addContent(new Text(copyCommand));
+ nodeElement.addContent(copyCommandElement);
+ }
+ if (node.isRetrieveData()) {
+ Element retrieveDataElement = new Element("retrieveData");
+ nodeElement.addContent(retrieveDataElement);
+ }
+
+ top.addContent(nodeElement);
+ }
+ return top;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationCreator.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationCreator.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationCreator.java
new file mode 100644
index 0000000..3d2f5b0
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationCreator.java
@@ -0,0 +1,119 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.ssh;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.taverna.t2.activities.externaltool.InvocationCreator;
+import net.sf.taverna.t2.activities.externaltool.RetrieveLoginFromTaverna;
+
+import org.apache.log4j.Logger;
+
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpException;
+
+import de.uni_luebeck.inb.knowarc.usecases.UseCaseDescription;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.UseCaseInvocation;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNode;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNodeFactory;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshReference;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUrl;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUseCaseInvocation;
+
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
+import net.sf.taverna.t2.reference.ExternalReferenceSPI;
+import net.sf.taverna.t2.reference.Identified;
+import net.sf.taverna.t2.reference.ReferenceService;
+import net.sf.taverna.t2.reference.ReferenceSet;
+import net.sf.taverna.t2.reference.T2Reference;
+import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
+
+/**
+ * @author alanrw
+ *
+ */
+public final class SshInvocationCreator implements InvocationCreator {
+
+ private static Logger logger = Logger.getLogger(SshInvocationCreator.class);
+
+ private static List<SshNode> knownNodes = new ArrayList<SshNode>();
+
+ private CredentialManager credentialManager;
+
+ @Override
+ public boolean canHandle(String mechanismType) {
+ return mechanismType.equals(SshUseCaseInvocation.SSH_USE_CASE_INVOCATION_TYPE);
+ }
+
+ @Override
+ public UseCaseInvocation convert(InvocationMechanism m, UseCaseDescription description, Map<String, T2Reference> data, ReferenceService referenceService) {
+ ExternalToolSshInvocationMechanism mechanism = (ExternalToolSshInvocationMechanism) m;
+ SshUseCaseInvocation result = null;
+ try {
+ SshNode chosenNode = chooseNode(mechanism.getNodes(), data, referenceService);
+ result = new SshUseCaseInvocation(description, chosenNode, new RetrieveLoginFromTaverna(new SshUrl(chosenNode).toString(), credentialManager), credentialManager);
+ } catch (JSchException e) {
+ logger.error("Null invocation", e);
+ } catch (SftpException e) {
+ logger.error("Null invocation", e);
+ }
+ return result;
+ }
+
+ private static SshNode chooseNode(List<SshNode> possibleNodes, Map<String, T2Reference> data, ReferenceService referenceService) {
+ SshNode result = null;
+ for (T2Reference ref : data.values()) {
+ SshReference r = getAsSshReference(referenceService, ref);
+ if (r != null) {
+ SshNode dataNode = SshNodeFactory.getInstance().getSshNode(r.getHost(), r.getPort(), r.getDirectory());
+ if (possibleNodes.contains(dataNode)) {
+ logger.info("Running with data at " + r.getHost());
+ return dataNode;
+ }
+ }
+ }
+ synchronized(knownNodes) {
+ int chosenIndex = Integer.MAX_VALUE;
+ for (SshNode p : possibleNodes) {
+ if (!knownNodes.contains(p)) {
+ knownNodes.add(p);
+ }
+ int index = knownNodes.indexOf(p);
+ if (index < chosenIndex) {
+ chosenIndex = index;
+ }
+ }
+ if (chosenIndex != Integer.MAX_VALUE) {
+ result = knownNodes.get(chosenIndex);
+ // Move node to end of list
+ knownNodes.remove(result);
+ knownNodes.add(result);
+ }
+ }
+ return result;
+ }
+
+ private static SshReference getAsSshReference(ReferenceService referenceService,
+ T2Reference t2Reference) {
+ Identified identified = referenceService.resolveIdentifier(t2Reference, null, null);
+ if (identified instanceof ReferenceSet) {
+ for (ExternalReferenceSPI ref : ((ReferenceSet) identified).getExternalReferences()) {
+ if (ref instanceof SshReference) {
+ SshReference sshRef = (SshReference) ref;
+ return sshRef;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void setCredentialManager(CredentialManager credentialManager) {
+ this.credentialManager = credentialManager;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationPersister.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationPersister.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationPersister.java
new file mode 100644
index 0000000..44217d3
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshInvocationPersister.java
@@ -0,0 +1,56 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.ssh;
+
+import java.io.File;
+
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister;
+import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
+
+import org.apache.log4j.Logger;
+
+import de.uni_luebeck.inb.knowarc.usecases.invocation.InvocationException;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUseCaseInvocation;
+
+/**
+ * @author alanrw
+ *
+ */
+public class SshInvocationPersister extends InvocationPersister {
+
+ private static Logger logger = Logger.getLogger(SshInvocationPersister.class);
+ private CredentialManager credentialManager;
+
+
+
+ /* (non-Javadoc)
+ * @see net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister#load()
+ */
+ @Override
+ public void load(File directory) {
+ SshUseCaseInvocation.load(directory);
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister#persist()
+ */
+ @Override
+ public void persist(File directory) {
+ SshUseCaseInvocation.persist(directory);
+ }
+
+ @Override
+ public void deleteRun(String runId) {
+ try {
+ SshUseCaseInvocation.cleanup(runId, credentialManager);
+ } catch (InvocationException e) {
+ logger.error(e);
+ }
+ }
+
+ public void setCredentialManager(CredentialManager credentialManager) {
+ this.credentialManager = credentialManager;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshMechanismCreator.java
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshMechanismCreator.java b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshMechanismCreator.java
new file mode 100644
index 0000000..5271b12
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/java/net/sf/taverna/t2/activities/externaltool/ssh/SshMechanismCreator.java
@@ -0,0 +1,84 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.activities.externaltool.ssh;
+
+import java.util.ArrayList;
+
+import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
+import net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator;
+
+import org.apache.log4j.Logger;
+import org.jdom.Element;
+
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNode;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshNodeFactory;
+import de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUseCaseInvocation;
+
+/**
+ * @author alanrw
+ *
+ */
+public class SshMechanismCreator extends MechanismCreator {
+
+
+ private static Logger logger = Logger.getLogger(SshMechanismCreator.class);
+
+ /* (non-Javadoc)
+ * @see net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator#canHandle(java.lang.String)
+ */
+ @Override
+ public boolean canHandle(String mechanismType) {
+ return mechanismType.equals(SshUseCaseInvocation.SSH_USE_CASE_INVOCATION_TYPE);
+ }
+
+
+ @Override
+ public InvocationMechanism convert(Element detailsElement,
+ String mechanismName) {
+ ExternalToolSshInvocationMechanism result = new ExternalToolSshInvocationMechanism();
+ result.setName(mechanismName);
+ ArrayList<SshNode> nodeList = new ArrayList<SshNode>();
+ for (Object nodeObject : detailsElement.getChildren("sshNode")) {
+ Element nodeElement = (Element) nodeObject;
+ Element hostElement = nodeElement.getChild("host");
+ String host;
+ int port;
+ String directory;
+
+ host = hostElement.getText();
+
+ Element portElement = nodeElement.getChild("port");
+ port = Integer.parseInt(portElement.getText());
+
+ Element directoryElement = nodeElement.getChild("directory");
+
+ directory = directoryElement.getText();
+
+ boolean newNode = !SshNodeFactory.getInstance().containsSshNode(host, port, directory);
+
+ SshNode node = SshNodeFactory.getInstance().getSshNode(host, port, directory);
+
+ if (newNode) {
+
+ Element linkCommandElement = nodeElement.getChild("linkCommand");
+ if (linkCommandElement != null) {
+ node.setLinkCommand(linkCommandElement.getText());
+ }
+
+ Element copyCommandElement = nodeElement.getChild("copyCommand");
+ if (copyCommandElement != null) {
+ node.setCopyCommand(copyCommandElement.getText());
+ }
+
+ Element retrieveDataElement = nodeElement.getChild("retrieveData");
+ node.setRetrieveData(retrieveDataElement != null);
+ }
+ nodeList.add(node);
+
+ }
+ result.setNodes(nodeList);
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.InvocationCreator
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.InvocationCreator b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.InvocationCreator
new file mode 100644
index 0000000..3eeef74
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.InvocationCreator
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.local.LocalInvocationCreator
+net.sf.taverna.t2.activities.externaltool.ssh.SshInvocationCreator
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister
new file mode 100644
index 0000000..4f4b71f
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.local.LocalInvocationPersister
+net.sf.taverna.t2.activities.externaltool.ssh.SshInvocationPersister
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator
new file mode 100644
index 0000000..2166ed6
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.local.LocalMechanismCreator
+net.sf.taverna.t2.activities.externaltool.ssh.SshMechanismCreator
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI
new file mode 100644
index 0000000..6a18935
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ExternalReferenceSPI
@@ -0,0 +1,2 @@
+# Implementation classes of ExternalReferenceSPI go here, one per line
+de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshReference
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ValueToReferenceConverterSPI
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ValueToReferenceConverterSPI b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ValueToReferenceConverterSPI
new file mode 100644
index 0000000..53ca06c
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.reference.ValueToReferenceConverterSPI
@@ -0,0 +1,3 @@
+# Implementation classes of ValueToReferenceConverterSPI go here, one per line
+de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUrlToSshReference
+
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.RunDeletionListener
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.RunDeletionListener b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.RunDeletionListener
new file mode 100644
index 0000000..ac84bb3
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.RunDeletionListener
@@ -0,0 +1 @@
+net.sf.taverna.t2.activities.externaltool.ExternalToolRunDeletionListener
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
new file mode 100644
index 0000000..c97a79d
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/services/net.sf.taverna.t2.workflowmodel.health.HealthChecker
@@ -0,0 +1,2 @@
+net.sf.taverna.t2.activities.externaltool.ExternalToolActivityHealthChecker
+net.sf.taverna.t2.activities.externaltool.ExternalToolActivityMimeTypeChecker
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context-osgi.xml b/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context-osgi.xml
new file mode 100644
index 0000000..197f2c0
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context-osgi.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/osgi
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+ <service ref="SshReference" interface="net.sf.taverna.t2.reference.ExternalReferenceSPI" />
+
+ <service ref="invocationGroupManager" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManager" />
+
+ <service ref="LocalInvocationPersister" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister" />
+ <service ref="SshInvocationPersister" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister" />
+
+ <service ref="LocalMechanismCreator" interface="net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator" />
+ <service ref="SshMechanismCreator" interface="net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator" />
+
+ <service ref="ExternalToolRunDeletionListener" interface="net.sf.taverna.t2.workflowmodel.RunDeletionListener" />
+
+ <service ref="SshUrlToSshReference" interface="net.sf.taverna.t2.reference.ValueToReferenceConverterSPI" />
+
+ <service ref="ExternalToolActivityHealthChecker" interface="net.sf.taverna.t2.workflowmodel.health.HealthChecker" />
+ <service ref="ExternalToolActivityMimeTypeChecker" interface="net.sf.taverna.t2.workflowmodel.health.HealthChecker" />
+
+ <service ref="LocalInvocationCreator" interface="net.sf.taverna.t2.activities.externaltool.InvocationCreator" />
+ <service ref="SshInvocationCreator" interface="net.sf.taverna.t2.activities.externaltool.InvocationCreator" />
+
+ <service ref="externalToolActivityFactory" interface="net.sf.taverna.t2.workflowmodel.processor.activity.ActivityFactory" />
+
+ <list id="invocationCreators" interface="net.sf.taverna.t2.activities.externaltool.InvocationCreator" cardinality="0..N" />
+
+ <list id="mechanismCreators" interface="net.sf.taverna.t2.activities.externaltool.manager.MechanismCreator" cardinality="0..N" />
+
+ <list id="invocationPersisters" interface="net.sf.taverna.t2.activities.externaltool.manager.InvocationPersister" cardinality="0..N" />
+
+ <reference id="credentialManager" interface="net.sf.taverna.t2.security.credentialmanager.CredentialManager" />
+
+ <reference id="applicationConfiguration" interface="uk.org.taverna.configuration.app.ApplicationConfiguration" />
+
+ <reference id="edits" interface="net.sf.taverna.t2.workflowmodel.Edits" />
+</beans:beans>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context.xml
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context.xml b/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context.xml
new file mode 100644
index 0000000..a3cfdb8
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/META-INF/spring/external-tool-activity-context.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <bean id="SshReference" class="de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshReference">
+ <property name="credentialManager" ref="credentialManager" />
+ </bean>
+
+ <bean id="LocalInvocationPersister" class="net.sf.taverna.t2.activities.externaltool.local.LocalInvocationPersister" />
+ <bean id="SshInvocationPersister" class="net.sf.taverna.t2.activities.externaltool.ssh.SshInvocationPersister">
+ <property name="credentialManager" ref="credentialManager" />
+ </bean>
+
+ <bean id="LocalMechanismCreator" class="net.sf.taverna.t2.activities.externaltool.local.LocalMechanismCreator" />
+ <bean id="SshMechanismCreator" class="net.sf.taverna.t2.activities.externaltool.ssh.SshMechanismCreator" />
+
+ <bean id="ExternalToolRunDeletionListener" class="net.sf.taverna.t2.activities.externaltool.ExternalToolRunDeletionListener">
+ <property name="invocationGroupManager" ref="invocationGroupManager" />
+ </bean>
+
+ <bean id="SshUrlToSshReference" class="de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshUrlToSshReference">
+ <property name="credentialManager" ref="credentialManager" />
+ </bean>
+
+ <bean id="ExternalToolActivityHealthChecker" class="net.sf.taverna.t2.activities.externaltool.ExternalToolActivityHealthChecker">
+ <property name="invocationGroupManager" ref="invocationGroupManager" />
+ </bean>
+ <bean id="ExternalToolActivityMimeTypeChecker" class="net.sf.taverna.t2.activities.externaltool.ExternalToolActivityMimeTypeChecker" />
+
+ <bean id="LocalInvocationCreator" class="net.sf.taverna.t2.activities.externaltool.local.LocalInvocationCreator" />
+ <bean id="SshInvocationCreator" class="net.sf.taverna.t2.activities.externaltool.ssh.SshInvocationCreator">
+ <property name="credentialManager" ref="credentialManager" />
+ </bean>
+
+
+ <bean id="externalToolActivityFactory" class="net.sf.taverna.t2.activities.externaltool.ExternalToolActivityFactory">
+ <property name="invocationCreators" ref="invocationCreators" />
+ <property name="mechanismCreators" ref="mechanismCreators" />
+ <property name="edits" ref="edits" />
+ </bean>
+
+ <bean id="invocationGroupManager" class="net.sf.taverna.t2.activities.externaltool.manager.impl.InvocationGroupManagerImpl">
+ <constructor-arg name="applicationConfiguration" ref="applicationConfiguration" />
+ <constructor-arg name="mechanismCreators" ref="mechanismCreators" />
+ <constructor-arg name="invocationPersisters" ref="invocationPersisters" />
+ </bean>
+
+
+</beans>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/6bc470a3/taverna-external-tool-activity/src/main/resources/de/uni_luebeck/inb/knowarc/usecases/invocation/ssh/SshReference.hbm.xml
----------------------------------------------------------------------
diff --git a/taverna-external-tool-activity/src/main/resources/de/uni_luebeck/inb/knowarc/usecases/invocation/ssh/SshReference.hbm.xml b/taverna-external-tool-activity/src/main/resources/de/uni_luebeck/inb/knowarc/usecases/invocation/ssh/SshReference.hbm.xml
new file mode 100644
index 0000000..384cb25
--- /dev/null
+++ b/taverna-external-tool-activity/src/main/resources/de/uni_luebeck/inb/knowarc/usecases/invocation/ssh/SshReference.hbm.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<!-- Hibernate mapping for ssh reference bean -->
+<hibernate-mapping>
+ <joined-subclass
+ name="de.uni_luebeck.inb.knowarc.usecases.invocation.ssh.SshReference"
+ extends="net.sf.taverna.t2.reference.AbstractExternalReference">
+ <!-- Link to primary key from abstract superclass -->
+ <key column="bean_id" />
+ <!-- SshReference specific properties below here -->
+ <property name="host" type="string" />
+ <property name="port" type="integer"/>
+ <property name="directory" type="string" />
+ <property name="subDirectory" type="string" />
+ <property name="fileName" type="string" />
+ <property name="dataNatureInteger" type="integer"/>
+
+ <property name="charset" type="string" />
+ </joined-subclass>
+</hibernate-mapping>
+