@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); org.apache.taverna.scufl2.api.core.DataLink link = new org.apache.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); }
.getCurrentWorkflow(), origLink.getSink()); DataLink newLink = new DataLink(parserState.get() .getCurrentWorkflow(), senderPort, receiverPort); mergeCounts.put(receiverPort, mergeCount); newLink.setMergePosition(mergeCount.getAndIncrement()); } else { if (mergeCount != null)
@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 }
@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 }
@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 && mergePosition < 0) listener.negativeValue(bean, "mergePosition", mergePosition);
@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; // TODO Don't refer to impl from api? return NullSafeComparator.compareObjects(o1.getMergePosition(), o2.getMergePosition()); }
@SuppressWarnings({ "unchecked", "unused" }) @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); }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DataLink other = (DataLink) obj; 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; } return true; }
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 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); } }
@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()); }
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; }
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);
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 testCompletenessOfMissingReceivesFrom() { DataLink dataLink = new DataLink(); OutputWorkflowPort owp = new OutputWorkflowPort(); dataLink.setSendsTo(owp); CorrectnessValidator cv = new CorrectnessValidator(); ReportCorrectnessValidationListener rcvl = new ReportCorrectnessValidationListener(); cv.checkCorrectness(dataLink, true, rcvl); Set<NullFieldProblem> nullFieldProblems = rcvl.getNullFieldProblems(); assertFalse(nullFieldProblems.isEmpty()); // only done when completeness check boolean fieldProblem = false; for (NullFieldProblem nlp : nullFieldProblems) { if (nlp.getBean().equals(dataLink) && nlp.getFieldName().equals("receivesFrom")) { fieldProblem = true; } } assertTrue(fieldProblem); }
@Test public void testCompletenessOfMissingSendsTo() { DataLink dataLink = new DataLink(); InputWorkflowPort iwp = new InputWorkflowPort(); dataLink.setReceivesFrom(iwp); CorrectnessValidator cv = new CorrectnessValidator(); ReportCorrectnessValidationListener rcvl = new ReportCorrectnessValidationListener(); cv.checkCorrectness(dataLink, true, rcvl); Set<NullFieldProblem> nullFieldProblems = rcvl.getNullFieldProblems(); assertFalse(nullFieldProblems.isEmpty()); // only done when completeness check boolean fieldProblem = false; for (NullFieldProblem nlp : nullFieldProblems) { if (nlp.getBean().equals(dataLink) && nlp.getFieldName().equals("sendsTo")) { fieldProblem = true; } } assertTrue(fieldProblem); }
} else if (bean instanceof DataLink) { DataLink dataLink = (DataLink) bean; 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()); return wfUri.resolve(dataLinkUri); } else if (bean instanceof BlockingControlLink) {