in taverna-scufl2-api/src/main/java/org/apache/taverna/scufl2/api/io/structure/StructureReader.java [113:326]
protected void parseLine(final String nextLine) throws ReaderException {
try (Scanner scanner = new Scanner(nextLine.trim())) {
// In case it is the last line
if (!scanner.hasNext())
return;
// allow any whitespace
String next = scanner.next();
if (next.isEmpty())
return;
switch (next) {
case "WorkflowBundle":
parseWorkflowBundle(scanner);
return;
case "MainWorkflow":
mainWorkflow = parseName(scanner);
return;
case "Workflow":
parseWorkflow(scanner);
return;
case "In":
case "Out":
parsePort(scanner, next);
return;
case "Links":
level = Level.Links;
processor = null;
return;
case "Controls":
level = Level.Controls;
return;
case "MainProfile":
mainProfile = parseName(scanner);
return;
case "Profile":
parseProfile(scanner);
return;
case "Type":
parseType(nextLine);
return;
case "ProcessorBinding":
parseProcessorBinding(scanner);
return;
case "InputPortBindings":
level = Level.InputPortBindings;
return;
case "OutputPortBindings":
level = Level.OutputPortBindings;
return;
case "Configuration":
parseConfiguration(scanner);
return;
case "Configures":
parseConfigures(scanner);
return;
case "Activity":
switch (level) {
case Profile:
case Activity:
level = Level.Activity;
activity = new Activity();
activity.setName(parseName(scanner));
profile.getActivities().add(activity);
return;
case ProcessorBinding:
Activity boundActivity = profile.getActivities().getByName(
parseName(scanner));
processorBinding.setBoundActivity(boundActivity);
return;
default:
break;
}
break;
case "Processor":
switch (level) {
case Workflow:
case Processor:
level = Level.Processor;
processor = new Processor();
processor.setName(parseName(scanner));
processor.setParent(workflow);
workflow.getProcessors().add(processor);
return;
case ProcessorBinding:
String[] wfProcName = parseName(scanner).split(":");
Workflow wf = wb.getWorkflows().getByName(wfProcName[0]);
Processor boundProcessor = wf.getProcessors().getByName(
wfProcName[1]);
processorBinding.setBoundProcessor(boundProcessor);
return;
default:
break;
}
break;
}
if (next.equals("block")) {
Matcher blockMatcher = blockPattern.matcher(nextLine);
blockMatcher.find();
String block = blockMatcher.group(1);
String untilFinish = blockMatcher.group(2);
Processor blockProc = workflow.getProcessors().getByName(block);
Processor untilFinishedProc = workflow.getProcessors()
.getByName(untilFinish);
new BlockingControlLink(blockProc, untilFinishedProc);
}
if (next.startsWith("'") && level.equals(Level.Links)) {
Matcher linkMatcher = linkPattern.matcher(nextLine);
linkMatcher.find();
String firstLink = linkMatcher.group(1);
String secondLink = linkMatcher.group(2);
SenderPort senderPort;
if (firstLink.contains(":")) {
String[] procPort = firstLink.split(":");
Processor proc = workflow.getProcessors().getByName(
procPort[0]);
senderPort = proc.getOutputPorts().getByName(procPort[1]);
} else
senderPort = workflow.getInputPorts().getByName(firstLink);
ReceiverPort receiverPort;
if (secondLink.contains(":")) {
String[] procPort = secondLink.split(":");
Processor proc = workflow.getProcessors().getByName(
procPort[0]);
receiverPort = proc.getInputPorts().getByName(procPort[1]);
} else
receiverPort = workflow.getOutputPorts().getByName(
secondLink);
new DataLink(workflow, senderPort, receiverPort);
return;
}
if (next.startsWith("'")
&& (level == Level.InputPortBindings || level == Level.OutputPortBindings)) {
Matcher linkMatcher = linkPattern.matcher(nextLine);
linkMatcher.find();
String firstLink = linkMatcher.group(1);
String secondLink = linkMatcher.group(2);
if (level == Level.InputPortBindings) {
InputProcessorPort processorPort = processorBinding
.getBoundProcessor().getInputPorts()
.getByName(firstLink);
InputActivityPort activityPort = processorBinding
.getBoundActivity().getInputPorts()
.getByName(secondLink);
new ProcessorInputPortBinding(processorBinding,
processorPort, activityPort);
} else {
OutputActivityPort activityPort = processorBinding
.getBoundActivity().getOutputPorts()
.getByName(firstLink);
OutputProcessorPort processorPort = processorBinding
.getBoundProcessor().getOutputPorts()
.getByName(secondLink);
new ProcessorOutputPortBinding(processorBinding,
activityPort, processorPort);
}
return;
}
if (level == Level.JSON) {
/*
* A silly reader that feeds (no more than) a single line at a
* time from our parent scanner, starting with the current line
*/
Reader reader = new Reader() {
char[] line = nextLine.toCharArray();
int pos = 0;
@Override
public int read(char[] cbuf, int off, int len)
throws IOException {
if (pos >= line.length) {
// Need to read next line to fill buffer
if (!StructureReader.this.scanner.hasNextLine())
return -1;
String newLine = StructureReader.this.scanner
.nextLine();
pos = 0;
line = newLine.toCharArray();
// System.out.println("Read new line: " + newLine);
}
int length = Math.min(len, line.length - pos);
if (length <= 0)
return 0;
arraycopy(line, pos, cbuf, off, length);
pos += length;
return length;
}
@Override
public void close() throws IOException {
line = null;
}
};
ObjectMapper mapper = new ObjectMapper();
try {
JsonParser parser = mapper.getFactory()
.createParser(reader);
JsonNode jsonNode = parser.readValueAs(JsonNode.class);
// System.out.println("Parsed " + jsonNode);
configuration.setJson(jsonNode);
} catch (IOException e) {
throw new ReaderException("Can't parse json", e);
}
level = Level.Configuration;
return;
}
}
}