X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;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;hp=819edce320d30f827f90f3c7358ed95ebefed0d4;hb=e433e0aa67cc6d144cd3d8d6117de864eb7ebf97;hpb=5273304e9f607a15c1c17aca1c05d7aac2c0260e 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 819edce320..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,38 @@ */ 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; @@ -111,12 +119,12 @@ public class NetconfMessageTransformer implements MessageTransformer 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); } } @@ -268,4 +296,33 @@ public class NetconfMessageTransformer implements MessageTransformer