package org.opendaylight.controller.cluster.datastore;
import akka.actor.Props;
-import akka.japi.Creator;
import com.google.common.base.Preconditions;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.opendaylight.controller.cluster.common.actor.AbstractUntypedActor;
import org.opendaylight.controller.cluster.datastore.messages.DataChanged;
import org.opendaylight.controller.cluster.datastore.messages.DataChangedReply;
+import org.opendaylight.controller.cluster.datastore.messages.DataTreeListenerInfo;
import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
+import org.opendaylight.controller.cluster.datastore.messages.GetInfo;
import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
/**
* Actor for a DataChangeListener.
*
- * @Deprecated Replaced by {@link DataTreeChangeListener}
+ * @deprecated Replaced by {@link DataTreeChangeListener}
*/
@Deprecated
public class DataChangeListener extends AbstractUntypedActor {
private final AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener;
+ private final YangInstanceIdentifier registeredPath;
private boolean notificationsEnabled = false;
+ private long notificationCount;
- public DataChangeListener(AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener) {
+ public DataChangeListener(AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener,
+ final YangInstanceIdentifier registeredPath) {
this.listener = Preconditions.checkNotNull(listener, "listener should not be null");
+ this.registeredPath = Preconditions.checkNotNull(registeredPath);
}
@Override
dataChanged(message);
} else if (message instanceof EnableNotification) {
enableNotification((EnableNotification) message);
+ } else if (message instanceof GetInfo) {
+ getSender().tell(new DataTreeListenerInfo(listener.toString(), registeredPath.toString(),
+ notificationsEnabled, notificationCount), getSelf());
} else {
unknownMessage(message);
}
LOG.debug("Sending change notification {} to listener {}", change, listener);
+ notificationCount++;
+
try {
this.listener.onDataChanged(change);
} catch (RuntimeException e) {
- LOG.error( String.format( "Error notifying listener %s", this.listener ), e );
+ LOG.error(String.format("Error notifying listener %s", this.listener), e);
}
if (isValidSender(getSender())) {
}
}
- public static Props props(final AsyncDataChangeListener<YangInstanceIdentifier,
- NormalizedNode<?, ?>> listener) {
- return Props.create(new DataChangeListenerCreator(listener));
- }
-
- private static class DataChangeListenerCreator implements Creator<DataChangeListener> {
- private static final long serialVersionUID = 1L;
-
- @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "This field is not Serializable but we don't "
- + "create remote instances of this actor and thus don't need it to be Serializable.")
- final AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener;
-
- DataChangeListenerCreator(
- AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener) {
- this.listener = listener;
- }
-
- @Override
- public DataChangeListener create() throws Exception {
- return new DataChangeListener(listener);
- }
+ public static Props props(final AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> listener,
+ final YangInstanceIdentifier registeredPath) {
+ return Props.create(DataChangeListener.class, listener, registeredPath);
}
}