X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fschema%2Fmapping%2FNetconfMessageTransformer.java;h=5b579a0a8a3ecd936e6e5b6605b065dcc3f3fd6e;hb=e433e0aa67cc6d144cd3d8d6117de864eb7ebf97;hp=e06f572cad7d1a02b3f3491241bed93b9bc001b9;hpb=576efc4bd225c62269108466aaaa2c4a2dfd4d65;p=controller.git diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java index e06f572cad..5b579a0a8a 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java @@ -7,30 +7,39 @@ */ package org.opendaylight.controller.sal.connect.netconf.schema.mapping; +import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.EVENT_TIME; import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_RPC_QNAME; import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_URI; +import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.toPath; import com.google.common.base.Function; import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.AbstractMap; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; -import java.util.NoSuchElementException; import java.util.Set; +import javax.annotation.Nonnull; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.dom.DOMResult; +import org.opendaylight.controller.md.sal.dom.api.DOMEvent; +import org.opendaylight.controller.md.sal.dom.api.DOMNotification; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.notifications.NetconfNotification; +import org.opendaylight.controller.netconf.util.OrderedNormalizedNodeWriter; import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlUtil; @@ -44,7 +53,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; import org.opendaylight.yangtools.yang.data.impl.codec.xml.XMLStreamNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlUtils; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; @@ -101,22 +109,22 @@ public class NetconfMessageTransformer implements MessageTransformer mappedNotifications; private final DomToNormalizedNodeParserFactory parserFactory; - public NetconfMessageTransformer(final SchemaContext schemaContext) { + public NetconfMessageTransformer(final SchemaContext schemaContext, final boolean strictParsing) { this.counter = new MessageCounter(); this.schemaContext = schemaContext; - parserFactory = DomToNormalizedNodeParserFactory.getInstance(XmlUtils.DEFAULT_XML_CODEC_PROVIDER, schemaContext); + parserFactory = DomToNormalizedNodeParserFactory.getInstance(XmlUtils.DEFAULT_XML_CODEC_PROVIDER, schemaContext, strictParsing); mappedRpcs = Maps.uniqueIndex(schemaContext.getOperations(), QNAME_FUNCTION); mappedNotifications = Multimaps.index(schemaContext.getNotifications(), QNAME_NOREV_FUNCTION); } @Override - public synchronized ContainerNode toNotification(final NetconfMessage message) { - final XmlElement stripped = stripNotification(message); + public synchronized DOMNotification toNotification(final NetconfMessage message) { + final Map.Entry stripped = stripNotification(message); final QName notificationNoRev; try { // How to construct QName with no revision ? - notificationNoRev = QName.cachedReference(QName.create(stripped.getNamespace(), "0000-00-00", stripped.getName()).withoutRevision()); + notificationNoRev = QName.cachedReference(QName.create(stripped.getValue().getNamespace(), "0000-00-00", stripped.getValue().getName()).withoutRevision()); } catch (final MissingNameSpaceException e) { throw new IllegalArgumentException("Unable to parse notification " + message + ", cannot find namespace", e); } @@ -131,23 +139,43 @@ public class NetconfMessageTransformer implements MessageTransformer stripNotification(final NetconfMessage message) { final XmlElement xmlElement = XmlElement.fromDomDocument(message.getDocument()); final List childElements = xmlElement.getChildElements(); Preconditions.checkArgument(childElements.size() == 2, "Unable to parse notification %s, unexpected format", message); + + final XmlElement eventTimeElement; + final XmlElement notificationElement; + + if (childElements.get(0).getName().equals(EVENT_TIME)) { + eventTimeElement = childElements.get(0); + notificationElement = childElements.get(1); + } + else if(childElements.get(1).getName().equals(EVENT_TIME)) { + eventTimeElement = childElements.get(1); + notificationElement = childElements.get(0); + } else { + throw new IllegalArgumentException("Notification payload does not contain " + EVENT_TIME + " " + message); + } + try { - return Iterables.find(childElements, new Predicate() { - @Override - public boolean apply(final XmlElement xmlElement) { - return !xmlElement.getName().equals("eventTime"); - } - }); - } catch (final NoSuchElementException e) { - throw new IllegalArgumentException("Unable to parse notification " + message + ", cannot strip notification metadata", e); + return new AbstractMap.SimpleEntry<>(parseEventTime(eventTimeElement.getTextContent()), notificationElement); + } catch (NetconfDocumentedException e) { + throw new IllegalArgumentException("Notification payload does not contain " + EVENT_TIME + " " + message); + } + } + + private static Date parseEventTime(final String eventTime) { + try { + return new SimpleDateFormat(NetconfNotification.RFC3339_DATE_FORMAT_BLUEPRINT).parse(eventTime); + } catch (ParseException e) { + throw new IllegalArgumentException("Unable to parse event time from " + eventTime, e); } } @@ -206,17 +234,15 @@ public class NetconfMessageTransformer implements MessageTransformer editElement : normalized.getValue()) { - normalizedNodeWriter.write(editElement); - } + normalizedNodeWriter = new OrderedNormalizedNodeWriter(normalizedNodeStreamWriter, baseNetconfCtx, schemaPath); + Collection> value = (Collection) normalized.getValue(); + normalizedNodeWriter.write(value); normalizedNodeWriter.flush(); } finally { try { @@ -270,4 +296,33 @@ public class NetconfMessageTransformer implements MessageTransformer