Merge "Remove netconf-impl test resources"
[netconf.git] / netconf / netconf-notifications-impl / src / main / java / org / opendaylight / netconf / notifications / impl / ops / CreateSubscription.java
index e7211b1c6ede7bf3e416fd9c049b0fc067393e75..bfc59c25987040436eab781b249966011bf36ad7 100644 (file)
@@ -5,18 +5,16 @@
  * 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.netconf.notifications.impl.ops;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import org.opendaylight.controller.config.util.xml.DocumentedException;
-import org.opendaylight.controller.config.util.xml.XmlElement;
-import org.opendaylight.controller.config.util.xml.XmlUtil;
+import java.util.Optional;
+import org.opendaylight.netconf.api.DocumentedException;
 import org.opendaylight.netconf.api.NetconfSession;
+import org.opendaylight.netconf.api.xml.XmlElement;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
 import org.opendaylight.netconf.mapping.api.SessionAwareNetconfOperation;
 import org.opendaylight.netconf.notifications.NetconfNotification;
@@ -34,59 +32,68 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 /**
- * Create subscription listens for create subscription requests and registers notification listeners into notification registry.
+ * Create subscription listens for create subscription requests
+ * and registers notification listeners into notification registry.
  * Received notifications are sent to the client right away
  */
-public class CreateSubscription extends AbstractSingletonNetconfOperation implements SessionAwareNetconfOperation, AutoCloseable {
+public class CreateSubscription extends AbstractSingletonNetconfOperation
+        implements SessionAwareNetconfOperation, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(CreateSubscription.class);
 
     static final String CREATE_SUBSCRIPTION = "create-subscription";
 
     private final NetconfNotificationRegistry notifications;
-    private final List<NotificationListenerRegistration> subscriptions = Lists.newArrayList();
+    private final List<NotificationListenerRegistration> subscriptions = new ArrayList<>();
     private NetconfSession netconfSession;
 
-    public CreateSubscription(final String netconfSessionIdForReporting, final NetconfNotificationRegistry notifications) {
+    public CreateSubscription(final String netconfSessionIdForReporting,
+                              final NetconfNotificationRegistry notifications) {
         super(netconfSessionIdForReporting);
         this.notifications = notifications;
     }
 
     @Override
-    protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException {
+    protected Element handleWithNoSubsequentOperations(final Document document,
+                                                       final XmlElement operationElement) throws DocumentedException {
         operationElement.checkName(CREATE_SUBSCRIPTION);
         operationElement.checkNamespace(CreateSubscriptionInput.QNAME.getNamespace().toString());
         // FIXME reimplement using CODEC_REGISTRY and parse everything into generated class instance
-        // Waiting ofr https://git.opendaylight.org/gerrit/#/c/13763/
+        // Binding doesn't support anyxml nodes yet, so filter could not be retrieved
+        // xml -> normalized node -> CreateSubscriptionInput conversion could be slower than current approach
 
         final Optional<XmlElement> filter = operationElement.getOnlyChildElementWithSameNamespaceOptionally("filter");
 
         // Replay not supported
-        final Optional<XmlElement> startTime = operationElement.getOnlyChildElementWithSameNamespaceOptionally("startTime");
-        Preconditions.checkArgument(startTime.isPresent() == false, "StartTime element not yet supported");
+        final Optional<XmlElement> startTime =
+                operationElement.getOnlyChildElementWithSameNamespaceOptionally("startTime");
+        Preconditions.checkArgument(!startTime.isPresent(), "StartTime element not yet supported");
 
         // Stop time not supported
-        final Optional<XmlElement> stopTime = operationElement.getOnlyChildElementWithSameNamespaceOptionally("stopTime");
-        Preconditions.checkArgument(stopTime.isPresent() == false, "StopTime element not yet supported");
+        final Optional<XmlElement> stopTime =
+                operationElement.getOnlyChildElementWithSameNamespaceOptionally("stopTime");
+        Preconditions.checkArgument(!stopTime.isPresent(), "StopTime element not yet supported");
 
         final StreamNameType streamNameType = parseStreamIfPresent(operationElement);
 
         Preconditions.checkNotNull(netconfSession);
         // Premature streams are allowed (meaning listener can register even if no provider is available yet)
-        if(notifications.isStreamAvailable(streamNameType) == false) {
-            LOG.warn("Registering premature stream {}. No publisher available yet for session {}", streamNameType, getNetconfSessionIdForReporting());
+        if (!notifications.isStreamAvailable(streamNameType)) {
+            LOG.warn("Registering premature stream {}. No publisher available yet for session {}", streamNameType,
+                    getNetconfSessionIdForReporting());
         }
 
-        final NotificationListenerRegistration notificationListenerRegistration =
-                notifications.registerNotificationListener(streamNameType, new NotificationSubscription(netconfSession, filter));
+        final NotificationListenerRegistration notificationListenerRegistration = notifications
+                .registerNotificationListener(streamNameType, new NotificationSubscription(netconfSession, filter));
         subscriptions.add(notificationListenerRegistration);
 
-        return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent());
+        return document.createElement(XmlNetconfConstants.OK);
     }
 
     private static StreamNameType parseStreamIfPresent(final XmlElement operationElement) throws DocumentedException {
         final Optional<XmlElement> stream = operationElement.getOnlyChildElementWithSameNamespaceOptionally("stream");
-        return stream.isPresent() ? new StreamNameType(stream.get().getTextContent()) : NetconfNotificationManager.BASE_STREAM_NAME;
+        return stream.isPresent() ? new StreamNameType(stream.get().getTextContent())
+                : NetconfNotificationManager.BASE_STREAM_NAME;
     }
 
     @Override
@@ -117,7 +124,7 @@ public class CreateSubscription extends AbstractSingletonNetconfOperation implem
         private final NetconfSession currentSession;
         private final Optional<XmlElement> filter;
 
-        public NotificationSubscription(final NetconfSession currentSession, final Optional<XmlElement> filter) {
+        NotificationSubscription(final NetconfSession currentSession, final Optional<XmlElement> filter) {
             this.currentSession = currentSession;
             this.filter = filter;
         }
@@ -126,13 +133,14 @@ public class CreateSubscription extends AbstractSingletonNetconfOperation implem
         public void onNotification(final StreamNameType stream, final NetconfNotification notification) {
             if (filter.isPresent()) {
                 try {
-                    final Optional<Document> filtered = SubtreeFilter.applySubtreeNotificationFilter(this.filter.get(), notification.getDocument());
+                    final Optional<Document> filtered =
+                            SubtreeFilter.applySubtreeNotificationFilter(this.filter.get(), notification.getDocument());
                     if (filtered.isPresent()) {
                         final Date eventTime = notification.getEventTime();
                         currentSession.sendMessage(new NetconfNotification(filtered.get(), eventTime));
                     }
                 } catch (DocumentedException e) {
-                    LOG.warn(e.toString());
+                    LOG.warn("Failed to process notification {}", notification, e);
                     currentSession.sendMessage(notification);
                 }
             } else {