+ void onMessage(final RegisterDataTreeChangeListener message, final boolean isLeader, final boolean hasLeader) {
+ LOG.debug("{}: onMessage {}, isLeader: {}, hasLeader: {}", persistenceId(), message, isLeader, hasLeader);
+
+ final ActorRef registrationActor = createActor(DataTreeNotificationListenerRegistrationActor.props());
+
+ if (hasLeader && message.isRegisterOnAllInstances() || isLeader) {
+ doRegistration(message, registrationActor);
+ } else {
+ LOG.debug("{}: Shard does not have a leader - delaying registration", persistenceId());
+
+ final DelayedDataTreeChangeListenerRegistration<DOMDataTreeChangeListener> delayedReg =
+ new DelayedDataTreeChangeListenerRegistration<>(message, registrationActor);
+ final Collection<DelayedDataTreeChangeListenerRegistration<DOMDataTreeChangeListener>> delayedRegList;
+ if (message.isRegisterOnAllInstances()) {
+ delayedRegList = delayedListenerOnAllRegistrations;
+ } else {
+ delayedRegList = delayedDataTreeChangeListenerRegistrations;
+ }
+
+ delayedRegList.add(delayedReg);
+ registrationActor.tell(new DataTreeNotificationListenerRegistrationActor.SetRegistration(
+ delayedReg, () -> delayedRegList.remove(delayedReg)), ActorRef.noSender());
+ }
+
+ LOG.debug("{}: sending RegisterDataTreeNotificationListenerReply, listenerRegistrationPath = {} ",
+ persistenceId(), registrationActor.path());
+
+ tellSender(new RegisterDataTreeNotificationListenerReply(registrationActor));
+ }
+
+ private ActorSelection processListenerRegistrationMessage(final RegisterDataTreeChangeListener message) {
+ final ActorSelection listenerActor = selectActor(message.getListenerActorPath());
+
+ // We have a leader so enable the listener.
+ 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
+ // at a later point if notifications should be enabled or disabled.
+ leaderOnlyListenerActors.add(listenerActor);
+ }
+
+ allListenerActors.add(listenerActor);
+
+ return listenerActor;
+ }
+
+ private void removeListenerActor(final ActorSelection listenerActor) {
+ allListenerActors.remove(listenerActor);
+ leaderOnlyListenerActors.remove(listenerActor);