From 744726a5d58c50102bb391dc9e4f9bd8defb691a Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Tue, 24 Jun 2014 17:36:48 -0700 Subject: [PATCH] Complete implementation of DataChangeListenerProxy Change-Id: I51ba2f00289de6ff4cce005945b47f760aa0c57b Signed-off-by: Moiz Raja --- ...roxy.java => DataChangeListenerProxy.java} | 14 ++-- .../controller/cluster/datastore/Shard.java | 4 +- .../datastore/messages/DataChanged.java | 27 +++++++ .../DataChangeListenerProxyTest.java | 81 +++++++++++++++++++ 4 files changed, 119 insertions(+), 7 deletions(-) rename opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/{ListenerProxy.java => DataChangeListenerProxy.java} (60%) create mode 100644 opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java create mode 100644 opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxyTest.java diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxy.java similarity index 60% rename from opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerProxy.java rename to opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxy.java index 7c38ee5acb..8423b9853d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ListenerProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxy.java @@ -9,20 +9,24 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorSelection; +import org.opendaylight.controller.cluster.datastore.messages.DataChanged; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -public class ListenerProxy implements AsyncDataChangeListener>{ - private final ActorSelection listenerRegistrationActor; +/** + * DataChangeListenerProxy represents a single remote DataChangeListener + */ +public class DataChangeListenerProxy implements AsyncDataChangeListener>{ + private final ActorSelection dataChangeListenerActor; - public ListenerProxy(ActorSelection listenerRegistrationActor) { - this.listenerRegistrationActor = listenerRegistrationActor; + public DataChangeListenerProxy(ActorSelection dataChangeListenerActor) { + this.dataChangeListenerActor = dataChangeListenerActor; } @Override public void onDataChanged( AsyncDataChangeEvent> change) { - throw new UnsupportedOperationException("onDataChanged"); + dataChangeListenerActor.tell(new DataChanged(change), null); } } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java index 5b4f7ef898..2a1e70b4ce 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/Shard.java @@ -130,11 +130,11 @@ public class Shard extends UntypedProcessor { private void registerChangeListener( RegisterChangeListener registerChangeListener) { - ActorSelection listenerRegistrationActor = getContext() + ActorSelection dataChangeListenerPath = getContext() .system().actorSelection(registerChangeListener.getDataChangeListenerPath()); AsyncDataChangeListener> - listener = new ListenerProxy(listenerRegistrationActor); + listener = new DataChangeListenerProxy(dataChangeListenerPath); org.opendaylight.yangtools.concepts.ListenerRegistration>> registration = diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java new file mode 100644 index 0000000000..c55dae56dd --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.controller.cluster.datastore.messages; + +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public class DataChanged { + private final AsyncDataChangeEvent> + change; + + public DataChanged( + AsyncDataChangeEvent> change) { + this.change = change; + } + + public AsyncDataChangeEvent> getChange() { + return change; + } +} diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxyTest.java new file mode 100644 index 0000000000..a8409a6f85 --- /dev/null +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerProxyTest.java @@ -0,0 +1,81 @@ +package org.opendaylight.controller.cluster.datastore; + +import akka.actor.ActorRef; +import akka.actor.Props; +import junit.framework.Assert; +import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.DataChanged; +import org.opendaylight.controller.cluster.datastore.utils.ActorContext; +import org.opendaylight.controller.cluster.datastore.utils.DoNothingActor; +import org.opendaylight.controller.cluster.datastore.utils.MessageCollectorActor; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class DataChangeListenerProxyTest extends AbstractActorTest { + + private static class MockDataChangeEvent implements + AsyncDataChangeEvent> { + + @Override + public Map> getCreatedData() { + throw new UnsupportedOperationException("getCreatedData"); + } + + @Override + public Map> getUpdatedData() { + throw new UnsupportedOperationException("getUpdatedData"); + } + + @Override public Set getRemovedPaths() { + throw new UnsupportedOperationException("getRemovedPaths"); + } + + @Override + public Map> getOriginalData() { + throw new UnsupportedOperationException("getOriginalData"); + } + + @Override public NormalizedNode getOriginalSubtree() { + throw new UnsupportedOperationException("getOriginalSubtree"); + } + + @Override public NormalizedNode getUpdatedSubtree() { + throw new UnsupportedOperationException("getUpdatedSubtree"); + } + } + + @Test + public void testOnDataChanged() throws Exception { + final Props props = Props.create(MessageCollectorActor.class); + final ActorRef actorRef = getSystem().actorOf(props); + + DataChangeListenerProxy dataChangeListenerProxy = + new DataChangeListenerProxy( + getSystem().actorSelection(actorRef.path())); + + dataChangeListenerProxy.onDataChanged(new MockDataChangeEvent()); + + //Check if it was received by the remote actor + ActorContext + testContext = new ActorContext(getSystem(), getSystem().actorOf(Props.create(DoNothingActor.class))); + Object messages = testContext + .executeLocalOperation(actorRef, "messages", + ActorContext.ASK_DURATION); + + Assert.assertNotNull(messages); + + Assert.assertTrue(messages instanceof List); + + List listMessages = (List) messages; + + Assert.assertEquals(1, listMessages.size()); + + Assert.assertTrue(listMessages.get(0) instanceof DataChanged); + + } +} -- 2.36.6