private static Step parseStep(final XMLStreamReader reader) throws XMLStreamException { final Step step = new Step(getAttributeValue(reader, XmlAttribute.ID, true)); step.setStartLimit(getAttributeValue(reader, XmlAttribute.START_LIMIT, false)); step.setAllowStartIfComplete( getAttributeValue(reader, XmlAttribute.ALLOW_START_IF_COMPLETE, false)); step.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 PROPERTIES: step.setProperties(parseProperties(reader)); break; case LISTENERS: step.addListeners(parseListeners(reader)); break; case BATCHLET: step.setBatchlet(parseRefArtifact(reader, XmlElement.BATCHLET)); break; case CHUNK: step.setChunk(parseChunk(reader)); break; case PARTITION: step.setPartition(parsePartition(reader)); break; case NEXT: if (step.getAttributeNext() != null) { throw BatchLogger.LOGGER.cannotHaveBothNextAttributeAndElement( reader.getLocation(), step.getAttributeNext()); } step.addTransitionElement(parseNext(reader)); break; case FAIL: step.addTransitionElement(parseFail(reader)); break; case END: step.addTransitionElement(parseEnd(reader)); break; case STOP: step.addTransitionElement(parseStop(reader)); break; default: throw BatchLogger.LOGGER.unexpectedXmlElement( reader.getLocalName(), reader.getLocation()); } break; case END_ELEMENT: switch (element) { case STEP: return step; default: throw BatchLogger.LOGGER.unexpectedXmlElement( reader.getLocalName(), reader.getLocation()); } } } throw BatchLogger.LOGGER.unexpectedXmlElement(reader.getLocalName(), reader.getLocation()); }