private static Flow parseFlow(final XMLStreamReader reader) throws XMLStreamException { final Flow flow = new Flow(getAttributeValue(reader, XmlAttribute.ID, true)); flow.setAttributeNext(getAttributeValue(reader, XmlAttribute.NEXT, false)); while (reader.hasNext()) { final int eventType = reader.next(); if (eventType != START_ELEMENT && eventType != END_ELEMENT) { continue; } final XmlElement element = XmlElement.forName(reader.getLocalName()); switch (eventType) { case START_ELEMENT: switch (element) { case DECISION: flow.addJobElement(parseDecision(reader)); break; case FLOW: flow.addJobElement(parseFlow(reader)); break; case SPLIT: flow.addJobElement(parseSplit(reader)); break; case STEP: flow.addJobElement(parseStep(reader)); break; case NEXT: if (flow.getAttributeNext() != null) { throw BatchLogger.LOGGER.cannotHaveBothNextAttributeAndElement( reader.getLocation(), flow.getAttributeNext()); } flow.addTransitionElement(parseNext(reader)); break; case FAIL: flow.addTransitionElement(parseFail(reader)); break; case END: flow.addTransitionElement(parseEnd(reader)); break; case STOP: flow.addTransitionElement(parseStop(reader)); break; default: throw BatchLogger.LOGGER.unexpectedXmlElement( reader.getLocalName(), reader.getLocation()); } break; case END_ELEMENT: switch (element) { case FLOW: return flow; default: throw BatchLogger.LOGGER.unexpectedXmlElement( reader.getLocalName(), reader.getLocation()); } } } throw BatchLogger.LOGGER.unexpectedXmlElement(reader.getLocalName(), reader.getLocation()); }