http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivity.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivity.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivity.java new file mode 100644 index 0000000..e61406b --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivity.java @@ -0,0 +1,1319 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Vector; + +import net.sf.taverna.t2.annotation.annotationbeans.MimeType; +import net.sf.taverna.t2.reference.ExternalReferenceSPI; +import net.sf.taverna.t2.reference.ReferenceContext; +import net.sf.taverna.t2.reference.ReferenceService; +import net.sf.taverna.t2.reference.ReferenceServiceException; +import net.sf.taverna.t2.reference.T2Reference; +import net.sf.taverna.t2.workflowmodel.EditException; +import net.sf.taverna.t2.workflowmodel.OutputPort; +import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity; +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException; +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort; +import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback; + +import org.apache.log4j.Logger; +import org.biomoby.client.CentralImpl; +import org.biomoby.service.dashboard.data.ParametersTable; +import org.biomoby.shared.Central; +import org.biomoby.shared.MobyData; +import org.biomoby.shared.MobyException; +import org.biomoby.shared.MobyPrimaryDataSet; +import org.biomoby.shared.MobyPrimaryDataSimple; +import org.biomoby.shared.MobySecondaryData; +import org.biomoby.shared.MobyService; +import org.biomoby.shared.Utils; +import org.jdom.Element; +import org.jdom.output.Format; +import org.jdom.output.XMLOutputter; + +/** + * An Activity based on the Biomoby compliant web services. This activity + * implementation will contact Biomoby registry in order to find the list of + * extant ports at creation time. + * + * Copied from org.biomoby.client.taverna.plugin.BiomobyProcessor and + * org.biomoby.client.taverna.plugin.BiomobyTask and converted to a Taverna 2 + * Activity. + * + * @author Martin Senger + * @author Edward Kawas + * @author Jose Maria Fernandez, INB + * @author David Withers + */ +public class BiomobyActivity extends + AbstractAsynchronousActivity<BiomobyActivityConfigurationBean> { + + public static final String URI = "http://ns.taverna.org.uk/2010/activity/biomoby/service"; + + private static Logger logger = Logger.getLogger(BiomobyActivity.class); + + protected BiomobyActivityConfigurationBean configurationBean = new BiomobyActivityConfigurationBean(); + + private URL endpoint; + + private Central worker = null; + + private MobyService mobyService = null; + + private boolean containSecondary = false; + + private ParametersTable parameterTable = null; + + + + private boolean doInit = true; + + @Override + public void configure(BiomobyActivityConfigurationBean configurationBean) + throws ActivityConfigurationException { + this.configurationBean = configurationBean; + if (doInit) { + init(); + generatePorts(); + configureSecondaries(); + doInit = false; + } else { + configureSecondaries(); + } + } + + @Override + public BiomobyActivityConfigurationBean getConfiguration() { + return configurationBean; + } + + @Override + public void executeAsynch(final Map<String, T2Reference> inputMap, + final AsynchronousActivityCallback callback) { + callback.requestRun(new Runnable() { + @SuppressWarnings("unchecked") + public void run() { + ReferenceService referenceService = callback.getContext() + .getReferenceService(); + + Map<String, T2Reference> outputMap = new HashMap<String, T2Reference>(); + + if (logger.isDebugEnabled()) { + logger.debug("Service " + mobyService.getUniqueName()); + for (Iterator it = inputMap.keySet().iterator(); it + .hasNext();) { + String key = (String) it.next(); + try { + Object input = referenceService.renderIdentifier( + inputMap.get(key), String.class, callback + .getContext()); + if (input instanceof String) { + logger.debug("key " + key + "has value of\n" + + input); + continue; + } else if (input instanceof List) { + List list = (List) input; + for (Iterator it2 = list.iterator(); it2 + .hasNext();) { + logger.debug("List key " + key + + "has value of\n" + it2.next()); + } + } + } catch (ReferenceServiceException e) { + logger.debug( + "Error resolving data for port " + key, e); + } + } + logger.debug("Printing of ports complete."); + } + // invoke services with no defined input (as per BioMOBY API) + if (mobyService.getPrimaryInputs().length == 0) { + try { + String methodName = configurationBean.getServiceName(); + String serviceEndpoint = endpoint.toExternalForm(); + String serviceInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + + "<moby:MOBY xmlns:moby=\"http://www.biomoby.org/moby\">" + + " <moby:mobyContent>" + + " <moby:mobyData moby:queryID=\"sip_1_\" />" + + " </moby:mobyContent>" + "</moby:MOBY>"; + String[] invocations = new String[] { serviceInput }; + // add secondaries + if (containSecondary) { + @SuppressWarnings("unused") + ParametersTable pt = getParameterTable(); + Element[] parameters = null; + parameters = getParameterTable().toXML(); + serviceInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + + "<moby:MOBY xmlns:moby=\"http://www.biomoby.org/moby\">" + + " <moby:mobyContent>" + + " <moby:mobyData moby:queryID=\"sip_1_\">"; + XMLOutputter out = new XMLOutputter(Format + .getCompactFormat()); + Format format = out.getFormat(); + format.setOmitDeclaration(true); + out.setFormat(format); + for (int i = 0; i < parameters.length; i++) { + serviceInput += out.outputString(parameters[i]); + } + serviceInput += " </moby:mobyData>" + + " </moby:mobyContent>" + "</moby:MOBY>"; + format = Format.getPrettyFormat(); + format.setOmitDeclaration(false); + format.setIndent(" "); + serviceInput = new XMLOutputter(format) + .outputString(XMLUtilities + .getDOMDocument(serviceInput)); + invocations = new String[] { serviceInput }; + } + + // execute the service that takes no Biomoby datatypes + // as input + for (int inCount = 0; inCount < invocations.length; inCount++) { + if (logger.isDebugEnabled()) + logger.debug("input(" + inCount + "):\n" + + invocations[inCount]); + // execute a 'moby' service + invocations[inCount] = executeService( + serviceEndpoint, methodName, + invocations[inCount]); + if (logger.isDebugEnabled()) + logger.debug("output(" + inCount + "):\n" + + invocations[inCount]); + } + String outputXML = XMLUtilities + .createMultipleInvokations(invocations); + // create the other ports + processOutputPorts(outputXML, outputMap, + referenceService, callback.getContext()); + + callback.receiveResult(outputMap, new int[0]); + return; + } catch (ReferenceServiceException e) { + callback.fail("Error accessing input/output data", e); + } catch (MobyException ex) { + // a MobyException should be already reasonably + // formatted + logger + .error( + "Error invoking biomoby service for biomoby. A MobyException caught", + ex); + callback.fail( + "Service failed due to problem invoking remote biomoby service.\n" + + ex.getMessage(), ex); + + } catch (Exception ex) { + logger.error( + "Error invoking biomoby service for biomoby", + ex); + callback + .fail( + "Task failed due to problem invoking biomoby service (see details in log)", + ex); + } + } + + { + // now try other named ports + try { + String inputXML = null; + Element root = new Element("MOBY", XMLUtilities.MOBY_NS); + Element content = new Element("mobyContent", + XMLUtilities.MOBY_NS); + root.addContent(content); + int totalMobyDatas = 0; + Vector mobyDatas = new Vector(); // list of mobyData + // element + for (ActivityInputPort myInput : getInputPorts()) { + if (myInput.getName().equalsIgnoreCase("input")) { + continue; + } + // the port name + String portName = myInput.getName(); + // the article name + String articleName = ""; + String type = portName; + if (portName.indexOf("(") >= 0 + && portName.indexOf(")") > 0) { + articleName = portName.substring(portName + .indexOf("(") + 1, portName + .indexOf(")")); + + if (articleName.indexOf("'") >= 0 + && articleName.lastIndexOf("'") > 0) + articleName = articleName.substring( + articleName.indexOf("'") + 1, + articleName.lastIndexOf("'")); + + type = portName.substring(0, portName + .indexOf("(")); + } + + // String inputType = myInput.getSyntacticType(); + Object input = referenceService.renderIdentifier( + inputMap.get(portName), myInput + .getTranslatedElementClass(), + callback.getContext()); + if (myInput.getDepth() == 0) { + inputXML = (String) input; + Element inputElement = null; + try { + inputElement = XMLUtilities.getDOMDocument( + inputXML).getRootElement(); + + } catch (MobyException e) { + callback + .fail(XMLUtilities.newline + + "There was an error parsing the input XML:" + + XMLUtilities.newline + + Utils.format(inputXML, 3) + + XMLUtilities.newline + + e.getLocalizedMessage()); + return; + } + // determine whether we have a multiple + // invocation message + if (XMLUtilities + .isMultipleInvocationMessage(inputElement)) { + // multiple invocations + Element[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(inputElement); + ArrayList list = new ArrayList(); + for (int j = 0; j < invocations.length; j++) { + Element[] elements = XMLUtilities + .getListOfCollections(invocations[j]); + if (elements.length == 0) { + // single simple + inputElement = XMLUtilities + .renameSimple(articleName, + type, + invocations[j]); + Element md = XMLUtilities + .extractMobyData(inputElement); + list.add(md); + } else { + // collection of simples => create + // multiple + // invocation message + String queryID = XMLUtilities + .getQueryID(invocations[j]); + Element[] simples = XMLUtilities + .getSimplesFromCollection(invocations[j]); + for (int k = 0; k < simples.length; k++) { + Element wrappedSimple = XMLUtilities + .createMobyDataElementWrapper(simples[k]); + wrappedSimple = XMLUtilities + .renameSimple( + articleName, + type, + wrappedSimple); + wrappedSimple = XMLUtilities + .setQueryID( + wrappedSimple, + queryID ); + list + .add(XMLUtilities + .extractMobyData(wrappedSimple)); + } + } + } + if (list.isEmpty()) + continue; + if (totalMobyDatas < 1) + totalMobyDatas = 1; + totalMobyDatas *= list.size(); + mobyDatas.add(list); + } else { + // single invocation + // is this a collection + Element[] elements = XMLUtilities + .getListOfCollections(inputElement); + if (elements.length == 0) { + // single simple + inputElement = XMLUtilities + .renameSimple(articleName, + type, inputElement); + ArrayList list = new ArrayList(); + Element md = XMLUtilities + .extractMobyData(inputElement); + list.add(md); + mobyDatas.add(list); + if (totalMobyDatas < 1) + totalMobyDatas = 1; + } else { + // collection of simples => create + // multiple + // invocation message + String queryID = XMLUtilities + .getQueryID(inputElement); + Element[] simples = XMLUtilities + .getSimplesFromCollection(inputElement); + + ArrayList list = new ArrayList(); + for (int j = 0; j < simples.length; j++) { + Element wrappedSimple = XMLUtilities + .createMobyDataElementWrapper(simples[j]); + wrappedSimple = XMLUtilities + .renameSimple(articleName, + type, wrappedSimple); + wrappedSimple = XMLUtilities + .setQueryID(wrappedSimple, + queryID ); + list + .add(XMLUtilities + .extractMobyData(wrappedSimple)); + } + if (list.isEmpty()) + continue; + mobyDatas.add(list); + if (totalMobyDatas < 1) + totalMobyDatas = 1 * list.size(); + else { + totalMobyDatas *= list.size(); + } + } + + } + } else { + // we have a collection! + // inputThing is a list of Strings + List list = (List) input; + /* + * need this map in cases where simples are + * passed into a service that wants a + * collection. each simple is then added into + * the same collection + */ + Map collectionMap = new HashMap(); + for (Iterator it = list.iterator(); it + .hasNext();) { + Element inputElement = null; + String next = (String) it.next(); + try { + inputElement = XMLUtilities + .getDOMDocument(next) + .getRootElement(); + + } catch (MobyException e) { + callback + .fail(XMLUtilities.newline + + "There was an error parsing the input XML:" + + XMLUtilities.newline + + Utils.format( + inputXML, 3) + + XMLUtilities.newline + + e + .getLocalizedMessage()); + return; + } + // determine whether we have a multiple + // invocation message + if (XMLUtilities + .isMultipleInvocationMessage(inputElement)) { + // multiple invocations (update + // totalMobyDatas) + Element[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(inputElement); + ArrayList mdList = new ArrayList(); + // this is here for mim messages of + // simples + Element mimCollection = null; + String mimQueryID = ""; + for (int j = 0; j < invocations.length; j++) { + Element[] elements = XMLUtilities + .getListOfCollections(invocations[j]); + mimQueryID = XMLUtilities + .getQueryID(invocations[j]); + if (elements.length == 0) { + if (mimCollection == null) + mimCollection = new Element( + "Collection", + XMLUtilities.MOBY_NS); + + Element theSimple = XMLUtilities + .extractMobyData(invocations[j]); + if (theSimple + .getChild("Simple") != null) + theSimple = theSimple + .getChild("Simple"); + else if (theSimple.getChild( + "Simple", + XMLUtilities.MOBY_NS) != null) + theSimple = theSimple + .getChild( + "Simple", + XMLUtilities.MOBY_NS); + mimCollection + .addContent(theSimple + .detach()); + } else { + // collection passed in (always + // 1 passed in) + Element collection = invocations[j]; + collection = XMLUtilities + .renameCollection( + articleName, + collection); + collection = XMLUtilities + .createMobyDataElementWrapper( + collection, + XMLUtilities + .getQueryID(invocations[j]), + null); + mdList + .add(XMLUtilities + .extractMobyData(collection)); + } + } + if (mimCollection != null) { + mimCollection = XMLUtilities + .createMobyDataElementWrapper( + mimCollection, + mimQueryID, null); + mimCollection = XMLUtilities + .renameCollection( + articleName, + mimCollection); + mimCollection = XMLUtilities + .createMobyDataElementWrapper( + mimCollection, + mimQueryID, null); + mdList + .add(XMLUtilities + .extractMobyData(mimCollection)); + } + + if (mdList.isEmpty()) + continue; + + mobyDatas.add(mdList); + if (totalMobyDatas < 1) + totalMobyDatas = 1; + totalMobyDatas *= mdList.size(); + } else { + // single invocation + Element[] elements = XMLUtilities + .getListOfCollections(inputElement); + if (elements.length == 0) { + // simple was passed in so wrap it + Element collection = new Element( + "Collection", + XMLUtilities.MOBY_NS); + collection.addContent(XMLUtilities + .extractMobyData( + inputElement) + .cloneContent()); + collection = XMLUtilities + .createMobyDataElementWrapper( + collection, + XMLUtilities + .getQueryID(inputElement), + null); + collection = XMLUtilities + .renameCollection( + articleName, + collection); + collection = XMLUtilities + .createMobyDataElementWrapper( + collection, + XMLUtilities + .getQueryID(inputElement), + null); + if (collectionMap + .containsKey(articleName)) { + // add the simple to a + // pre-existing + // collection + ArrayList mdList = (ArrayList) collectionMap + .remove(articleName); + mdList + .add(XMLUtilities + .extractMobyData(collection)); + collectionMap.put(articleName, + mdList); + } else { + // new collection - add element + // and + // increment count + ArrayList mdList = new ArrayList(); + mdList + .add(XMLUtilities + .extractMobyData(collection)); + collectionMap.put(articleName, + mdList); + // totalMobyDatas++; + if (totalMobyDatas < 1) + totalMobyDatas = 1; + } + } else { + // we have a collection + Element collection = inputElement; + collection = XMLUtilities + .renameCollection( + articleName, + collection); + ArrayList mdList = new ArrayList(); + collection = XMLUtilities + .createMobyDataElementWrapper( + collection, + XMLUtilities + .getQueryID(inputElement), + null); + mdList + .add(XMLUtilities + .extractMobyData(collection)); + mobyDatas.add(mdList); + if (totalMobyDatas < 1) + totalMobyDatas = 1; + + } + } // end if SIM + } // end iteration over inputThing list + Iterator collectionIterator = collectionMap + .keySet().iterator(); + while (collectionIterator.hasNext()) { + String key = (String) collectionIterator + .next(); + List theList = (List) collectionMap + .get(key); + theList = XMLUtilities.mergeCollections( + theList, key); + List unwrappedList = new ArrayList(); + for (Iterator it = theList.iterator(); it + .hasNext();) { + Element e = (Element) it.next(); + if (XMLUtilities.isWrapped(e)) + unwrappedList.add(XMLUtilities + .extractMobyData(e)); + else + unwrappedList.add(e); + } + mobyDatas.add(unwrappedList); + } + } + } + + if (logger.isDebugEnabled()) { + logger.debug("Before MobyData aggregation"); + for (Iterator itr = mobyDatas.iterator(); itr + .hasNext();) { + List eList = (List) itr.next(); + for (int x = 0; x < eList.size(); x++) { + logger.debug(new XMLOutputter(Format + .getPrettyFormat()) + .outputString((Element) eList + .get(x))); + } + } + logger.debug("******* End ******"); + } + /* + * ports have been processed -> vector contains a list + * of all the different types of inputs with their + * article names set correctly. The elements are from + * mobyData down. Moreover, there are totalMobyData + * number of invocations in the output moby message + */ + if (logger.isDebugEnabled()) { + logger.debug("TotalMobyDatas: " + totalMobyDatas); + } + Element[] mds = new Element[totalMobyDatas]; + // initialize the mobydata blocks + for (int x = 0; x < mds.length; x++) { + mds[x] = new Element("mobyData", + XMLUtilities.MOBY_NS); + String queryID = "_"; + // add the content + for (Iterator iter = mobyDatas.iterator(); iter + .hasNext();) { + ArrayList list = (ArrayList) iter.next(); + int index = x % list.size(); + Element next = ((Element) list.get(index)); + logger.debug(new XMLOutputter(Format + .getPrettyFormat()).outputString(next)); + // queryID += "_" + + // XMLUtilities.getQueryID(next); + queryID = XMLUtilities.getQueryID(next); + mds[x].addContent(next.cloneContent()); + + } + // remove the first _ + // if (queryID != null && queryID.length() > 1) + // queryID = queryID.substring(1); + mds[x].setAttribute("queryID", queryID, + XMLUtilities.MOBY_NS); + // if secondarys exist add them here + if (containSecondary) { + @SuppressWarnings("unused") + ParametersTable pt = parameterTable; + Element[] parameters = null; + parameters = parameterTable.toXML(); + for (int i = 0; i < parameters.length; i++) { + mds[x].addContent((parameters[i]).detach()); + } + } + content.addContent(mds[x].detach()); + } + + if (logger.isDebugEnabled()) { + logger.debug("After MobyData aggregation"); + logger.debug(new XMLOutputter(Format + .getPrettyFormat()).outputString(root)); + logger.debug("******* End ******"); + } + // do the task and populate outputXML + + String methodName = configurationBean.getServiceName(); + String serviceEndpoint = endpoint.toExternalForm(); + + String serviceInput = new XMLOutputter(Format + .getPrettyFormat()).outputString(root); + String[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(serviceInput); + // logger.debug(serviceInput); + // going to iterate over all invocations so that + // messages with + // many mobyData blocks dont timeout. + logger.debug("Total invocations " + invocations.length); + if (invocations.length > 0) + logger.debug("invocation 00"); + for (int inCount = 0; inCount < invocations.length; inCount++) { + if (logger.isDebugEnabled()) + logger.info("input(" + inCount + "):\n" + + invocations[inCount]); + if (!XMLUtilities.isEmpty(invocations[inCount])) + invocations[inCount] = executeService( + serviceEndpoint, methodName, + invocations[inCount]); + if (logger.isDebugEnabled()) + logger.info("output(" + inCount + "):\n" + + invocations[inCount]); + } + + String outputXML = XMLUtilities + .createMultipleInvokations(invocations); + // create the other ports + processOutputPorts(outputXML, outputMap, + referenceService, callback.getContext()); + + callback.receiveResult(outputMap, new int[0]); + + } catch (ReferenceServiceException e) { + callback.fail("Error accessing input/output data", e); + } catch (MobyException ex) { + // a MobyException should be already reasonably + // formatted + logger + .error( + "Error invoking biomoby service for biomoby. A MobyException caught", + ex); + callback.fail( + "Service failed due to exception invoking remote biomoby service.\n" + + ex.getMessage(), ex); + + } catch (Exception ex) { + // details of other exceptions will appear only in a log +// ex.(); + logger.error( + "Error invoking biomoby service for biomoby", + ex); + callback + .fail( + "Task failed due to problem invoking biomoby service (see details in log)", + ex); + } + + } + } + + }); + + } + + private void init() throws ActivityConfigurationException { + // Find the service endpoint (by calling Moby registry) + try { + if (mobyService == null) { + worker = new CentralImpl(configurationBean.getMobyEndpoint()); + + MobyService pattern = new MobyService(configurationBean + .getServiceName()); + pattern.setAuthority(configurationBean.getAuthorityName()); + pattern.setCategory(""); + MobyService[] services = worker.findService(pattern); + if (services == null || services.length == 0) + throw new ActivityConfigurationException( + formatError("I cannot find the service.")); + mobyService = services[0]; + } + String serviceEndpoint = mobyService.getURL(); + if (serviceEndpoint == null || serviceEndpoint.equals("")) + throw new ActivityConfigurationException( + formatError("Service has an empty endpoint.")); + try { + endpoint = new URL(serviceEndpoint); + } catch (MalformedURLException e2) { + throw new ActivityConfigurationException( + formatError("Service has malformed endpoint: '" + + serviceEndpoint + "'.")); + } + + } catch (Exception e) { + if (e instanceof ActivityConfigurationException) { + throw (ActivityConfigurationException) e; + } + throw new ActivityConfigurationException(formatError(e.toString())); + } + // here we make sure that we have downloaded the ontology for the + // registry that we got this service from + try { + new GetOntologyThread(worker.getRegistryEndpoint()).start(); + } catch (Exception e) { + /* don't care if an exception occurs here ... */ + } + + } + + /** + * Use the endpoint data to create new ports and attach them to the + * processor. + */ + private void generatePorts() { + + // inputs TODO - find a better way to deal with collections + MobyData[] serviceInputs = this.mobyService.getPrimaryInputs(); + int inputDepth = 0; + for (int x = 0; x < serviceInputs.length; x++) { + if (serviceInputs[x] instanceof MobyPrimaryDataSimple) { + MobyPrimaryDataSimple simple = (MobyPrimaryDataSimple) serviceInputs[x]; + + // retrieve the simple article name + String simpleName = simple.getName(); + if (simpleName.equals("")) { + simpleName = "_ANON_"; + } + simpleName = "(" + simpleName + ")"; + + String portName = simple.getDataType().getName() + simpleName; + addInput(portName, inputDepth, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + } else { + // collection of items + inputDepth = 1; + MobyPrimaryDataSet collection = (MobyPrimaryDataSet) serviceInputs[x]; + String collectionName = collection.getName(); + if (collectionName.equals("")) + collectionName = "MobyCollection"; + MobyPrimaryDataSimple[] simples = collection.getElements(); + for (int y = 0; y < simples.length; y++) { + // collection port + String portName = simples[y].getDataType().getName() + + "(Collection - '" + collectionName + "')"; + addInput( + portName, + inputDepth, + true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + + } + } + } + /*addInput("input", inputDepth, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class);*/ + + MobyData[] secondaries = this.mobyService.getSecondaryInputs(); + + if (secondaries.length > 0) { + MobySecondaryData[] msd = new MobySecondaryData[secondaries.length]; + for (int i = 0; i < secondaries.length; i++) { + msd[i] = (MobySecondaryData) secondaries[i]; + } + containSecondary = true; + this.parameterTable = new org.biomoby.service.dashboard.data.ParametersTable( + msd); + updateConfigBeanSecondaries(); + } + + // outputs + MobyData[] serviceOutputs = this.mobyService.getPrimaryOutputs(); + int outputDepth = 0; + for (int x = 0; x < serviceOutputs.length; x++) { + if (serviceOutputs[x] instanceof MobyPrimaryDataSimple) { + MobyPrimaryDataSimple simple = (MobyPrimaryDataSimple) serviceOutputs[x]; + + // retrieve the simple article name + String simpleName = simple.getName(); + if (simpleName.equals("")) { + simpleName = "_ANON_"; + } + simpleName = "(" + simpleName + ")"; + + String outputName = simple.getDataType().getName() + simpleName; + addOutput(outputName, outputDepth, "text/xml"); + } else { + outputDepth = 1; + // collection of items + MobyPrimaryDataSet collection = (MobyPrimaryDataSet) serviceOutputs[x]; + String collectionName = collection.getName(); + if (collectionName.equals("")) + collectionName = "MobyCollection"; + MobyPrimaryDataSimple[] simples = collection.getElements(); + for (int y = 0; y < simples.length; y++) { + String outputName = simples[y].getDataType().getName() + + "(Collection - '" + collectionName + "')"; + addOutput(outputName, outputDepth, "text/xml"); + + outputName = simples[y].getDataType().getName() + + "(Collection - '" + collectionName + + "' As Simples)"; + addOutput(outputName, outputDepth, "text/xml"); + } + } + } + +// addOutput("output", outputDepth, "text/xml"); + + } + + /** + * Updates config bean secondaries for those that aren't already defined so + * this only records new ones, but doesn't overwrite existing ones. + */ + private void updateConfigBeanSecondaries() { + ParametersTable table = getParameterTable(); + int rows = table.getModel().getRowCount(); + Map<String, String> secondaries = getConfiguration().getSecondaries(); + for (int i = 0; i < rows; i++) { + String key = (String) table.getModel().getValueAt(i, 0); + String value = table.getModel().getValueAt(i, 1).toString(); + if (!secondaries.containsKey(key)) { + secondaries.put(key, value); + } + } + + } + + public ParametersTable getParameterTable() { + return parameterTable; + } + + public boolean containsSecondaries() { + return containSecondary; + } + + public MobyService getMobyService() { + return mobyService; + } + + @SuppressWarnings("unchecked") + private void processOutputPorts(String outputXML, Map outputMap, + ReferenceService referenceService, ReferenceContext context) + throws MobyException, ReferenceServiceException { + boolean isMIM = XMLUtilities.isMultipleInvocationMessage(outputXML); + for (OutputPort outputPort : getOutputPorts()) { + String name = outputPort.getName(); + if (!name.equalsIgnoreCase("output")) { + if (outputPort.getDepth() == 1) { + // collection - list of strings + String articleName = ""; + if (name.indexOf("MobyCollection") > 0) { + // un-named collection -> ignore it as it is illegal + // in the api + // TODO could throw exception + + List innerList = new ArrayList(); + outputMap.put(name, referenceService + .register(innerList, outputPort.getDepth(), + true, context)); + continue; + } else { + articleName = name.substring(name.indexOf("'") + 1, + name.lastIndexOf("'")); + if (name.indexOf("' As Simples)") > 0) { + // list of simples wanted + if (isMIM) { + String[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(outputXML); + + List innerList = new ArrayList(); + Element serviceNotesElement = XMLUtilities + .getServiceNotesAsElement(outputXML); + for (int i = 0; i < invocations.length; i++) { + try { + String collection = XMLUtilities + .getWrappedCollection( + articleName, + invocations[i]); + String[] simples = XMLUtilities + .getSimplesFromCollection( + articleName, collection); + for (int j = 0; j < simples.length; j++) { + innerList + .add(XMLUtilities + .createMobyDataElementWrapper( + simples[j], + XMLUtilities + .getQueryID(collection) + /* + * + "_+_s" + * + + * qCounter + * ++ + */, + serviceNotesElement)); + } + } catch (MobyException e) { + // collection didnt exist, so put an + // empty + // mobyData + // TODO keep the original wrapper + /* + * String qID = + * XMLUtilities.getQueryID(invocations + * [i]); Element empty = + * XMLUtilities.createMobyDataWrapper + * (qID, + * XMLUtilities.getServiceNotesAsElement + * (outputXML)); XMLOutputter output = + * new XMLOutputter(Format + * .getPrettyFormat()); + * innerList.add(output + * .outputString(empty)); + */ + } + } + outputMap.put(name, referenceService.register( + innerList, outputPort.getDepth(), true, + context)); + } else { + // process the single invocation and put string + // into + // a + // list + try { + + List innerList = new ArrayList(); + String collection = XMLUtilities + .getWrappedCollection(articleName, + outputXML); + + String[] simples = XMLUtilities + .getSimplesFromCollection( + articleName, collection); + Element serviceNotesElement = XMLUtilities + .getServiceNotesAsElement(outputXML); + for (int i = 0; i < simples.length; i++) { + innerList + .add(XMLUtilities + .createMobyDataElementWrapper( + simples[i], + XMLUtilities + .getQueryID(collection), + serviceNotesElement)); + } + + outputMap + .put( + name, + referenceService + .register( + innerList, + outputPort + .getDepth(), + true, + context)); + } catch (MobyException e) { + List innerList = new ArrayList(); + outputMap + .put( + name, + referenceService + .register( + innerList, + outputPort + .getDepth(), + true, + context)); + } + } + } else { + if (isMIM) { + // process each invocation and then merge them + // into + // a + // single string + String[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(outputXML); + + List innerList = new ArrayList(); + for (int i = 0; i < invocations.length; i++) { + try { + String collection = XMLUtilities + .getWrappedCollection( + articleName, + invocations[i]); + innerList.add(collection); + } catch (MobyException e) { + + } + } + + outputMap.put(name, referenceService.register( + innerList, outputPort.getDepth(), true, + context)); + } else { + + try { + + List innerList = new ArrayList(); + String collection = XMLUtilities + .getWrappedCollection(articleName, + outputXML); + innerList.add(collection); + outputMap + .put( + name, + referenceService + .register( + innerList, + outputPort + .getDepth(), + true, + context)); + } catch (MobyException e) { + List innerList = new ArrayList(); + outputMap + .put( + name, + referenceService + .register( + innerList, + outputPort + .getDepth(), + true, + context)); + } + } + } + } + } else { + // simple - single string + if (name.indexOf("_ANON_") > 0) { + // un-named simple -> ignore it as it is illegal in the + // api + // TODO could throw exception + + String empty = new XMLOutputter() + .outputString(XMLUtilities + .createMobyDataWrapper( + XMLUtilities + .getQueryID(outputXML), + XMLUtilities + .getServiceNotesAsElement(outputXML))); + List innerList = new ArrayList(); + innerList.add(empty); + outputMap.put(name, referenceService.register(empty, + outputPort.getDepth(), true, context)); + // FIXME outputMap.put(name, new + // DataThing((Object)null)); + continue; + } else { + // TODO what if you make mim messages a single string + // and then simples always output 'text/xml'? + String articleName = name.substring( + name.indexOf("(") + 1, name.indexOf(")")); + if (isMIM) { + + String[] invocations = XMLUtilities + .getSingleInvokationsFromMultipleInvokations(outputXML); + + ArrayList innerList = new ArrayList(); + + for (int i = 0; i < invocations.length; i++) { + try { + String simple = XMLUtilities + .getWrappedSimple(articleName, + invocations[i]); + innerList.add(simple); + } catch (MobyException e) { + // simple didnt exist, so put an empty + // mobyData + // TODO keep the original wrapper + String qID = XMLUtilities + .getQueryID(invocations[i]); + + Element empty = XMLUtilities + .createMobyDataWrapper( + qID, + XMLUtilities + .getServiceNotesAsElement(outputXML)); + XMLOutputter output = new XMLOutputter( + Format.getPrettyFormat()); + // invocations[i] = + // output.outputString(empty); + innerList.add(output.outputString(empty)); + // FIXME outputMap.put(name, new + // DataThing("")); + } + } + String[] s = new String[innerList.size()]; + s = (String[]) innerList.toArray(s); + try { + outputMap.put(name, referenceService.register( + XMLUtilities + .createMultipleInvokations(s), + outputPort.getDepth(), true, context)); + } catch (MobyException e) { + logger + .error("Error creating output for service: " + + "." + + System + .getProperty("line.separator") + + e.getMessage()); + outputMap.put(name, referenceService.register( + "", outputPort.getDepth(), true, + context)); + } + } else { + // process the single invocation and put into a + // string + try { + String simple = XMLUtilities.getWrappedSimple( + articleName, outputXML); + ArrayList innerList = new ArrayList(); + innerList.add(simple); + outputMap.put(name, referenceService.register( + simple, outputPort.getDepth(), true, + context)); + } catch (MobyException e) { + // simple didnt exist, so put an empty mobyData + // TODO keep the original wrapper + String qID = XMLUtilities.getQueryID(outputXML); + Element empty = XMLUtilities + .createMobyDataWrapper( + qID, + XMLUtilities + .getServiceNotesAsElement(outputXML)); + XMLOutputter output = new XMLOutputter(Format + .getPrettyFormat()); + ArrayList innerList = new ArrayList(); + innerList.add(output.outputString(empty)); + outputMap.put(name, referenceService.register( + output.outputString(empty), outputPort + .getDepth(), true, context)); + // FIXME outputMap.put(name, new DataThing("")); + + } + } + } + } + } + } + } + + protected String formatError(String msg) { + // Removed references to the authority, some errors + // were causing it to be null which in turn threw + // a NPE from here, breaking Taverna's error handlers + return ("Problems with service '" + configurationBean.getServiceName() + + "' provided by authority '" + + configurationBean.getAuthorityName() + + "'\nfrom Moby registry at " + + configurationBean.getMobyEndpoint() + ":\n\n" + msg); + } + + protected ActivityInputPort getInputPort(String name) { + for (ActivityInputPort port : getInputPorts()) { + if (port.getName().equals(name)) { + return port; + } + } + return null; + } + + protected OutputPort getOutputPort(String name) { + for (OutputPort port : getOutputPorts()) { + if (port.getName().equals(name)) { + return port; + } + } + return null; + } + + protected void addOutput(String portName, int portDepth, String type) { + OutputPort port = edits.createActivityOutputPort( + portName, portDepth, portDepth); + MimeType mimeType = new MimeType(); + mimeType.setText(type); + try { + edits.getAddAnnotationChainEdit(port, mimeType) + .doEdit(); + } catch (EditException e) { + logger.debug("Error adding MimeType annotation to port", e); + } + outputPorts.add(port); + } + + private void configureSecondaries() { + if (configurationBean.getSecondaries().size() > 0 + && containsSecondaries()) { + MobyData[] datas = getMobyService().getSecondaryInputs(); + for (Entry<String, String> entry : configurationBean + .getSecondaries().entrySet()) { + String name = entry.getKey(); + String value = entry.getValue(); + for (int i = 0; i < datas.length; i++) { + if (datas[i].getName().equals(name)) { + ((MobySecondaryData) datas[i]).setDefaultValue(value); + break; + } + } + } + MobySecondaryData[] msd = new MobySecondaryData[datas.length]; + for (int i = 0; i < datas.length; i++) { + msd[i] = (MobySecondaryData) datas[i]; + } + setParameterTable(new ParametersTable(msd)); + } + } + + private void setParameterTable(ParametersTable table) { + parameterTable = table; + } + + private String executeService(String url, String serviceName, String xml) + throws MobyException { + // here we get the wsdl before calling the service, as the biomoby api assumes ... + try { + new RetrieveWsdlThread(worker, mobyService).start(); + } catch (Exception e) { + /* don't care if an exception occurs here ... */ + logger.info("Problem getting the biomoby wsdl for " + mobyService.getUniqueName() + ".\n" + e.getLocalizedMessage()); + } + String serviceCategory = mobyService.getCategory(); + if (serviceCategory.equalsIgnoreCase(MobyService.CATEGORY_MOBY)) { + return ExecuteMobyService.executeMobyService(url, serviceName, xml); + } else if (serviceCategory.equalsIgnoreCase("cgi")) { + return ExecuteCgiService.executeCgiService(url, xml); + } else if (serviceCategory.equalsIgnoreCase(MobyService.CATEGORY_MOBY_ASYNC)) { + return ExecuteAsyncMobyService.executeMobyAsyncService(url, serviceName, xml); + } else if (serviceCategory.equalsIgnoreCase("cgi-async")) { + return ExecuteAsyncCgiService.executeMobyCgiAsyncService(url, serviceName, xml); + } + // TODO should we throw an exception here? + return ""; + } +}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityConfigurationBean.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityConfigurationBean.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityConfigurationBean.java new file mode 100644 index 0000000..03abb6e --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityConfigurationBean.java @@ -0,0 +1,142 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean; +import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty; + +/** + * A configuration bean specific to the Biomoby activity. + * + * @author David Withers + */ +@ConfigurationBean(uri = BiomobyActivity.URI + "#Config") +public class BiomobyActivityConfigurationBean { + + private String mobyEndpoint=""; + + private String serviceName=""; + + private String authorityName=""; + + @Deprecated + private String category = ""; + @Deprecated + private String serviceType = ""; + + private Map<String,String> secondaries=new HashMap<String,String>(); + + /** + * Returns the mobyEndpoint. + * + * @return the mobyEndpoint + */ + public String getMobyEndpoint() { + return mobyEndpoint; + } + + /** + * Sets the mobyEndpoint. + * + * @param mobyEndpoint the new mobyEndpoint + */ + @ConfigurationProperty(name = "mobyEndpoint", label = "Moby Endpoint") + public void setMobyEndpoint(String mobyEndpoint) { + this.mobyEndpoint = mobyEndpoint; + } + + /** + * Returns the serviceName. + * + * @return the serviceName + */ + public String getServiceName() { + return serviceName; + } + + /** + * Sets the serviceName. + * + * @param serviceName the new serviceName + */ + @ConfigurationProperty(name = "serviceName", label = "Service Name") + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + /** + * Returns the authorityName. + * + * @return the authorityName + */ + public String getAuthorityName() { + return authorityName; + } + + /** + * Sets the authorityName. + * + * @param authorityName the new authorityName + */ + @ConfigurationProperty(name = "authorityName", label = "Authority Name") + public void setAuthorityName(String authorityName) { + this.authorityName = authorityName; + } + + /** + * Returns the secondaries + * + * @return secondaries as a HashMap + */ + public Map<String,String> getSecondaries() { + return secondaries; + } + + /** + * + * @param secondaries + */ + public void setSecondaries(Map<String,String> secondaries) { + this.secondaries=secondaries; + } + + @ConfigurationProperty(name = "secondaries", label = "Secondaries", required=false) + public void setSecondaries(Set<Secondary> secondaries) { + Map<String,String> secondariesMap = new HashMap<String,String>(); + for (Secondary secondary : secondaries) { + secondariesMap.put(secondary.getKey(), secondary.getValue()); + } + this.secondaries=secondariesMap; + } + + @ConfigurationBean(uri = BiomobyActivity.URI + "#Secondary") + public static class Secondary { + private String key, value; + + public String getKey() { + return key; + } + + @ConfigurationProperty(name = "key", label = "Key") + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + @ConfigurationProperty(name = "value", label = "Value") + public void setValue(String value) { + this.value = value; + } + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityFactory.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityFactory.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityFactory.java new file mode 100644 index 0000000..9a7bdf0 --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityFactory.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (C) 2011 The University of Manchester + * + * Modifications to the initial code base are copyright of their + * respective authors, or their employers as appropriate. + * + * This program 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 2.1 of + * the License, or (at your option) any later version. + * + * This program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.net.URI; + +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityFactory; + +/** + * An {@link ActivityFactory} for creating <code>BiomobyActivity</code>. + * + * @author David Withers + */ +public class BiomobyActivityFactory implements ActivityFactory { + + @Override + public BiomobyActivity createActivity() { + return new BiomobyActivity(); + } + + @Override + public URI getActivityURI() { + return URI.create(BiomobyActivity.URI); + } + + @Override + public Object createActivityConfiguration() { + return new BiomobyActivityConfigurationBean(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityHealthChecker.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityHealthChecker.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityHealthChecker.java new file mode 100644 index 0000000..aec3d1a --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyActivityHealthChecker.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.util.List; + +import net.sf.taverna.t2.workflowmodel.processor.activity.Activity; +import net.sf.taverna.t2.visit.VisitReport; + +import net.sf.taverna.t2.workflowmodel.health.RemoteHealthChecker; +import net.sf.taverna.t2.workflowmodel.processor.activity.DisabledActivity; + +/** + * A health checker for the Biomoby activity. + * + * @author David Withers + */ +public class BiomobyActivityHealthChecker extends RemoteHealthChecker { + + public boolean canVisit(Object subject) { + if (subject == null) { + return false; + } + if (subject instanceof BiomobyActivity) { + return true; + } + if (subject instanceof DisabledActivity) { + return (((DisabledActivity) subject).getActivity() instanceof BiomobyActivity); + } + return false; + } + + public VisitReport visit(Object o, List<Object> ancestors) { + Activity activity = (Activity) o; + BiomobyActivityConfigurationBean configuration = null; + if (activity instanceof BiomobyActivity) { + configuration = (BiomobyActivityConfigurationBean) activity.getConfiguration(); + } else if (activity instanceof DisabledActivity) { + configuration = (BiomobyActivityConfigurationBean) ((DisabledActivity) activity).getActivityConfiguration(); + } + return contactEndpoint(activity, configuration.getMobyEndpoint()); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyCache.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyCache.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyCache.java new file mode 100644 index 0000000..288e654 --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyCache.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ + +package net.sf.taverna.t2.activities.biomoby; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.biomoby.client.CentralDigestCachedImpl; +import org.biomoby.client.CentralImpl; +import org.biomoby.registry.meta.Registry; +import org.biomoby.shared.Central; +import org.biomoby.shared.MobyDataType; +import org.biomoby.shared.MobyException; +import org.biomoby.shared.MobyNamespace; + +/** + * A utility class that handles triggering JMoby to cache for a given {@link Registry} for a given registry + * + * @author Stuart Owen + * @author Eddie Kawas + */ + +public class BiomobyCache { + + private static Logger logger = Logger.getLogger(BiomobyCache.class); + + private static Map<String,Object> cached = new HashMap<String, Object>(); + + /** + * If necessary caches the Ontology and namespace information. + * This call immediately returns if the cache has been previously called for this endpoint + * + * @param reg - the Registry instance + * + */ + public static synchronized void cacheForRegistry(Registry reg) { + if (cached.get(reg.getEndpoint()) == null) { + logger.info("Caching started for Biomoby registry" + + reg.getEndpoint()); + + Central c; + try { + c = CentralImpl.getDefaultCentral(reg); + if (c instanceof CentralDigestCachedImpl) + ((CentralDigestCachedImpl) c) + .updateCache(CentralDigestCachedImpl.CACHE_PART_DATATYPES); + MobyDataType.getDataType("Object", reg); + MobyNamespace.getNamespace("foo", reg); + + cached.put(reg.getEndpoint(), new Boolean(true)); + logger.info("Caching complete for Biomoby registry" + + reg.getEndpoint()); + + } catch (MobyException e) { + logger.error("Error whilst caching for Biomoby registry",e); + } + + } + } + + /** + * If necessary caches the Ontology and namespace information. + * This call immediately returns if the cache has been previously called for this endpoint url. + * + * @param endpointUrl - the Registry endpoint Url + * + */ + public static synchronized void cacheForRegistryEndpoint(String endpointUrl) { + Registry registry = new Registry(endpointUrl, endpointUrl, + "http://domain.com/MOBY/Central"); + cacheForRegistry(registry); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivity.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivity.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivity.java new file mode 100644 index 0000000..41e8c4f --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivity.java @@ -0,0 +1,545 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import net.sf.taverna.t2.annotation.annotationbeans.MimeType; +import net.sf.taverna.t2.reference.ExternalReferenceSPI; +import net.sf.taverna.t2.reference.ReferenceService; +import net.sf.taverna.t2.reference.T2Reference; +import net.sf.taverna.t2.workflowmodel.EditException; +import net.sf.taverna.t2.workflowmodel.OutputPort; +import net.sf.taverna.t2.workflowmodel.processor.activity.AbstractAsynchronousActivity; +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityConfigurationException; +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityInputPort; +import net.sf.taverna.t2.workflowmodel.processor.activity.AsynchronousActivityCallback; + +import org.apache.log4j.Logger; +import org.biomoby.client.CentralImpl; +import org.biomoby.registry.meta.Registry; +import org.biomoby.shared.Central; +import org.biomoby.shared.MobyDataType; +import org.biomoby.shared.MobyException; +import org.biomoby.shared.MobyNamespace; +import org.biomoby.shared.MobyRelationship; +import org.biomoby.shared.NoSuccessException; +import org.biomoby.shared.data.MobyDataBoolean; +import org.biomoby.shared.data.MobyDataComposite; +import org.biomoby.shared.data.MobyDataDateTime; +import org.biomoby.shared.data.MobyDataFloat; +import org.biomoby.shared.data.MobyDataInstance; +import org.biomoby.shared.data.MobyDataInt; +import org.biomoby.shared.data.MobyDataString; +import org.jdom.Element; + +/** + * An Activity providing Biomoby Object functionality. + * + * Copied from org.biomoby.client.taverna.plugin.BiomobyObjectProcessor and + * org.biomoby.client.taverna.plugin.BiomobyObjectTask and converted to a Taverna 2 + * Activity. + * + * @author Edward Kawas + * @author David Withers + */ +public class BiomobyObjectActivity extends AbstractAsynchronousActivity<BiomobyObjectActivityConfigurationBean> { + + public static final String URI = "http://ns.taverna.org.uk/2010/activity/biomoby/object"; + + private static Logger logger = Logger.getLogger(BiomobyObjectActivity.class); + + private BiomobyObjectActivityConfigurationBean configurationBean = new BiomobyObjectActivityConfigurationBean(); + + private Central worker = null; + + private MobyDataType mobyObject = null; + + @Override + public void configure(BiomobyObjectActivityConfigurationBean configurationBean) throws ActivityConfigurationException { + this.configurationBean = configurationBean; + init(); + generatePorts(); + } + + @Override + public void executeAsynch(final Map<String, T2Reference> data, + final AsynchronousActivityCallback callback) { + callback.requestRun(new Runnable() { + + public void run() { + ReferenceService referenceService = callback.getContext().getReferenceService(); + + Map<String, T2Reference> outputMap = new HashMap<String, T2Reference>(); + + // initialize the namespace and id fields + String namespace = ""; + String id = ""; + String article = ""; + boolean isPrimitiveType = getInputPort("value")!=null; + String objectName = configurationBean.getServiceName(); + // would like to use the MobyObjectClass to generate a skeleton + + String registryEndpoint = worker.getRegistryEndpoint(); + Registry mRegistry = new Registry(registryEndpoint,registryEndpoint,"http://domain.com/MOBY/Central"); + + BiomobyCache.cacheForRegistry(mRegistry); + + if (isPrimitiveType) { + try { + + T2Reference inputId; + try { + inputId = data.get("namespace"); + namespace = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + try { + inputId = data.get("id"); + id = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + try { + inputId = data.get("article name"); + article = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + inputId = data.get("value"); + String value = null; + try { + value = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } + catch(NullPointerException e) { + //means the value hasn't been set and is handled below + } + + if (objectName.equals("String")) { + if (value == null) { + value = ""; + } + MobyDataString d = new MobyDataString(value,mRegistry); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } else if (objectName.equals("Float")) { + if (value == null || value.trim().equals("")) { + MobyDataComposite d = new MobyDataComposite( + MobyDataType.getDataType("Float", mRegistry)); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } else { + MobyDataFloat d = new MobyDataFloat(value,mRegistry); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } + } else if (objectName.equals("Integer")) { + + try { + int val = 0; + val = Integer.parseInt(value); + MobyDataInt d = new MobyDataInt(val,mRegistry); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } catch (Exception e) { + MobyDataComposite d = new MobyDataComposite( + MobyDataType.getDataType("Integer", mRegistry)); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } + }else if (objectName.equals("Boolean")) { + if (value == null || value.trim().equals("")) { + MobyDataComposite d = new MobyDataComposite(MobyDataType.getDataType("Boolean", mRegistry)); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } else { + MobyDataBoolean d = new MobyDataBoolean(value,mRegistry); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } + } else if (objectName.equals("DateTime")) { + if (value == null || value.trim().equals("")) { + MobyDataComposite d = new MobyDataComposite(MobyDataType.getDataType("DateTime", mRegistry)); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } else { + MobyDataDateTime d = new MobyDataDateTime("", value,mRegistry); + d.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + d.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + d.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + outputMap.put("mobyData", referenceService.register(XMLUtilities.createMobyDataElementWrapper( + "<Simple articleName=\""+article+"\">" + d.toXML() +"</Simple>" ), 0, true, callback.getContext())); + } + } + callback.receiveResult(outputMap, new int[0]); + } catch (Exception ex) { + // details of other exceptions will appear only in a log + logger.error("Error creating biomoby object for biomoby", ex); + callback.fail("Service failed due to problem creating biomoby object (see details in log)", ex); + } + } else { + // Situation where simples are feeding into this non primitive type + try { + T2Reference inputId; + try { + inputId = data.get("namespace"); + namespace = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + try { + inputId = data.get("id"); + id = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + try { + inputId = data.get("article name"); + article = (String) referenceService.renderIdentifier(inputId, String.class, callback.getContext()); + } catch (Exception e) { + } + + //Element mobyObjectElement = mo.createObject(objectName,namespace, id, article); + + MobyDataComposite composite = new MobyDataComposite(MobyDataType.getDataType(objectName, mRegistry)); + composite.setId(id); + MobyNamespace mNamespace = MobyNamespace.getNamespace(namespace,mRegistry); + if (mNamespace != null) + composite.setPrimaryNamespace(MobyNamespace.getNamespace(namespace,mRegistry)); + composite.setXmlMode(MobyDataInstance.SERVICE_XML_MODE); + + // Element mobyObjectElement = XMLUtilities.getDOMDocument(XMLUtilities.createMobyDataElementWrapper( "<Simple articleName=\""+article+"\">" + composite.toXML() +"</Simple>" )).detachRootElement(); + Element mobyObjectElement = XMLUtilities.getDOMDocument(( composite.toXML() )).detachRootElement(); + + // using the inputs, iterate through and fill in data + for (ActivityInputPort inputPort : getInputPorts()) { + String portName = inputPort.getName(); + if (!(portName.equalsIgnoreCase("namespace") + || portName.equalsIgnoreCase("id") || portName + .equalsIgnoreCase("article name"))) { + String type = portName.substring(0, portName + .indexOf("(")); + String articleName = portName.substring( + type.length() + 1, portName.length() - 1); + inputId = null; + try { + inputId = data.get(portName); + } catch (Exception e) { + + } + if (inputId != null) { + String value = (String) referenceService.renderIdentifier(inputId, inputPort.getTranslatedElementClass(), callback.getContext()); + Element valueElement = (XMLUtilities.getDOMDocument(value)).getRootElement(); + if (valueElement.getChild("mobyContent",XMLUtilities.MOBY_NS) != null) { + valueElement = valueElement.getChild("mobyContent",XMLUtilities.MOBY_NS); + } else { + valueElement = valueElement.getChild("mobyContent"); + } + if (valueElement.getChild("mobyData",XMLUtilities.MOBY_NS) != null ) { + valueElement = valueElement.getChild("mobyData",XMLUtilities.MOBY_NS); + } else { + valueElement = valueElement.getChild("mobyData"); + } + if (valueElement.getChild("Simple",XMLUtilities.MOBY_NS) != null ) { + valueElement = valueElement.getChild("Simple",XMLUtilities.MOBY_NS); + } else { + valueElement = valueElement.getChild("Simple"); + } + if (valueElement.getChild(type,XMLUtilities.MOBY_NS) != null ) { + valueElement = valueElement.getChild(type,XMLUtilities.MOBY_NS); + } else { + valueElement = valueElement.getChild(type); + } + // Element _child = mo.getObject(mobyObjectElement,type, articleName); + + valueElement.removeAttribute("articleName"); + valueElement.removeAttribute("articleName", XMLUtilities.MOBY_NS); + valueElement.setAttribute("articleName", articleName, XMLUtilities.MOBY_NS); +// Element _newChild = mo.createObject(type, _ns, _id, +// articleName); +// _newChild.setText(valueElement +// .getText()); +// _newChild.addContent(_child.cloneContent()); + // import and replace the node + // mobyObjectElement.removeContent(_child); + mobyObjectElement.addContent(valueElement.detach()); + } + } + } + Element simple = new Element("Simple", XMLUtilities.MOBY_NS); + simple.setAttribute("articleName", article, XMLUtilities.MOBY_NS); + simple.addContent(mobyObjectElement); + + org.jdom.output.XMLOutputter outputter = new org.jdom.output.XMLOutputter(org.jdom.output.Format.getPrettyFormat()); + String mobyDataString = outputter.outputString(XMLUtilities.createMobyDataElementWrapper(simple)); + outputMap.put("mobyData", referenceService.register(mobyDataString, 0, true, callback.getContext())); + + callback.receiveResult(outputMap, new int[0]); + } catch (Exception ex) { + // details of other exceptions will appear only in a log + logger.error("Error creating biomoby object for biomoby", ex); + callback.fail("Service failed due to problem creating biomoby object (see details in log)", ex); + } + } + } + }); + + } + + @Override + public BiomobyObjectActivityConfigurationBean getConfiguration() { + return configurationBean; + } + + private void init() throws ActivityConfigurationException { + // Find the service endpoint (by calling Moby registry) + try { + if (mobyObject == null) { + worker = new CentralImpl(configurationBean.getMobyEndpoint()); + mobyObject = worker.getDataType(configurationBean.getServiceName()); + } + + } catch (Exception e) { + if (e instanceof ActivityConfigurationException) { + throw (ActivityConfigurationException) e; + } + throw new ActivityConfigurationException(formatError(e.toString())); + } + // here we make sure that we have downloaded the ontology for the + // registry that we got this service from + try { + new GetOntologyThread(worker.getRegistryEndpoint()).start(); + } catch (Exception e) { + /* don't care if an exception occurs here ... */ + } + } + + private void generatePorts() { + removeInputs(); + removeOutputs(); + + //inputs + addInput("namespace", 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + + addInput("id", 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + + addInput("article name", 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + + try { + String serviceName = configurationBean.getServiceName(); + MobyDataType datatype = worker.getDataType(serviceName); + MobyRelationship[] relations = datatype.getChildren(); + processRelationships(relations); + String parent = "Object"; + try { + parent = datatype.getParentNames()[0]; + if (parent.indexOf(":") > 0) { + parent = parent.substring(parent.lastIndexOf(":") + 1); + } + } catch (ArrayIndexOutOfBoundsException e) { + // parent is then by default object + } + if (parent.equalsIgnoreCase("String") + || parent.equalsIgnoreCase("Integer") + || parent.equalsIgnoreCase("float") + || parent.equalsIgnoreCase("DateTime") + || parent.equalsIgnoreCase("Boolean") + || serviceName.equalsIgnoreCase("String") + || serviceName.equalsIgnoreCase("Boolean") + || serviceName.equalsIgnoreCase("Integer") + || serviceName.equalsIgnoreCase("float") + || serviceName.equalsIgnoreCase("DateTime")) { + addInput("value", 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + } else { + if (!parent.equalsIgnoreCase("Object")) + extractParentContainerRelationships(parent); + } + } catch (MobyException e) { + } catch (NoSuccessException e) { + } + + //outputs + addOutput("mobyData", 0, "text/xml"); + } + + private void extractParentContainerRelationships(String string) { + try { + MobyDataType datatype = worker.getDataType(string); + // need to propagate the isa up to Object to get all of the has/hasa + MobyRelationship[] relations = datatype.getChildren(); + processRelationships(relations); + String parent = "Object"; + try { + parent = datatype.getParentNames()[0]; + if (parent.indexOf(":") > 0) { + parent = parent.substring(parent.lastIndexOf(":") + 1); + } + } catch (ArrayIndexOutOfBoundsException e) { + // parent is then by default object + } + String serviceName = configurationBean.getServiceName(); + if (parent.equalsIgnoreCase("String") + || parent.equalsIgnoreCase("Integer") + || parent.equalsIgnoreCase("float") + || serviceName.equalsIgnoreCase("String") + || parent.equalsIgnoreCase("Boolean") + || serviceName.equalsIgnoreCase("Boolean") + || serviceName.equalsIgnoreCase("Integer") + || serviceName.equalsIgnoreCase("float")) { + addInput("value", 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + } else { + if (!parent.equalsIgnoreCase("Object")) + extractParentContainerRelationships(parent); + } + } catch (MobyException e) { + } catch (NoSuccessException e) { + } + } + + private void processRelationships(MobyRelationship[] relations) { + for (int x = 0; x < relations.length; x++) { + MobyRelationship relationship = relations[x]; + + // strip urn:lsid:... + String name = relationship.getDataTypeName(); + if (name.indexOf(":") > 0) { + name = name.substring(name.lastIndexOf(":") + 1); + } + // port name == DataType(articleName) + name = name + "(" + relationship.getName() + ")"; + switch (relationship.getRelationshipType()) { + case (Central.iHAS): { + // TODO - not really supported + addInput(name, 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + break; + } + case (Central.iHASA): { + addInput(name, 0, true, + new ArrayList<Class<? extends ExternalReferenceSPI>>(), + String.class); + break; + } + default: + break; + } + } + } + + + protected String formatError(String msg) { + // Removed references to the authority, some errors + // were causing it to be null which in turn threw + // a NPE from here, breaking Taverna's error handlers + return ("Problems with service '" + configurationBean.getServiceName() + + "' provided by authority '" + + configurationBean.getAuthorityName() + + "'\nfrom Moby registry at " + + configurationBean.getMobyEndpoint() + ":\n\n" + msg); + } + + protected ActivityInputPort getInputPort(String name) { + for (ActivityInputPort port : getInputPorts()) { + if (port.getName().equals(name)) { + return port; + } + } + return null; + } + + protected OutputPort getOutputPort(String name) { + for (OutputPort port : getOutputPorts()) { + if (port.getName().equals(name)) { + return port; + } + } + return null; + } + + protected void addOutput(String portName, int portDepth, String type) { + OutputPort port = edits.createActivityOutputPort( + portName, portDepth, portDepth); + MimeType mimeType = new MimeType(); + mimeType.setText(type); + try { + edits.getAddAnnotationChainEdit(port, mimeType).doEdit(); + } catch (EditException e) { + logger.debug("Error adding MimeType annotation to port", e); + } + outputPorts.add(port); + } + + public Central getCentral() { + if (worker != null) + return worker; + else + try { + return new CentralImpl(getConfiguration().getMobyEndpoint()); + } catch (MobyException e) { + return null; + } + } + + public MobyDataType getMobyObject() { + return mobyObject; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityConfigurationBean.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityConfigurationBean.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityConfigurationBean.java new file mode 100644 index 0000000..ab26b32 --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityConfigurationBean.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * This file is a component of the Taverna project, and is licensed under the + * GNU LGPL. Copyright Edward Kawas, The BioMoby Project + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean; +import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty; + +/** + * A configuration bean specific to the Biomoby Object activity. + * + * @author David Withers + */ +@ConfigurationBean(uri = BiomobyObjectActivity.URI + "#Config") +public class BiomobyObjectActivityConfigurationBean { + + private String mobyEndpoint=""; + + private String serviceName=""; + + private String authorityName=""; + + /** + * Returns the mobyEndpoint. + * + * @return the mobyEndpoint + */ + public String getMobyEndpoint() { + return mobyEndpoint; + } + + /** + * Sets the mobyEndpoint. + * + * @param mobyEndpoint the new mobyEndpoint + */ + @ConfigurationProperty(name = "mobyEndpoint", label = "Moby Endpoint", description = "") + public void setMobyEndpoint(String mobyEndpoint) { + this.mobyEndpoint = mobyEndpoint; + } + + /** + * Returns the serviceName. + * + * @return the serviceName + */ + public String getServiceName() { + return serviceName; + } + + /** + * Sets the serviceName. + * + * @param serviceName the new serviceName + */ + @ConfigurationProperty(name = "serviceName", label = "Service Name", description = "") + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + /** + * Returns the authorityName. + * + * @return the authorityName + */ + public String getAuthorityName() { + return authorityName; + } + + /** + * Sets the authorityName. + * + * @param authorityName the new authorityName + */ + @ConfigurationProperty(name = "authorityName", label = "Authority Name", description = "") + public void setAuthorityName(String authorityName) { + this.authorityName = authorityName; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/709e8c1c/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityFactory.java ---------------------------------------------------------------------- diff --git a/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityFactory.java b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityFactory.java new file mode 100644 index 0000000..955b808 --- /dev/null +++ b/taverna-biomoby-activity/src/main/java/net/sf/taverna/t2/activities/biomoby/BiomobyObjectActivityFactory.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (C) 2011 The University of Manchester + * + * Modifications to the initial code base are copyright of their + * respective authors, or their employers as appropriate. + * + * This program 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 2.1 of + * the License, or (at your option) any later version. + * + * This program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + ******************************************************************************/ +package net.sf.taverna.t2.activities.biomoby; + +import java.net.URI; + +import net.sf.taverna.t2.workflowmodel.processor.activity.ActivityFactory; + +/** + * An {@link ActivityFactory} for creating <code>BiomobyObjectActivity</code>. + * + * @author David Withers + */ +public class BiomobyObjectActivityFactory implements ActivityFactory { + + @Override + public BiomobyObjectActivity createActivity() { + return new BiomobyObjectActivity(); + } + + @Override + public URI getActivityURI() { + return URI.create(BiomobyObjectActivity.URI); + } + + @Override + public Object createActivityConfiguration() { + return new BiomobyObjectActivityConfigurationBean(); + } + +}