X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frest%2Fimpl%2FXmlReader.java;h=1d6ca15f3c86986d97044b12de645343166226d6;hb=0e7b83c0739ac579ca6dbf6a3f7992f70eb3000f;hp=a75f6b4a85f8277bffa57ad6034abe6bc323f2a0;hpb=e159106bc148e76fc1e3e3c780bdd740d99e74ed;p=controller.git diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java index a75f6b4a85..1d6ca15f3c 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlReader.java @@ -9,17 +9,18 @@ package org.opendaylight.controller.sal.rest.impl; import static com.google.common.base.Preconditions.checkArgument; +import java.io.BufferedInputStream; +import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.util.Stack; - import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; - import org.opendaylight.controller.sal.restconf.impl.CompositeNodeWrapper; import org.opendaylight.controller.sal.restconf.impl.EmptyNodeWrapper; import org.opendaylight.controller.sal.restconf.impl.IdentityValuesDTO; @@ -32,7 +33,17 @@ public class XmlReader { private final static XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); private XMLEventReader eventReader; - public CompositeNodeWrapper read(InputStream entityStream) throws XMLStreamException, UnsupportedFormatException { + public CompositeNodeWrapper read(InputStream entityStream) throws XMLStreamException, + UnsupportedFormatException, + IOException { + //Get an XML stream which can be marked, and reset, so we can check and see if there is + //any content being provided. + entityStream = getMarkableStream(entityStream); + + if( isInputStreamEmpty( entityStream ) ) { + return null; + } + eventReader = xmlInputFactory.createXMLEventReader(entityStream); if (eventReader.hasNext()) { @@ -91,20 +102,37 @@ public class XmlReader { return root; } + /** + * If the input stream is not markable, then it wraps the input stream with a buffered stream, + * which is mark able. That way we can check if the stream is empty safely. + * @param entityStream + * @return + */ + private InputStream getMarkableStream(InputStream entityStream) { + if( !entityStream.markSupported() ) + { + entityStream = new BufferedInputStream( entityStream ); + } + return entityStream; + } + + private boolean isInputStreamEmpty(InputStream entityStream) + throws IOException { + boolean isEmpty = false; + entityStream.mark( 1 ); + if( entityStream.read() == -1 ){ + isEmpty = true; + } + entityStream.reset(); + return isEmpty; + } + private boolean isSimpleNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { - if (eventReader.hasNext()) { - final XMLEvent innerEvent; - innerEvent = eventReader.peek(); - if (innerEvent.isCharacters()) { - final Characters chars = innerEvent.asCharacters(); - if (!chars.isWhiteSpace()) { - return true; - } - } else if (innerEvent.isEndElement()) { - return true; - } + XMLEvent innerEvent = skipCommentsAndWhitespace(); + if ( innerEvent != null && (innerEvent.isCharacters() || innerEvent.isEndElement())) { + return true; } } return false; @@ -113,16 +141,8 @@ public class XmlReader { private boolean isCompositeNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { - if (eventReader.hasNext()) { - XMLEvent innerEvent; - innerEvent = eventReader.peek(); - if (innerEvent.isCharacters()) { - Characters chars = innerEvent.asCharacters(); - if (chars.isWhiteSpace()) { - eventReader.nextEvent(); - innerEvent = eventReader.peek(); - } - } + XMLEvent innerEvent = skipCommentsAndWhitespace(); + if( innerEvent != null ) { if (innerEvent.isStartElement()) { return true; } @@ -131,6 +151,26 @@ public class XmlReader { return false; } + private XMLEvent skipCommentsAndWhitespace() throws XMLStreamException { + while( eventReader.hasNext() ) { + XMLEvent event = eventReader.peek(); + if( event.getEventType() == XMLStreamConstants.COMMENT ) { + eventReader.nextEvent(); + continue; + } + + if( event.isCharacters() ) { + Characters chars = event.asCharacters(); + if( chars.isWhiteSpace() ) { + eventReader.nextEvent(); + continue; + } + } + return event; + } + return null; + } + private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { checkArgument(startElement != null, "Start Element cannot be NULL!"); return new CompositeNodeWrapper(getNamespaceFor(startElement), getLocalNameFor(startElement)); @@ -165,7 +205,7 @@ public class XmlReader { } } } - return data; + return data == null ? null : data.trim(); } private String getAdditionalData(XMLEvent event) throws XMLStreamException {