import org.opendaylight.controller.cluster.datastore.actors.DataTreeNotificationListenerRegistrationActor;
import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
import org.opendaylight.controller.cluster.datastore.messages.ListenerRegistrationMessage;
+import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeNotificationListenerReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-abstract class AbstractDataListenerSupport<L extends EventListener, M extends ListenerRegistrationMessage,
- D extends DelayedListenerRegistration<L, M>> extends LeaderLocalDelegateFactory<M> {
+abstract class AbstractDataListenerSupport<L extends EventListener, M extends ListenerRegistrationMessage>
+ extends LeaderLocalDelegateFactory<M> {
private final Logger log = LoggerFactory.getLogger(getClass());
- private final Collection<D> delayedListenerRegistrations = ConcurrentHashMap.newKeySet();
- private final Collection<D> delayedListenerOnAllRegistrations = ConcurrentHashMap.newKeySet();
+ private final Collection<DelayedListenerRegistration<L, M>> delayedListenerRegistrations =
+ ConcurrentHashMap.newKeySet();
+ private final Collection<DelayedListenerRegistration<L, M>> delayedListenerOnAllRegistrations =
+ ConcurrentHashMap.newKeySet();
private final Collection<ActorSelection> leaderOnlyListenerActors = ConcurrentHashMap.newKeySet();
private final Collection<ActorSelection> allListenerActors = ConcurrentHashMap.newKeySet();
void onLeadershipChange(boolean isLeader, boolean hasLeader) {
log.debug("{}: onLeadershipChange, isLeader: {}, hasLeader : {}", persistenceId(), isLeader, hasLeader);
- final EnableNotification msg = new EnableNotification(isLeader);
+ final EnableNotification msg = new EnableNotification(isLeader, persistenceId());
for (ActorSelection dataChangeListener : leaderOnlyListenerActors) {
dataChangeListener.tell(msg, getSelf());
}
if (hasLeader) {
- for (D reg : delayedListenerOnAllRegistrations) {
- reg.createDelegate(this);
+ for (DelayedListenerRegistration<L, M> reg : delayedListenerOnAllRegistrations) {
+ reg.doRegistration(this);
}
delayedListenerOnAllRegistrations.clear();
}
if (isLeader) {
- for (D reg : delayedListenerRegistrations) {
- reg.createDelegate(this);
+ for (DelayedListenerRegistration<L, M> reg : delayedListenerRegistrations) {
+ reg.doRegistration(this);
}
delayedListenerRegistrations.clear();
@Override
void onMessage(M message, boolean isLeader, boolean hasLeader) {
- log.debug("{}: {} for {}, leader: {}", persistenceId(), logName(), message.getPath(), isLeader);
+ log.debug("{}: {} for {}, isLeader: {}, hasLeader: {}", persistenceId(), logName(), message,
+ isLeader, hasLeader);
ActorRef registrationActor = createActor(DataTreeNotificationListenerRegistrationActor.props());
} else {
log.debug("{}: Shard is not the leader - delaying registration", persistenceId());
- D delayedReg = newDelayedListenerRegistration(message, registrationActor);
- Collection<D> delayedRegList;
+ DelayedListenerRegistration<L, M> delayedReg =
+ new DelayedListenerRegistration<>(message, registrationActor);
+ Collection<DelayedListenerRegistration<L, M>> delayedRegList;
if (message.isRegisterOnAllInstances()) {
delayedRegList = delayedListenerOnAllRegistrations;
} else {
log.debug("{}: {} sending reply, listenerRegistrationPath = {} ", persistenceId(), logName(),
registrationActor.path());
- tellSender(newRegistrationReplyMessage(registrationActor));
+ tellSender(new RegisterDataTreeNotificationListenerReply(registrationActor));
}
protected ActorSelection processListenerRegistrationMessage(M message) {
final ActorSelection listenerActor = selectActor(message.getListenerActorPath());
// We have a leader so enable the listener.
- listenerActor.tell(new EnableNotification(true), getSelf());
+ listenerActor.tell(new EnableNotification(true, persistenceId()), getSelf());
if (!message.isRegisterOnAllInstances()) {
// This is a leader-only registration so store a reference to the listener actor so it can be notified
abstract void doRegistration(M message, ActorRef registrationActor);
- protected abstract D newDelayedListenerRegistration(M message, ActorRef registrationActor);
-
- protected abstract Object newRegistrationReplyMessage(ActorRef registrationActor);
-
protected abstract String logName();
}