@Override protected void cloneInto(WorkflowBean clone, Cloning cloning) { DataLink cloneLink = (DataLink)clone; cloneLink.setMergePosition(getMergePosition()); cloneLink.setReceivesFrom(cloning.cloneIfNotInCache(getReceivesFrom())); cloneLink.setSendsTo(cloning.cloneIfNotInCache(getSendsTo())); }
/** * Constructs a <code>DataLink</code> with the specified parent {@link Workflow} that connects * the specified {@link SenderPort} and {@link ReceiverPort}. * * @param parent * the <code>Workflow</code> to set as the <code>DataLink</code>'s parent. Can be * <code>null</code>. * @param senderPort * the <code>SenderPort</code> that the <code>DataLink</code> receives data from. Can * be <code>null</code>. * @param receiverPort * the <code>ReceiverPort</code> that the <code>DataLink</code> sends data to. Can be * <code>null</code>. */ public DataLink(Workflow parent, SenderPort senderPort, ReceiverPort receiverPort) { setReceivesFrom(senderPort); setSendsTo(receiverPort); setParent(parent); }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (getSendsTo() == null ? 0 : getSendsTo().hashCode()); result = prime * result + (getReceivesFrom() == null ? 0 : getReceivesFrom().hashCode()); return result; }
protected void parseDataLink(DataLink original) { URI fromUri = getParserState().getCurrentBase().resolve( original.getReceiveFrom().getResource()); URI toUri = getParserState().getCurrentBase().resolve( original.getSendTo().getResource()); WorkflowBean from = resolveBeanUri(fromUri); WorkflowBean to = resolveBeanUri(toUri); uk.org.taverna.scufl2.api.core.DataLink link = new uk.org.taverna.scufl2.api.core.DataLink(); link.setReceivesFrom((SenderPort) from); link.setSendsTo((ReceiverPort) to); if (original.getMergePosition() != null) { link.setMergePosition(original.getMergePosition().getValue()); } link.setParent(getParserState().getCurrent(Workflow.class)); mapBean(getParserState().getCurrentBase().resolve(original.getAbout()), link); }
@Override public void visitDataLink(DataLink bean) { ReceiverPort sendsTo = bean.getSendsTo(); SenderPort receivesFrom = bean.getReceivesFrom(); Workflow parent = bean.getParent(); if (sendsTo != null) { Workflow sendsToWorkflow = findAncestral((Child) sendsTo, Integer mergePosition = bean.getMergePosition(); if (mergePosition != null) { if (mergePosition < 0) {
if (getSendsTo() == null) { if (other.getSendsTo() != null) { return false; } else if (!getSendsTo().equals(other.getSendsTo())) { return false; if (getReceivesFrom() == null) { if (other.getReceivesFrom() != null) { return false; } else if (!getReceivesFrom().equals(other.getReceivesFrom())) { return false; if (getMergePosition() == null) { if (other.getMergePosition() != null) { return false; } else if (!getMergePosition().equals(other.getMergePosition())) { return false;
@Override public int compareTo(Object other) { if (getClass() != other.getClass()) { int classCompare = getClass().getCanonicalName().compareTo( other.getClass().getCanonicalName()); if (classCompare != 0) { // Allow having say InputPorts and OutputPorts in the same sorted list return classCompare; } } DataLink o1 = this; DataLink o2 = (DataLink) other; int senderCompare = portCompare(o1.getReceivesFrom(), o2.getReceivesFrom()); if (senderCompare != 0) { return senderCompare; } int receiverCompare = portCompare(o1.getSendsTo(), o2.getSendsTo()); if (receiverCompare != 0) { return receiverCompare; } return NullSafeComparator.compareObjects(o1.getMergePosition(), o2.getMergePosition()); }
public Workflow makeMainWorkflow() { workflow = new Workflow(); workflow.setName("HelloWorld"); // NOTE: setWorkflowIdentifier should only be called when loading a // workflow // which already has an ID workflow.setIdentifier(URI .create("http://ns.taverna.org.uk/2010/workflow/00626652-55ae-4a9e-80d4-c8e9ac84e2ca/")); InputWorkflowPort yourName = new InputWorkflowPort(workflow, "yourName"); yourName.setDepth(0); OutputWorkflowPort results = new OutputWorkflowPort(workflow, "results"); // Not needed: // workflow.getInputPorts().add(yourName); // workflow.getOutputPorts().add(results); workflow.getProcessors().add(makeProcessor()); workflow.getProcessors().add(makeProcessor2()); // Make links DataLink directLink = new DataLink(workflow, yourName, results); directLink.setMergePosition(1); DataLink greetingLink = new DataLink(workflow, processorGreeting, results); greetingLink.setMergePosition(0); nameLink = new DataLink(workflow, yourName, processorName); condition = new BlockingControlLink(processor, wait4me); return workflow; }
@Test public void testCorrectnessOfMissingSendsTo() { DataLink dataLink = new DataLink(); InputWorkflowPort iwp = new InputWorkflowPort(); dataLink.setReceivesFrom(iwp); CorrectnessValidator cv = new CorrectnessValidator(); ReportCorrectnessValidationListener rcvl = new ReportCorrectnessValidationListener(); cv.checkCorrectness(dataLink, false, rcvl); Set<NullFieldProblem> nullFieldProblems = rcvl.getNullFieldProblems(); assertEquals(0, nullFieldProblems.size()); // only done when completeness check }
@Test public void testCorrectnessOfMissingReceivesFrom() { DataLink dataLink = new DataLink(); OutputWorkflowPort owp = new OutputWorkflowPort(); dataLink.setSendsTo(owp); CorrectnessValidator cv = new CorrectnessValidator(); ReportCorrectnessValidationListener rcvl = new ReportCorrectnessValidationListener(); cv.checkCorrectness(dataLink, false, rcvl); Set<NullFieldProblem> nullFieldProblems = rcvl.getNullFieldProblems(); assertEquals(0, nullFieldProblems.size()); // only done when completeness check }
@SuppressWarnings("unchecked") @Test public void expectedOrder() throws Exception { Workflow wf = new Workflow(); wf.setName("wf"); InputWorkflowPort a = new InputWorkflowPort(wf, "a"); InputWorkflowPort b = new InputWorkflowPort(wf, "b"); InputWorkflowPort c = new InputWorkflowPort(wf, "c"); OutputWorkflowPort x = new OutputWorkflowPort(wf, "x"); OutputWorkflowPort y = new OutputWorkflowPort(wf, "y"); OutputWorkflowPort z = new OutputWorkflowPort(wf, "z"); DataLink c_x = new DataLink(wf, c, x); DataLink b_x = new DataLink(wf, b, x); DataLink b_z = new DataLink(wf, b, z); DataLink a_z = new DataLink(wf, a, z); DataLink a_x = new DataLink(wf, a, x); ArrayList<DataLink> links = new ArrayList<DataLink>(wf.getDataLinks()); assertEquals(Arrays.asList(a_x, a_z, b_x, b_z, c_x), links); Collections.shuffle(links); Collections.sort(links); assertEquals(Arrays.asList(a_x, a_z, b_x, b_z, c_x), links); }
public void rememberDataLinkSender(DataLink dl) { SenderPort sender = dl.getReceivesFrom(); if (sender != null) { if (!senderDataLinkMap.containsKey(sender)) { senderDataLinkMap.put(sender, new ArrayList<DataLink>()); } senderDataLinkMap.get(sender).add(dl); } }
public void rememberDataLinkReceiver(DataLink dl) { ReceiverPort receiver = dl.getSendsTo(); if (receiver != null) { if (!receiverDataLinkMap.containsKey(receiver)) { receiverDataLinkMap.put(receiver, new ArrayList<DataLink>()); } receiverDataLinkMap.get(receiver).add(dl); } }
public DataLink getMainIncomingDataLink(ReceiverPort rp) { List<DataLink> incomingLinks = getIncomingDataLinks(rp); if (incomingLinks.isEmpty()) { return null; } if (incomingLinks.size() == 1) { return incomingLinks.get(0); } for (DataLink dl : incomingLinks) { if (dl.getMergePosition() == 0) { return dl; } } return null; }
@Test public void dataLinkNotAddedTwice() throws Exception { assertEquals(3, workflow.getDataLinks().size()); DataLink dl1 = workflow.getDataLinks().iterator().next(); assertTrue(workflow.getDataLinks().contains(dl1)); workflow.getDataLinks().add(dl1); dl1.setParent(workflow); // This could happen because dataLink.compareTo() calls // .compareTo() on the sender/receiver link, and if // their parents was null at insertion and non-null // later, the TreeSet order got messed up. assertEquals(3, workflow.getDataLinks().size()); }
OutputWorkflowPort z = new OutputWorkflowPort(wf, "z"); DataLink null_null = new DataLink(); null_null.setParent(wf); DataLink null_z = new DataLink(); null_z.setSendsTo(z); null_z.setParent(wf); DataLink a_z = new DataLink(wf, a, z); DataLink a_null = new DataLink(); a_null.setReceivesFrom(a); a_null.setParent(wf); DataLink allNull = new DataLink(); links.add(allNull);
Workflow wf = dataLink.getParent(); URI wfUri = uriForBean(wf); URI receivesFrom = relativePath(wfUri, uriForBean(dataLink.getReceivesFrom())); URI sendsTo = relativePath(wfUri, uriForBean(dataLink.getSendsTo())); String dataLinkUri = MessageFormat.format( "{0}?{1}={2}&{3}={4}", DATALINK, FROM, receivesFrom, TO, sendsTo); if (dataLink.getMergePosition() != null) { dataLinkUri += MessageFormat.format("&{0}={1}", MERGE_POSITION, dataLink.getMergePosition());
link.setAbout(uri.toASCIIString()); URI fromUri = uriTools.relativeUriForBean( dataLink.getReceivesFrom(), wf); URI toUri = uriTools.relativeUriForBean(dataLink.getSendsTo(), wf); link.setReceiveFrom(makeResource(fromUri)); link.setSendTo(makeResource(toUri)); if (dataLink.getMergePosition() != null) { MergePosition value = objectFactory.createDataLinkMergePosition(); value.setValue(dataLink .getMergePosition()); value.setDatatype(value.getDatatype()); link.setMergePosition(value);
@Override public String toString() { return String.format("%s %s=>%s", getClass().getSimpleName(), getReceivesFrom() != null ? getReceivesFrom().getName() : "", getSendsTo() != null ? getSendsTo().getName() : ""); }
OutputWorkflowPort outB = new OutputWorkflowPort(w, "outB"); DataLink aLink = new DataLink(w, a, outA); aLink.setMergePosition(0); DataLink bLink = new DataLink(w, b, outA); bLink.setMergePosition(1); DataLink aLink2 = new DataLink(w, a, outB); aLink2.setMergePosition(1); DataLink bLink2 = new DataLink(w, b, outB); bLink2.setMergePosition(0);