protected void parseLine()

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;
			}
		}
    }