+ 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));