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=014e839f2665c7e9aa7c89c5a9f344aaef377b7b;hb=d8d2798ea4ec48c2987f6ab712c1548d4fde0e3c;hp=9f31eb46d52e9a722bffdc7d742859adba09cfc6;hpb=1d86c5cf27410934076c10eaa74f4bab4418215c;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 9f31eb46d5..014e839f26 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 @@ -14,17 +14,20 @@ 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.IdentityValuesDTO; +import org.opendaylight.controller.sal.restconf.impl.EmptyNodeWrapper; import org.opendaylight.controller.sal.restconf.impl.NodeWrapper; import org.opendaylight.controller.sal.restconf.impl.SimpleNodeWrapper; +import org.opendaylight.yangtools.yang.data.api.Node; public class XmlReader { - + private final static XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); private XMLEventReader eventReader; public CompositeNodeWrapper read(InputStream entityStream) throws XMLStreamException, UnsupportedFormatException { eventReader = xmlInputFactory.createXMLEventReader(entityStream); - + if (eventReader.hasNext()) { XMLEvent element = eventReader.peek(); if (element.isStartDocument()) { @@ -35,7 +38,7 @@ public class XmlReader { if (eventReader.hasNext() && !isCompositeNodeEvent(eventReader.peek())) { throw new UnsupportedFormatException("Root element of XML has to be composite element."); } - + final Stack> processingQueue = new Stack<>(); CompositeNodeWrapper root = null; NodeWrapper element = null; @@ -73,14 +76,14 @@ public class XmlReader { element = processingQueue.pop(); } } - + if (!root.getLocalName().equals(element.getLocalName())) { throw new UnsupportedFormatException("XML should contain only one root element"); } - + return root; } - + private boolean isSimpleNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { @@ -99,7 +102,7 @@ public class XmlReader { } return false; } - + private boolean isCompositeNodeEvent(final XMLEvent event) throws XMLStreamException { checkArgument(event != null, "XML Event cannot be NULL!"); if (event.isStartElement()) { @@ -120,11 +123,25 @@ public class XmlReader { } return false; } - - private SimpleNodeWrapper resolveSimpleNodeFromStartElement(final StartElement startElement) throws XMLStreamException { + + private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { checkArgument(startElement != null, "Start Element cannot be NULL!"); - String data = null; + return new CompositeNodeWrapper(getNamespaceFor(startElement), getLocalNameFor(startElement)); + } + private NodeWrapper> resolveSimpleNodeFromStartElement(final StartElement startElement) + throws XMLStreamException { + checkArgument(startElement != null, "Start Element cannot be NULL!"); + String data = getValueOf(startElement); + if (data == null) { + return new EmptyNodeWrapper(getNamespaceFor(startElement), getLocalNameFor(startElement)); + } + return new SimpleNodeWrapper(getNamespaceFor(startElement), getLocalNameFor(startElement), + resolveValueOfElement(data, startElement)); + } + + private String getValueOf(StartElement startElement) throws XMLStreamException { + String data = null; if (eventReader.hasNext()) { final XMLEvent innerEvent = eventReader.peek(); if (innerEvent.isCharacters()) { @@ -133,25 +150,43 @@ public class XmlReader { data = innerEvent.asCharacters().getData(); } } else if (innerEvent.isEndElement()) { - data = ""; + if (startElement.getLocation().getCharacterOffset() == innerEvent.getLocation().getCharacterOffset()) { + data = null; + } else { + data = ""; + } } } - - return new SimpleNodeWrapper(getNamespaceFrom(startElement), getLocalNameFrom(startElement), data); + return data; } - - private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { - checkArgument(startElement != null, "Start Element cannot be NULL!"); - return new CompositeNodeWrapper(getNamespaceFrom(startElement), getLocalNameFrom(startElement)); - } - - private String getLocalNameFrom(StartElement startElement) { + + private String getLocalNameFor(StartElement startElement) { return startElement.getName().getLocalPart(); } - - private URI getNamespaceFrom(StartElement startElement) { + + private URI getNamespaceFor(StartElement startElement) { String namespaceURI = startElement.getName().getNamespaceURI(); return namespaceURI.isEmpty() ? null : URI.create(namespaceURI); } - + + /** + * @param value + * value of startElement + * @param startElement + * element containing value + * @return if value is "prefix:value" then {@link IdentityValuesDTO} else the same + * string as parameter "value" + */ + private Object resolveValueOfElement(String value, StartElement startElement) { + String[] namespaceAndValue = value.split(":"); + if (namespaceAndValue.length != 2) { // it is not "prefix:value" + return value; + } + String namespace = startElement.getNamespaceContext().getNamespaceURI(namespaceAndValue[0]); + if (namespace != null && !namespace.isEmpty()) { + return new IdentityValuesDTO(namespace, namespaceAndValue[1], namespaceAndValue[0]); + } + return value; + } + }