Bump upstream SNAPSHOTS
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / AbstractShardDataTreeNotificationPublisherActorProxy.java
index 61a22d4c2c958be3dddd5a0197710f3339b9919f..b4c65a80c07f672172d878b8d2eee1aefee72f34 100644 (file)
@@ -9,57 +9,60 @@ package org.opendaylight.controller.cluster.datastore;
 
 import akka.actor.ActorContext;
 import akka.actor.ActorRef;
-import javax.annotation.concurrent.NotThreadSafe;
-import org.opendaylight.controller.cluster.datastore.utils.Dispatchers;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import akka.actor.Props;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.opendaylight.controller.cluster.common.actor.Dispatchers;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Abstract base class for a ShardDataTreeNotificationPublisher that offloads the generation and publication
- * of data tree notifications to an actor.
+ * of data tree notifications to an actor. This class is NOT thread-safe.
  *
  * @author Thomas Pantelis
  */
-@NotThreadSafe
 abstract class AbstractShardDataTreeNotificationPublisherActorProxy implements ShardDataTreeNotificationPublisher {
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractShardDataTreeNotificationPublisherActorProxy.class);
+    @SuppressFBWarnings("SLF4J_LOGGER_SHOULD_BE_PRIVATE")
+    protected final Logger log = LoggerFactory.getLogger(getClass());
 
     private final ActorContext actorContext;
     private final String actorName;
-    private ActorRef notifierActor;
+    private final String logContext;
+    private ActorRef publisherActor;
 
-    protected AbstractShardDataTreeNotificationPublisherActorProxy(ActorContext actorContext, String actorName) {
+    protected AbstractShardDataTreeNotificationPublisherActorProxy(final ActorContext actorContext,
+            final String actorName, final String logContext) {
         this.actorContext = actorContext;
         this.actorName = actorName;
+        this.logContext = logContext;
     }
 
-    protected AbstractShardDataTreeNotificationPublisherActorProxy(
-            AbstractShardDataTreeNotificationPublisherActorProxy other) {
-        this.actorContext = null;
-        this.actorName = null;
-        this.notifierActor = other.getNotifierActor();
+    protected abstract Props props();
+
+    protected final String actorName() {
+        return actorName;
     }
 
-    protected abstract ShardDataTreeNotificationPublisher getDelegatePublisher();
+    protected final String logContext() {
+        return logContext;
+    }
 
     @Override
-    public void publishChanges(DataTreeCandidate candidate, String logContext) {
-        getNotifierActor().tell(new ShardDataTreeNotificationPublisherActor.PublishNotifications(
-                getDelegatePublisher(), candidate, logContext), ActorRef.noSender());
+    public void publishChanges(final DataTreeCandidate candidate) {
+        publisherActor().tell(new ShardDataTreeNotificationPublisherActor.PublishNotifications(candidate),
+                ActorRef.noSender());
     }
 
-    private ActorRef getNotifierActor() {
-        if(notifierActor == null) {
-            LOG.debug("Creating actor {}", actorName);
-
+    protected final ActorRef publisherActor() {
+        if (publisherActor == null) {
             String dispatcher = new Dispatchers(actorContext.system().dispatchers()).getDispatcherPath(
                     Dispatchers.DispatcherType.Notification);
-            notifierActor = actorContext.actorOf(ShardDataTreeNotificationPublisherActor.props(actorName)
-                    .withDispatcher(dispatcher).withMailbox(
-                            org.opendaylight.controller.cluster.datastore.utils.ActorContext.BOUNDED_MAILBOX), actorName);
+            publisherActor = actorContext.actorOf(props().withDispatcher(dispatcher), actorName);
+
+            log.debug("{}: Created publisher actor {} with name {}", logContext, publisherActor, actorName);
         }
 
-        return notifierActor;
+        return publisherActor;
     }
 }