Index: src/main/java/org/glassfish/config/support/XMLStreamReaderFilter.java =================================================================== --- src/main/java/org/glassfish/config/support/XMLStreamReaderFilter.java (revision 31270) +++ src/main/java/org/glassfish/config/support/XMLStreamReaderFilter.java (working copy) @@ -36,8 +36,10 @@ */ package org.glassfish.config.support; +import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.XMLEvent; import javax.xml.stream.util.StreamReaderDelegate; /** @@ -63,13 +65,67 @@ public int nextTag() throws XMLStreamException { while(true) { - int r = super.nextTag(); + int r = thisNextTag(); if(r!=START_ELEMENT || !filterOut()) return r; skipTree(); } } + private int thisNextTag() throws XMLStreamException { + int eventType = super.next(); + while((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace()) // skip whitespace + || (eventType == XMLStreamConstants.CDATA && isWhiteSpace()) + // skip whitespace + || eventType == XMLStreamConstants.SPACE + || eventType == XMLStreamConstants.PROCESSING_INSTRUCTION + || eventType == XMLStreamConstants.COMMENT + || eventType == XMLStreamConstants.DTD + ) { + eventType = super.next(); + } + + if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLStreamConstants.END_ELEMENT) { + throw new XMLStreamException( + "found: " + getEventTypeString(eventType) + + ", expected " + getEventTypeString(XMLStreamConstants.START_ELEMENT) + + " or " + getEventTypeString(XMLStreamConstants.END_ELEMENT)); + } + + return eventType; + + } + + final static String getEventTypeString(int eventType) { + switch (eventType){ + case XMLEvent.START_ELEMENT: + return "START_ELEMENT"; + case XMLEvent.END_ELEMENT: + return "END_ELEMENT"; + case XMLEvent.PROCESSING_INSTRUCTION: + return "PROCESSING_INSTRUCTION"; + case XMLEvent.CHARACTERS: + return "CHARACTERS"; + case XMLEvent.COMMENT: + return "COMMENT"; + case XMLEvent.START_DOCUMENT: + return "START_DOCUMENT"; + case XMLEvent.END_DOCUMENT: + return "END_DOCUMENT"; + case XMLEvent.ENTITY_REFERENCE: + return "ENTITY_REFERENCE"; + case XMLEvent.ATTRIBUTE: + return "ATTRIBUTE"; + case XMLEvent.DTD: + return "DTD"; + case XMLEvent.CDATA: + return "CDATA"; + case XMLEvent.SPACE: + return "SPACE"; + } + return "UNKNOWN_EVENT_TYPE, " + String.valueOf(eventType); + } + /** * Skips a whole subtree, and return with the cursor pointing to the end element * of the skipped subtree.