Added Change utility class for representing change events + Moved Match class to org.onlab.util

Change-Id: I08e8cd8dd92983bd2764e83016b1abc0bf29388f
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;