Integrate AbstractCommonSubscriber more tightly
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / streams / listeners / NotificationListenerAdapter.java
index 866bd45d81c72faa02bfb69be187a3db01500cad..9992c7a07c42639859ec0212fe1ebc5cdd39ce51 100644 (file)
@@ -7,20 +7,12 @@
  */
 package org.opendaylight.restconf.nb.rfc8040.streams.listeners;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.util.Objects.requireNonNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.MoreObjects;
 import java.time.Instant;
 import java.util.Optional;
-import javax.xml.xpath.XPathExpressionException;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.restconf.common.formatters.JSONNotificationFormatter;
-import org.opendaylight.restconf.common.formatters.NotificationFormatter;
 import org.opendaylight.restconf.common.formatters.NotificationFormatterFactory;
 import org.opendaylight.restconf.common.formatters.XMLNotificationFormatter;
 import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
@@ -32,19 +24,13 @@ import org.slf4j.LoggerFactory;
 /**
  * {@link NotificationListenerAdapter} is responsible to track events on notifications.
  */
-public class NotificationListenerAdapter extends AbstractCommonSubscriber implements DOMNotificationListener {
+public class NotificationListenerAdapter extends AbstractCommonSubscriber<Absolute, DOMNotification>
+        implements DOMNotificationListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(NotificationListenerAdapter.class);
     private static final NotificationFormatterFactory JSON_FORMATTER_FACTORY = JSONNotificationFormatter.createFactory(
             JSONCodecFactorySupplier.RFC7951);
 
-    private final String streamName;
-    private final Absolute path;
-    private final NotificationOutputType outputType;
-
-    @VisibleForTesting NotificationFormatter formatter;
-
-
     /**
      * Set path of listener and stream name.
      *
@@ -52,19 +38,11 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem
      * @param streamName Name of the stream.
      * @param outputType Type of output on notification (JSON or XML).
      */
-    NotificationListenerAdapter(final Absolute path, final String streamName, final String outputType) {
-        setLocalNameOfPath(path.lastNodeIdentifier().getLocalName());
-
-        this.outputType = NotificationOutputType.forName(requireNonNull(outputType)).get();
-        this.path = requireNonNull(path);
-        this.streamName = requireNonNull(streamName);
-        checkArgument(!streamName.isEmpty());
-        formatter = getFormatterFactory().getFormatter();
-
-        LOG.debug("output type: {}, {}", outputType, this.outputType);
+    NotificationListenerAdapter(final Absolute path, final String streamName, final NotificationOutputType outputType) {
+        super(path.lastNodeIdentifier(), streamName, path, outputType, getFormatterFactory(outputType));
     }
 
-    private NotificationFormatterFactory getFormatterFactory() {
+    private static NotificationFormatterFactory getFormatterFactory(final NotificationOutputType outputType) {
         switch (outputType) {
             case JSON:
                 return JSON_FORMATTER_FACTORY;
@@ -75,22 +53,6 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem
         }
     }
 
-    @Override
-    final void setFilter(final @Nullable String filter) throws XPathExpressionException {
-        final NotificationFormatterFactory factory = getFormatterFactory();
-        formatter = filter == null || filter.isEmpty() ? factory.getFormatter() : factory.getFormatter(filter);
-    }
-
-    /**
-     * Get output type of this listener.
-     *
-     * @return The configured output type (JSON or XML).
-     */
-    @Override
-    public String getOutputType() {
-        return outputType.getName();
-    }
-
     @Override
     @SuppressWarnings("checkstyle:IllegalCatch")
     public void onNotification(final DOMNotification notification) {
@@ -101,7 +63,7 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem
 
         final Optional<String> maybeOutput;
         try {
-            maybeOutput = formatter.eventData(schemaHandler.get(), notification, now, getLeafNodesOnly(),
+            maybeOutput = formatter().eventData(schemaHandler.get(), notification, now, getLeafNodesOnly(),
                     isSkipNotificationData());
         } catch (Exception e) {
             LOG.error("Failed to process notification {}", notification, e);
@@ -112,23 +74,13 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem
         }
     }
 
-    /**
-     * Get stream name of this listener.
-     *
-     * @return The configured stream name.
-     */
-    @Override
-    public String getStreamName() {
-        return streamName;
-    }
-
     /**
      * Get schema path of notification.
      *
      * @return The configured schema path that points to observing YANG notification schema node.
      */
     public Absolute getSchemaPath() {
-        return path;
+        return path();
     }
 
     public final synchronized void listen(final DOMNotificationService notificationService) {
@@ -136,13 +88,4 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem
             setRegistration(notificationService.registerNotificationListener(this, getSchemaPath()));
         }
     }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("path", path)
-                .add("stream-name", streamName)
-                .add("output-type", outputType)
-                .toString();
-    }
 }