@Override public void setParent(Workflow parent) { if (this.parent != null && this.parent != parent) this.parent.getControlLinks().remove(this); this.parent = parent; if (parent != null) parent.getControlLinks().add(this); }
@SuppressWarnings("unchecked") public List<BlockingControlLink> controlLinksBlocking(Processor blocked) { List<BlockingControlLink> controlLinks = new ArrayList<>(); for (ControlLink link : blocked.getParent().getControlLinks()) { if (!(link instanceof BlockingControlLink)) continue; BlockingControlLink blockingControlLink = (BlockingControlLink) link; if (blockingControlLink.getBlock().equals(blocked)) controlLinks.add(blockingControlLink); } Collections.sort(controlLinks); return controlLinks; }
@SuppressWarnings("unchecked") public List<BlockingControlLink> controlLinksWaitingFor( Processor untilFinished) { List<BlockingControlLink> controlLinks = new ArrayList<>(); for (ControlLink link : untilFinished.getParent().getControlLinks()) { if (!(link instanceof BlockingControlLink)) continue; BlockingControlLink blockingControlLink = (BlockingControlLink) link; if (blockingControlLink.getUntilFinished().equals(untilFinished)) controlLinks.add(blockingControlLink); } Collections.sort(controlLinks); return controlLinks; }
@Override public boolean accept(Visitor visitor) { if (visitor.visitEnter(this)) { List<WorkflowBean> children = new ArrayList<>(); children.addAll(getInputPorts()); children.addAll(getOutputPorts()); children.addAll(getProcessors()); children.addAll(getDataLinks()); children.addAll(getControlLinks()); children.add(getCurrentRevision()); for (WorkflowBean bean : children) if (!bean.accept(visitor)) break; } return visitor.visitLeave(this); }
@Override public void visitWorkflow(Workflow bean) { Set<DataLink> dataLinks = bean.getDataLinks(); Set<ControlLink> controlLinks = bean.getControlLinks(); // ports are done in Ported NamedSet<Processor> processors = bean.getProcessors(); URI workflowIdentifier = bean.getIdentifier(); if (workflowIdentifier != null) { if (!workflowIdentifier.isAbsolute()) listener.nonAbsoluteURI(bean, "workflowIdentifier", workflowIdentifier); else if (workflowIdentifier.getScheme().equals("file")) listener.nonAbsoluteURI(bean, "workflowIdentifier", workflowIdentifier); } if (checkComplete) { if (dataLinks == null) listener.nullField(bean, "dataLinks"); if (controlLinks == null) listener.nullField(bean, "controlLinks"); if (processors == null) listener.nullField(bean, "processors"); if (workflowIdentifier == null) listener.nullField(bean, "workflowIdentifier"); } }
@Test public void uriForControlLink() throws Exception { Processor hello = wfBundle.getMainWorkflow().getProcessors() .getByName("Hello"); assertNotNull(hello); ControlLink condition = wfBundle.getMainWorkflow().getControlLinks() .iterator().next(); assertTrue(condition instanceof BlockingControlLink); URI uri = uriTools.uriForBean(condition); assertEquals( HELLOWORLD_URI + "control?block=processor/Hello/&untilFinished=processor/wait4me/", uri.toASCIIString()); }
@Test public void controlLinksBlocking() { Processor hello = workflowBundle.getMainWorkflow().getProcessors() .getByName("Hello"); Processor wait4me = workflowBundle.getMainWorkflow().getProcessors() .getByName("wait4me"); ControlLink controlLink = workflowBundle.getMainWorkflow().getControlLinks() .iterator().next(); assertEquals(Collections.singletonList(controlLink), scufl2Tools.controlLinksBlocking(hello)); assertTrue(scufl2Tools.controlLinksBlocking(wait4me).isEmpty()); }
@Test public void controlLinksWaitingFor() { Processor hello = workflowBundle.getMainWorkflow().getProcessors() .getByName("Hello"); Processor wait4me = workflowBundle.getMainWorkflow().getProcessors() .getByName("wait4me"); ControlLink controlLink = workflowBundle.getMainWorkflow().getControlLinks() .iterator().next(); assertEquals(Collections.singletonList(controlLink), scufl2Tools.controlLinksWaitingFor(wait4me)); assertTrue(scufl2Tools.controlLinksWaitingFor(hello).isEmpty()); }
@SuppressWarnings("unchecked") @Test public void expectedOrder() throws Exception { Workflow wf = new Workflow(); wf.setName("wf"); Processor a = new Processor(wf, "a"); Processor b = new Processor(wf, "b"); Processor c = new Processor(wf, "c"); Processor d = new Processor(wf, "d"); BlockingControlLink b_blocks_c = new BlockingControlLink(c, b); BlockingControlLink a_blocks_c = new BlockingControlLink(c, a); BlockingControlLink a_blocks_b = new BlockingControlLink(b, a); BlockingControlLink b_blocks_d = new BlockingControlLink(d, b); BlockingControlLink a_blocks_d = new BlockingControlLink(d, a); ArrayList<ControlLink> links = new ArrayList<ControlLink>(wf.getControlLinks()); assertEquals(Arrays.asList(a_blocks_b, a_blocks_c, a_blocks_d, b_blocks_c, b_blocks_d), links); Collections.shuffle(links); Collections.sort(links); assertEquals(Arrays.asList(a_blocks_b, a_blocks_c, a_blocks_d, b_blocks_c, b_blocks_d), links); }
@Test public void readControlLinks() throws Exception { URL wfResource = getClass().getResource(SLEEPERS_T2FLOW); assertNotNull("Could not find workflow " + SLEEPERS_T2FLOW, wfResource); T2FlowParser parser = new T2FlowParser(); parser.setStrict(true); WorkflowBundle bundle = parser.parseT2Flow(wfResource.openStream()); Workflow mainWorkflow = bundle.getMainWorkflow(); NamedSet<Processor> processors = mainWorkflow.getProcessors(); assertEquals(4, mainWorkflow.getControlLinks().size()); List<BlockingControlLink> blocking2 = scufl2Tools.controlLinksBlocking(processors.getByName("second_sleeper")); assertEquals(1, blocking2.size()); assertEquals("first_sleeper", blocking2.get(0).getUntilFinished().getName()); List<BlockingControlLink> waiting2 = scufl2Tools.controlLinksWaitingFor(processors.getByName("second_sleeper")); assertEquals(1, waiting2.size()); assertEquals("third_sleeper", waiting2.get(0).getBlock().getName()); List<BlockingControlLink> blocking3 = scufl2Tools.controlLinksBlocking(processors.getByName("third_sleeper")); assertEquals(2, blocking3.size()); assertEquals("second_sleeper", blocking3.get(0).getUntilFinished().getName()); assertEquals("second_sleeper_2", blocking3.get(1).getUntilFinished().getName()); }
ArrayList<ControlLink> links = new ArrayList<ControlLink>(wf.getControlLinks()); assertEquals(Arrays.asList(null_blocks_null, null_blocks_c, a_blocks_b, b_blocks_null, b_blocks_c), links);
if (!wf.getControlLinks().isEmpty()) { newLine(2); append("Controls"); List<ControlLink> controlLinks = new ArrayList<>(wf.getControlLinks()); Collections.sort(controlLinks); for (ControlLink controlLink : controlLinks) {