X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frest%2Fimpl%2FXmlReader.java;h=5b95f0de1ada80408f24670c310dce35a306ab5d;hp=bf7ff7d43524732f067982042fb46e19f3d35134;hb=c3acce135d19955f72616c4c956668bb539f80f2;hpb=c3632333e5a0d78268fc29554ba6242001432f5e 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 bf7ff7d435..5b95f0de1a 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 @@ -1,3 +1,10 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.controller.sal.rest.impl; import static com.google.common.base.Preconditions.checkArgument; @@ -14,8 +21,11 @@ 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; 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 { @@ -121,17 +131,31 @@ public class XmlReader { return false; } - private SimpleNodeWrapper resolveSimpleNodeFromStartElement(final StartElement startElement) + private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { + checkArgument(startElement != null, "Start Element cannot be 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 = 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()) { final Characters chars = innerEvent.asCharacters(); if (!chars.isWhiteSpace()) { data = innerEvent.asCharacters().getData(); + data = data + getAdditionalData(eventReader.nextEvent()); } } else if (innerEvent.isEndElement()) { if (startElement.getLocation().getCharacterOffset() == innerEvent.getLocation().getCharacterOffset()) { @@ -141,22 +165,51 @@ public class XmlReader { } } } - - return new SimpleNodeWrapper(getNamespaceFrom(startElement), getLocalNameFrom(startElement), data); + return data == null ? null : data.trim(); } - private CompositeNodeWrapper resolveCompositeNodeFromStartElement(final StartElement startElement) { - checkArgument(startElement != null, "Start Element cannot be NULL!"); - return new CompositeNodeWrapper(getNamespaceFrom(startElement), getLocalNameFrom(startElement)); + private String getAdditionalData(XMLEvent event) throws XMLStreamException { + String data = ""; + if (eventReader.hasNext()) { + final XMLEvent innerEvent = eventReader.peek(); + if (innerEvent.isCharacters() && !innerEvent.isEndElement()) { + final Characters chars = innerEvent.asCharacters(); + if (!chars.isWhiteSpace()) { + data = innerEvent.asCharacters().getData(); + data = data + getAdditionalData(eventReader.nextEvent()); + } + } + } + return data; } - 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); } + private Object resolveValueOfElement(String value, StartElement startElement) { + // it could be instance-identifier Built-In Type + if (value.startsWith("/")) { + IdentityValuesDTO iiValue = RestUtil.asInstanceIdentifier(value, new RestUtil.PrefixMapingFromXml(startElement)); + if (iiValue != null) { + return iiValue; + } + } + // it could be identityref Built-In Type + String[] namespaceAndValue = value.split(":"); + if (namespaceAndValue.length == 2) { + String namespace = startElement.getNamespaceContext().getNamespaceURI(namespaceAndValue[0]); + if (namespace != null && !namespace.isEmpty()) { + return new IdentityValuesDTO(namespace, namespaceAndValue[1], namespaceAndValue[0],value); + } + } + // it is not "prefix:value" but just "value" + return value; + } + }