in jbatch/src/main/java/org/apache/batchee/container/services/factory/DefaultBatchArtifactFactory.java [119:187]
protected void populateArtifactMapFromStream(final ArtifactMap tempMap, final InputStream is) {
final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
try {
final XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(is);
boolean processedRoot = false;
// We are going to take advantage of the simplified structure of a
// line
// E.g.:
// <batch-artifacts>
// <item-processor id=MyItemProcessor class=jsr352/sample/MyItemProcessorImpl/>
// ..
// </batch-artifacts>
//
// and have much simpler logic than general-purpose parsing would
// require.
while (xmlStreamReader.hasNext()) {
int event = xmlStreamReader.next();
// Until we reach end of document
if (event == END_DOCUMENT) {
break;
}
// At this point we have either:
// A) just passed START_DOCUMENT, and are at START_ELEMENT for the root,
// <batch-artifacts>, or
// B) we have just passed END_ELEMENT for one of the artifacts which is a child of
// <batch-artifacts>.
//
// Only handle START_ELEMENT now so we can skip whitespace CHARACTERS events.
//
if (event == START_ELEMENT) {
if (!processedRoot) {
QName rootQName = xmlStreamReader.getName();
if (!rootQName.equals(BATCH_ROOT_ELEM)) {
throw new IllegalStateException("Expecting document with root element QName: " + BATCH_ROOT_ELEM
+ ", but found root element with QName: " + rootQName);
} else {
processedRoot = true;
}
} else {
// Should only need localName
final String annotationShortName = xmlStreamReader.getLocalName();
final String id = xmlStreamReader.getAttributeValue(null, "id");
final String className = xmlStreamReader.getAttributeValue(null, "class");
tempMap.addEntry(annotationShortName, id, className);
// Ignore anything else (text/whitespace) within this
// element
while (event != END_ELEMENT) {
event = xmlStreamReader.next();
}
}
}
}
xmlStreamReader.close();
} catch (final Exception e) {
throw new RuntimeException(e);
} finally {
try {
is.close();
} catch (final IOException e) {
// no-op
}
}
}