Added Change utility class for representing change events + Moved Match class to org.onlab.util
Change-Id: I08e8cd8dd92983bd2764e83016b1abc0bf29388f
diff --git a/core/api/src/main/java/org/onosproject/event/Change.java b/core/api/src/main/java/org/onosproject/event/Change.java
new file mode 100644
index 0000000..b1d2b6f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/event/Change.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.event;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * Generic representation of an update.
+ *
+ * @param <T> type of value that was updated
+ */
+public class Change<T> {
+
+ private final T oldValue;
+ private final T newValue;
+
+ public Change(T oldValue, T newValue) {
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ /**
+ * Returns previous value.
+ * @return previous value.
+ */
+ public T oldValue() {
+ return oldValue;
+ }
+
+ /**
+ * Returns new or current value.
+ * @return new value.
+ */
+ public T newValue() {
+ return newValue;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null || !(other instanceof Change)) {
+ return false;
+ }
+ Change<T> that = (Change<T>) other;
+ return Objects.equal(this.oldValue, that.oldValue) &&
+ Objects.equal(this.newValue, that.newValue);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(oldValue, newValue);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("oldValue", oldValue)
+ .add("newValue", newValue)
+ .toString();
+ }
+}
diff --git a/core/api/src/test/java/org/onosproject/event/ChangeTest.java b/core/api/src/test/java/org/onosproject/event/ChangeTest.java
new file mode 100644
index 0000000..996af93
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/event/ChangeTest.java
@@ -0,0 +1,29 @@
+package org.onosproject.event;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.junit.Assert.*;
+
+/**
+ * Unit tests for {@link Change}.
+ */
+public class ChangeTest {
+
+ @Test
+ public void getters() {
+ Change<String> change = new Change<>("a", "b");
+ assertEquals("a", change.oldValue());
+ assertEquals("b", change.newValue());
+ }
+
+ @Test
+ public void equality() {
+ new EqualsTester()
+ .addEqualityGroup(new Change<>("foo", "bar"),
+ new Change<>("foo", "bar"))
+ .addEqualityGroup(new Change<>("bar", "car"))
+ .testEquals();
+ }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
index 1d81f99..ab5f987 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
@@ -16,6 +16,7 @@
package org.onosproject.store.consistent.impl;
+import org.onlab.util.Match;
import org.onosproject.store.service.Transaction;
import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
index de73414..9af7445 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
@@ -19,6 +19,7 @@
import java.nio.ByteBuffer;
import org.onlab.util.KryoNamespace;
+import org.onlab.util.Match;
import org.onosproject.cluster.NodeId;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.serializers.KryoSerializer;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
index 1136428..65ffd92 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
@@ -20,6 +20,8 @@
import net.kuujo.copycat.state.Initializer;
import net.kuujo.copycat.state.Query;
import net.kuujo.copycat.state.StateContext;
+
+import org.onlab.util.Match;
import org.onosproject.store.service.Transaction;
import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
index 7c2613e..cdbbd28 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
@@ -22,6 +22,7 @@
import com.google.common.collect.Maps;
import org.onlab.util.HexString;
+import org.onlab.util.Match;
import org.onlab.util.SharedExecutors;
import org.onlab.util.Tools;
import org.onosproject.core.ApplicationId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
index 2a50fbd..59b6565 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
@@ -17,12 +17,15 @@
package org.onosproject.store.consistent.impl;
import com.google.common.collect.Sets;
+
import net.kuujo.copycat.resource.internal.AbstractResource;
import net.kuujo.copycat.resource.internal.ResourceManager;
import net.kuujo.copycat.state.StateMachine;
import net.kuujo.copycat.state.internal.DefaultStateMachine;
import net.kuujo.copycat.util.concurrent.Futures;
import net.kuujo.copycat.util.function.TriConsumer;
+
+import org.onlab.util.Match;
import org.onosproject.store.service.Transaction;
import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
index 8943fc8..3bb413c 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
@@ -21,8 +21,11 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import net.kuujo.copycat.state.Initializer;
import net.kuujo.copycat.state.StateContext;
+
+import org.onlab.util.Match;
import org.onosproject.store.service.DatabaseUpdate;
import org.onosproject.store.service.Transaction;
import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java
deleted file mode 100644
index 5f707d6..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.consistent.impl;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.function.Function;
-
-/**
- * Utility class for checking matching values.
- *
- * @param <T> type of value
- */
-public final class Match<T> {
-
- private final boolean matchAny;
- private final T value;
-
- /**
- * Returns a Match that matches any value.
- * @param <T> match type
- * @return new instance
- */
- public static <T> Match<T> any() {
- return new Match<>();
- }
-
- /**
- * Returns a Match that matches null values.
- * @param <T> match type
- * @return new instance
- */
- public static <T> Match<T> ifNull() {
- return ifValue(null);
- }
-
- /**
- * Returns a Match that matches only specified value.
- * @param value value to match
- * @param <T> match type
- * @return new instance
- */
- public static <T> Match<T> ifValue(T value) {
- return new Match<>(value);
- }
-
- private Match() {
- matchAny = true;
- value = null;
- }
-
- private Match(T value) {
- matchAny = false;
- this.value = value;
- }
-
- /**
- * Maps this instance to a Match of another type.
- * @param mapper transformation function
- * @param <V> new match type
- * @return new instance
- */
- public <V> Match<V> map(Function<T, V> mapper) {
- if (matchAny) {
- return any();
- } else if (value == null) {
- return ifNull();
- } else {
- return ifValue(mapper.apply(value));
- }
- }
-
- /**
- * Checks if this instance matches specified value.
- * @param other other value
- * @return true if matches; false otherwise
- */
- public boolean matches(T other) {
- if (matchAny) {
- return true;
- } else if (other == null) {
- return value == null;
- } else {
- if (value instanceof byte[]) {
- return Arrays.equals((byte[]) value, (byte[]) other);
- }
- return Objects.equals(value, other);
- }
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(matchAny, value);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof Match)) {
- return false;
- }
- Match<T> that = (Match<T>) other;
- return Objects.equals(this.matchAny, that.matchAny) &&
- Objects.equals(this.value, that.value);
- }
-
- @Override
- public String toString() {
- return toStringHelper(this)
- .add("matchAny", matchAny)
- .add("value", value)
- .toString();
- }
-}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
index f741b36..a78a44a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
@@ -20,9 +20,12 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+
import net.kuujo.copycat.Task;
import net.kuujo.copycat.cluster.Cluster;
import net.kuujo.copycat.resource.ResourceState;
+
+import org.onlab.util.Match;
import org.onosproject.store.service.DatabaseUpdate;
import org.onosproject.store.service.Transaction;
import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
index 5fc8113..8076ba5 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
@@ -32,6 +32,7 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.onlab.util.Match;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.DefaultApplicationId;
import org.onosproject.store.service.Serializer;
diff --git a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java
deleted file mode 100644
index 952393a..0000000
--- a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.consistent.impl;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
-
-import org.junit.Test;
-
-import com.google.common.base.Objects;
-
-/**
- * Unit tests for Match.
- */
-public class MatchTest {
-
- @Test
- public void testMatches() {
- Match<String> m1 = Match.any();
- assertTrue(m1.matches(null));
- assertTrue(m1.matches("foo"));
- assertTrue(m1.matches("bar"));
-
- Match<String> m2 = Match.ifNull();
- assertTrue(m2.matches(null));
- assertFalse(m2.matches("foo"));
-
- Match<String> m3 = Match.ifValue("foo");
- assertFalse(m3.matches(null));
- assertFalse(m3.matches("bar"));
- assertTrue(m3.matches("foo"));
- }
-
- @Test
- public void testEquals() {
- Match<String> m1 = Match.any();
- Match<String> m2 = Match.any();
- Match<String> m3 = Match.ifNull();
- Match<String> m4 = Match.ifValue("bar");
- assertEquals(m1, m2);
- assertFalse(Objects.equal(m1, m3));
- assertFalse(Objects.equal(m3, m4));
- }
-
- @Test
- public void testMap() {
- Match<String> m1 = Match.ifNull();
- assertEquals(m1.map(s -> "bar"), Match.ifNull());
- Match<String> m2 = Match.ifValue("foo");
- Match<String> m3 = m2.map(s -> "bar");
- assertTrue(m3.matches("bar"));
- }
-}