From: Robert Varga Date: Fri, 27 Mar 2015 11:35:37 +0000 (+0100) Subject: Make LeaderLocalDelegateFactory a bit more useful X-Git-Tag: release/lithium~324 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=e85002753464f0e4216a82538988d3ea81dac158 Make LeaderLocalDelegateFactory a bit more useful It seems that the two isntantiations use functionality which can be easily abstracted out, simplifying code. Change-Id: Id5e7cb71055ef14b2139be2ba74e29f9cd10da60 Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java index 7a033cf21f..939ddf8fad 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerSupport.java @@ -7,7 +7,6 @@ */ package org.opendaylight.controller.cluster.datastore; -import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.List; import akka.actor.ActorRef; @@ -26,16 +25,15 @@ final class DataChangeListenerSupport extends LeaderLocalDelegateFactory delayedListenerRegistrations = new ArrayList<>(); private final List dataChangeListeners = new ArrayList<>(); - private final Shard shard; DataChangeListenerSupport(final Shard shard) { - this.shard = Preconditions.checkNotNull(shard); + super(shard); } @Override void onLeadershipChange(final boolean isLeader) { for (ActorSelection dataChangeListener : dataChangeListeners) { - dataChangeListener.tell(new EnableNotification(isLeader), shard.getSelf()); + dataChangeListener.tell(new EnableNotification(isLeader), getSelf()); } if (isLeader) { @@ -52,39 +50,37 @@ final class DataChangeListenerSupport extends LeaderLocalDelegateFactory>> registration; if (isLeader) { registration = createDelegate(message); } else { - LOG.debug("{}: Shard is not the leader - delaying registration", shard.persistenceId()); + LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); DelayedListenerRegistration delayedReg = new DelayedListenerRegistration(message); delayedListenerRegistrations.add(delayedReg); registration = delayedReg; } - ActorRef listenerRegistration = shard.getContext().actorOf( - DataChangeListenerRegistration.props(registration)); + ActorRef listenerRegistration = createActor(DataChangeListenerRegistration.props(registration)); LOG.debug("{}: registerDataChangeListener sending reply, listenerRegistrationPath = {} ", - shard.persistenceId(), listenerRegistration.path()); + persistenceId(), listenerRegistration.path()); - shard.getSender().tell(new RegisterChangeListenerReply(listenerRegistration), shard.getSelf()); + tellSender(new RegisterChangeListenerReply(listenerRegistration)); } @Override ListenerRegistration>> createDelegate( final RegisterChangeListener message) { - ActorSelection dataChangeListenerPath = shard.getContext().system().actorSelection( - message.getDataChangeListenerPath()); + ActorSelection dataChangeListenerPath = selectActor(message.getDataChangeListenerPath()); // Notify the listener if notifications should be enabled or not // If this shard is the leader then it will enable notifications else // it will not - dataChangeListenerPath.tell(new EnableNotification(true), shard.getSelf()); + dataChangeListenerPath.tell(new EnableNotification(true), getSelf()); // Now store a reference to the data change listener so it can be notified // at a later point if notifications should be enabled or disabled @@ -93,9 +89,9 @@ final class DataChangeListenerSupport extends LeaderLocalDelegateFactory> listener = new DataChangeListenerProxy(dataChangeListenerPath); - LOG.debug("{}: Registering for path {}", shard.persistenceId(), message.getPath()); + LOG.debug("{}: Registering for path {}", persistenceId(), message.getPath()); - return shard.getDataStore().registerChangeListener(message.getPath(), listener, + return getShard().getDataStore().registerChangeListener(message.getPath(), listener, message.getScope()); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java index afce4df546..3987c9af35 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerSupport.java @@ -9,7 +9,6 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.ActorSelection; -import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collection; import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; @@ -24,10 +23,9 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory delayedRegistrations = new ArrayList<>(); private final Collection actors = new ArrayList<>(); - private final Shard shard; DataTreeChangeListenerSupport(final Shard shard) { - this.shard = Preconditions.checkNotNull(shard); + super(shard); } @Override @@ -42,17 +40,17 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory registration; if (!isLeader) { - LOG.debug("{}: Shard is not the leader - delaying registration", shard.persistenceId()); + LOG.debug("{}: Shard is not the leader - delaying registration", persistenceId()); DelayedDataTreeListenerRegistration delayedReg = new DelayedDataTreeListenerRegistration(registerTreeChangeListener); @@ -62,24 +60,22 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory createDelegate(final RegisterDataTreeChangeListener message) { - ActorSelection dataChangeListenerPath = shard.getContext().system().actorSelection( - message.getDataTreeChangeListenerPath().path()); + ActorSelection dataChangeListenerPath = selectActor(message.getDataTreeChangeListenerPath()); // Notify the listener if notifications should be enabled or not // If this shard is the leader then it will enable notifications else // it will not - dataChangeListenerPath.tell(new EnableNotification(true), shard.getSelf()); + dataChangeListenerPath.tell(new EnableNotification(true), getSelf()); // Now store a reference to the data change listener so it can be notified // at a later point if notifications should be enabled or disabled @@ -87,8 +83,8 @@ final class DataTreeChangeListenerSupport extends LeaderLocalDelegateFactory message type */ abstract class LeaderLocalDelegateFactory extends DelegateFactory { + private final Shard shard; + + protected LeaderLocalDelegateFactory(final Shard shard) { + this.shard = Preconditions.checkNotNull(shard); + } + + protected final ActorRef getSelf() { + return shard.getSelf(); + } + + protected final Shard getShard() { + return shard; + } + + protected final String persistenceId() { + return shard.persistenceId(); + } + + protected final void tellSender(final Object message) { + shard.getSender().tell(message, getSelf()); + } + + protected final ActorRef createActor(final Props props) { + return shard.getContext().actorOf(props); + } + + protected final ActorSelection selectActor(ActorRef ref) { + return shard.getContext().system().actorSelection(ref.path()); + } + + protected final ActorSelection selectActor(ActorPath path) { + return shard.getContext().system().actorSelection(path); + } + /** * Invoked whenever the local shard's leadership role changes. *