Committed by
Gerrit Code Review
Added Change utility class for representing change events + Moved Match class to org.onlab.util
Change-Id: I08e8cd8dd92983bd2764e83016b1abc0bf29388f
Showing
13 changed files
with
177 additions
and
16 deletions
| 1 | +/* | ||
| 2 | + * Copyright 2016 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.event; | ||
| 17 | + | ||
| 18 | +import com.google.common.base.MoreObjects; | ||
| 19 | +import com.google.common.base.Objects; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * Generic representation of an update. | ||
| 23 | + * | ||
| 24 | + * @param <T> type of value that was updated | ||
| 25 | + */ | ||
| 26 | +public class Change<T> { | ||
| 27 | + | ||
| 28 | + private final T oldValue; | ||
| 29 | + private final T newValue; | ||
| 30 | + | ||
| 31 | + public Change(T oldValue, T newValue) { | ||
| 32 | + this.oldValue = oldValue; | ||
| 33 | + this.newValue = newValue; | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + /** | ||
| 37 | + * Returns previous value. | ||
| 38 | + * @return previous value. | ||
| 39 | + */ | ||
| 40 | + public T oldValue() { | ||
| 41 | + return oldValue; | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * Returns new or current value. | ||
| 46 | + * @return new value. | ||
| 47 | + */ | ||
| 48 | + public T newValue() { | ||
| 49 | + return newValue; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public boolean equals(Object other) { | ||
| 54 | + if (other == null || !(other instanceof Change)) { | ||
| 55 | + return false; | ||
| 56 | + } | ||
| 57 | + Change<T> that = (Change<T>) other; | ||
| 58 | + return Objects.equal(this.oldValue, that.oldValue) && | ||
| 59 | + Objects.equal(this.newValue, that.newValue); | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + @Override | ||
| 63 | + public int hashCode() { | ||
| 64 | + return Objects.hashCode(oldValue, newValue); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + @Override | ||
| 68 | + public String toString() { | ||
| 69 | + return MoreObjects.toStringHelper(getClass()) | ||
| 70 | + .add("oldValue", oldValue) | ||
| 71 | + .add("newValue", newValue) | ||
| 72 | + .toString(); | ||
| 73 | + } | ||
| 74 | +} |
| 1 | +package org.onosproject.event; | ||
| 2 | + | ||
| 3 | +import org.junit.Test; | ||
| 4 | + | ||
| 5 | +import com.google.common.testing.EqualsTester; | ||
| 6 | + | ||
| 7 | +import static org.junit.Assert.*; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * Unit tests for {@link Change}. | ||
| 11 | + */ | ||
| 12 | +public class ChangeTest { | ||
| 13 | + | ||
| 14 | + @Test | ||
| 15 | + public void getters() { | ||
| 16 | + Change<String> change = new Change<>("a", "b"); | ||
| 17 | + assertEquals("a", change.oldValue()); | ||
| 18 | + assertEquals("b", change.newValue()); | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + @Test | ||
| 22 | + public void equality() { | ||
| 23 | + new EqualsTester() | ||
| 24 | + .addEqualityGroup(new Change<>("foo", "bar"), | ||
| 25 | + new Change<>("foo", "bar")) | ||
| 26 | + .addEqualityGroup(new Change<>("bar", "car")) | ||
| 27 | + .testEquals(); | ||
| 28 | + } | ||
| 29 | +} |
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.store.consistent.impl; | 17 | package org.onosproject.store.consistent.impl; |
| 18 | 18 | ||
| 19 | +import org.onlab.util.Match; | ||
| 19 | import org.onosproject.store.service.Transaction; | 20 | import org.onosproject.store.service.Transaction; |
| 20 | import org.onosproject.store.service.Versioned; | 21 | import org.onosproject.store.service.Versioned; |
| 21 | 22 | ... | ... |
| ... | @@ -19,6 +19,7 @@ package org.onosproject.store.consistent.impl; | ... | @@ -19,6 +19,7 @@ package org.onosproject.store.consistent.impl; |
| 19 | import java.nio.ByteBuffer; | 19 | import java.nio.ByteBuffer; |
| 20 | 20 | ||
| 21 | import org.onlab.util.KryoNamespace; | 21 | import org.onlab.util.KryoNamespace; |
| 22 | +import org.onlab.util.Match; | ||
| 22 | import org.onosproject.cluster.NodeId; | 23 | import org.onosproject.cluster.NodeId; |
| 23 | import org.onosproject.store.serializers.KryoNamespaces; | 24 | import org.onosproject.store.serializers.KryoNamespaces; |
| 24 | import org.onosproject.store.serializers.KryoSerializer; | 25 | import org.onosproject.store.serializers.KryoSerializer; | ... | ... |
| ... | @@ -20,6 +20,8 @@ import net.kuujo.copycat.state.Command; | ... | @@ -20,6 +20,8 @@ import net.kuujo.copycat.state.Command; |
| 20 | import net.kuujo.copycat.state.Initializer; | 20 | import net.kuujo.copycat.state.Initializer; |
| 21 | import net.kuujo.copycat.state.Query; | 21 | import net.kuujo.copycat.state.Query; |
| 22 | import net.kuujo.copycat.state.StateContext; | 22 | import net.kuujo.copycat.state.StateContext; |
| 23 | + | ||
| 24 | +import org.onlab.util.Match; | ||
| 23 | import org.onosproject.store.service.Transaction; | 25 | import org.onosproject.store.service.Transaction; |
| 24 | import org.onosproject.store.service.Versioned; | 26 | import org.onosproject.store.service.Versioned; |
| 25 | 27 | ... | ... |
| ... | @@ -22,6 +22,7 @@ import com.google.common.cache.LoadingCache; | ... | @@ -22,6 +22,7 @@ import com.google.common.cache.LoadingCache; |
| 22 | import com.google.common.collect.Maps; | 22 | import com.google.common.collect.Maps; |
| 23 | 23 | ||
| 24 | import org.onlab.util.HexString; | 24 | import org.onlab.util.HexString; |
| 25 | +import org.onlab.util.Match; | ||
| 25 | import org.onlab.util.SharedExecutors; | 26 | import org.onlab.util.SharedExecutors; |
| 26 | import org.onlab.util.Tools; | 27 | import org.onlab.util.Tools; |
| 27 | import org.onosproject.core.ApplicationId; | 28 | import org.onosproject.core.ApplicationId; | ... | ... |
| ... | @@ -17,12 +17,15 @@ | ... | @@ -17,12 +17,15 @@ |
| 17 | package org.onosproject.store.consistent.impl; | 17 | package org.onosproject.store.consistent.impl; |
| 18 | 18 | ||
| 19 | import com.google.common.collect.Sets; | 19 | import com.google.common.collect.Sets; |
| 20 | + | ||
| 20 | import net.kuujo.copycat.resource.internal.AbstractResource; | 21 | import net.kuujo.copycat.resource.internal.AbstractResource; |
| 21 | import net.kuujo.copycat.resource.internal.ResourceManager; | 22 | import net.kuujo.copycat.resource.internal.ResourceManager; |
| 22 | import net.kuujo.copycat.state.StateMachine; | 23 | import net.kuujo.copycat.state.StateMachine; |
| 23 | import net.kuujo.copycat.state.internal.DefaultStateMachine; | 24 | import net.kuujo.copycat.state.internal.DefaultStateMachine; |
| 24 | import net.kuujo.copycat.util.concurrent.Futures; | 25 | import net.kuujo.copycat.util.concurrent.Futures; |
| 25 | import net.kuujo.copycat.util.function.TriConsumer; | 26 | import net.kuujo.copycat.util.function.TriConsumer; |
| 27 | + | ||
| 28 | +import org.onlab.util.Match; | ||
| 26 | import org.onosproject.store.service.Transaction; | 29 | import org.onosproject.store.service.Transaction; |
| 27 | import org.onosproject.store.service.Versioned; | 30 | import org.onosproject.store.service.Versioned; |
| 28 | 31 | ... | ... |
| ... | @@ -21,8 +21,11 @@ import com.google.common.collect.ImmutableList; | ... | @@ -21,8 +21,11 @@ import com.google.common.collect.ImmutableList; |
| 21 | import com.google.common.collect.ImmutableSet; | 21 | import com.google.common.collect.ImmutableSet; |
| 22 | import com.google.common.collect.Lists; | 22 | import com.google.common.collect.Lists; |
| 23 | import com.google.common.collect.Maps; | 23 | import com.google.common.collect.Maps; |
| 24 | + | ||
| 24 | import net.kuujo.copycat.state.Initializer; | 25 | import net.kuujo.copycat.state.Initializer; |
| 25 | import net.kuujo.copycat.state.StateContext; | 26 | import net.kuujo.copycat.state.StateContext; |
| 27 | + | ||
| 28 | +import org.onlab.util.Match; | ||
| 26 | import org.onosproject.store.service.DatabaseUpdate; | 29 | import org.onosproject.store.service.DatabaseUpdate; |
| 27 | import org.onosproject.store.service.Transaction; | 30 | import org.onosproject.store.service.Transaction; |
| 28 | import org.onosproject.store.service.Versioned; | 31 | import org.onosproject.store.service.Versioned; | ... | ... |
| ... | @@ -20,9 +20,12 @@ import com.google.common.collect.ImmutableList; | ... | @@ -20,9 +20,12 @@ import com.google.common.collect.ImmutableList; |
| 20 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
| 21 | import com.google.common.collect.Maps; | 21 | import com.google.common.collect.Maps; |
| 22 | import com.google.common.collect.Sets; | 22 | import com.google.common.collect.Sets; |
| 23 | + | ||
| 23 | import net.kuujo.copycat.Task; | 24 | import net.kuujo.copycat.Task; |
| 24 | import net.kuujo.copycat.cluster.Cluster; | 25 | import net.kuujo.copycat.cluster.Cluster; |
| 25 | import net.kuujo.copycat.resource.ResourceState; | 26 | import net.kuujo.copycat.resource.ResourceState; |
| 27 | + | ||
| 28 | +import org.onlab.util.Match; | ||
| 26 | import org.onosproject.store.service.DatabaseUpdate; | 29 | import org.onosproject.store.service.DatabaseUpdate; |
| 27 | import org.onosproject.store.service.Transaction; | 30 | import org.onosproject.store.service.Transaction; |
| 28 | import org.onosproject.store.service.Versioned; | 31 | import org.onosproject.store.service.Versioned; | ... | ... |
| ... | @@ -32,6 +32,7 @@ import java.util.function.Consumer; | ... | @@ -32,6 +32,7 @@ import java.util.function.Consumer; |
| 32 | import org.junit.After; | 32 | import org.junit.After; |
| 33 | import org.junit.Before; | 33 | import org.junit.Before; |
| 34 | import org.junit.Test; | 34 | import org.junit.Test; |
| 35 | +import org.onlab.util.Match; | ||
| 35 | import org.onosproject.core.ApplicationId; | 36 | import org.onosproject.core.ApplicationId; |
| 36 | import org.onosproject.core.DefaultApplicationId; | 37 | import org.onosproject.core.DefaultApplicationId; |
| 37 | import org.onosproject.store.service.Serializer; | 38 | import org.onosproject.store.service.Serializer; | ... | ... |
| ... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
| 13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | -package org.onosproject.store.consistent.impl; | 16 | +package org.onlab.util; |
| 17 | 17 | ||
| 18 | import static com.google.common.base.MoreObjects.toStringHelper; | 18 | import static com.google.common.base.MoreObjects.toStringHelper; |
| 19 | 19 | ||
| ... | @@ -28,16 +28,21 @@ import java.util.function.Function; | ... | @@ -28,16 +28,21 @@ import java.util.function.Function; |
| 28 | */ | 28 | */ |
| 29 | public final class Match<T> { | 29 | public final class Match<T> { |
| 30 | 30 | ||
| 31 | + public static final Match ANY = new Match<>(); | ||
| 32 | + public static final Match NULL = new Match<>(null, false); | ||
| 33 | + public static final Match NOT_NULL = new Match<>(null, true); | ||
| 34 | + | ||
| 31 | private final boolean matchAny; | 35 | private final boolean matchAny; |
| 32 | private final T value; | 36 | private final T value; |
| 37 | + private final boolean negation; | ||
| 33 | 38 | ||
| 34 | /** | 39 | /** |
| 35 | - * Returns a Match that matches any value. | 40 | + * Returns a Match that matches any value including null. |
| 36 | * @param <T> match type | 41 | * @param <T> match type |
| 37 | * @return new instance | 42 | * @return new instance |
| 38 | */ | 43 | */ |
| 39 | public static <T> Match<T> any() { | 44 | public static <T> Match<T> any() { |
| 40 | - return new Match<>(); | 45 | + return ANY; |
| 41 | } | 46 | } |
| 42 | 47 | ||
| 43 | /** | 48 | /** |
| ... | @@ -46,27 +51,48 @@ public final class Match<T> { | ... | @@ -46,27 +51,48 @@ public final class Match<T> { |
| 46 | * @return new instance | 51 | * @return new instance |
| 47 | */ | 52 | */ |
| 48 | public static <T> Match<T> ifNull() { | 53 | public static <T> Match<T> ifNull() { |
| 49 | - return ifValue(null); | 54 | + return NULL; |
| 55 | + } | ||
| 56 | + | ||
| 57 | + /** | ||
| 58 | + * Returns a Match that matches all non-null values. | ||
| 59 | + * @param <T> match type | ||
| 60 | + * @return new instance | ||
| 61 | + */ | ||
| 62 | + public static <T> Match<T> ifNotNull() { | ||
| 63 | + return NOT_NULL; | ||
| 50 | } | 64 | } |
| 51 | 65 | ||
| 52 | /** | 66 | /** |
| 53 | - * Returns a Match that matches only specified value. | 67 | + * Returns a Match that only matches the specified value. |
| 54 | * @param value value to match | 68 | * @param value value to match |
| 55 | * @param <T> match type | 69 | * @param <T> match type |
| 56 | * @return new instance | 70 | * @return new instance |
| 57 | */ | 71 | */ |
| 58 | public static <T> Match<T> ifValue(T value) { | 72 | public static <T> Match<T> ifValue(T value) { |
| 59 | - return new Match<>(value); | 73 | + return new Match<>(value, false); |
| 74 | + } | ||
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * Returns a Match that matches any value except the specified value. | ||
| 78 | + * @param value value to not match | ||
| 79 | + * @param <T> match type | ||
| 80 | + * @return new instance | ||
| 81 | + */ | ||
| 82 | + public static <T> Match<T> ifNotValue(T value) { | ||
| 83 | + return new Match<>(value, true); | ||
| 60 | } | 84 | } |
| 61 | 85 | ||
| 62 | private Match() { | 86 | private Match() { |
| 63 | matchAny = true; | 87 | matchAny = true; |
| 88 | + negation = false; | ||
| 64 | value = null; | 89 | value = null; |
| 65 | } | 90 | } |
| 66 | 91 | ||
| 67 | - private Match(T value) { | 92 | + private Match(T value, boolean negation) { |
| 68 | matchAny = false; | 93 | matchAny = false; |
| 69 | this.value = value; | 94 | this.value = value; |
| 95 | + this.negation = negation; | ||
| 70 | } | 96 | } |
| 71 | 97 | ||
| 72 | /** | 98 | /** |
| ... | @@ -79,9 +105,9 @@ public final class Match<T> { | ... | @@ -79,9 +105,9 @@ public final class Match<T> { |
| 79 | if (matchAny) { | 105 | if (matchAny) { |
| 80 | return any(); | 106 | return any(); |
| 81 | } else if (value == null) { | 107 | } else if (value == null) { |
| 82 | - return ifNull(); | 108 | + return negation ? ifNotNull() : ifNull(); |
| 83 | } else { | 109 | } else { |
| 84 | - return ifValue(mapper.apply(value)); | 110 | + return negation ? ifNotValue(mapper.apply(value)) : ifValue(mapper.apply(value)); |
| 85 | } | 111 | } |
| 86 | } | 112 | } |
| 87 | 113 | ||
| ... | @@ -94,21 +120,21 @@ public final class Match<T> { | ... | @@ -94,21 +120,21 @@ public final class Match<T> { |
| 94 | if (matchAny) { | 120 | if (matchAny) { |
| 95 | return true; | 121 | return true; |
| 96 | } else if (other == null) { | 122 | } else if (other == null) { |
| 97 | - return value == null; | 123 | + return negation ? value != null : value == null; |
| 98 | } else { | 124 | } else { |
| 99 | if (value instanceof byte[]) { | 125 | if (value instanceof byte[]) { |
| 100 | - return Arrays.equals((byte[]) value, (byte[]) other); | 126 | + boolean equal = Arrays.equals((byte[]) value, (byte[]) other); |
| 127 | + return negation ? !equal : equal; | ||
| 101 | } | 128 | } |
| 102 | - return Objects.equals(value, other); | 129 | + return negation ? !Objects.equals(value, other) : Objects.equals(value, other); |
| 103 | } | 130 | } |
| 104 | } | 131 | } |
| 105 | 132 | ||
| 106 | @Override | 133 | @Override |
| 107 | public int hashCode() { | 134 | public int hashCode() { |
| 108 | - return Objects.hash(matchAny, value); | 135 | + return Objects.hash(matchAny, value, negation); |
| 109 | } | 136 | } |
| 110 | 137 | ||
| 111 | - @SuppressWarnings("unchecked") | ||
| 112 | @Override | 138 | @Override |
| 113 | public boolean equals(Object other) { | 139 | public boolean equals(Object other) { |
| 114 | if (!(other instanceof Match)) { | 140 | if (!(other instanceof Match)) { |
| ... | @@ -116,13 +142,15 @@ public final class Match<T> { | ... | @@ -116,13 +142,15 @@ public final class Match<T> { |
| 116 | } | 142 | } |
| 117 | Match<T> that = (Match<T>) other; | 143 | Match<T> that = (Match<T>) other; |
| 118 | return Objects.equals(this.matchAny, that.matchAny) && | 144 | return Objects.equals(this.matchAny, that.matchAny) && |
| 119 | - Objects.equals(this.value, that.value); | 145 | + Objects.equals(this.value, that.value) && |
| 146 | + Objects.equals(this.negation, that.negation); | ||
| 120 | } | 147 | } |
| 121 | 148 | ||
| 122 | @Override | 149 | @Override |
| 123 | public String toString() { | 150 | public String toString() { |
| 124 | return toStringHelper(this) | 151 | return toStringHelper(this) |
| 125 | .add("matchAny", matchAny) | 152 | .add("matchAny", matchAny) |
| 153 | + .add("negation", negation) | ||
| 126 | .add("value", value) | 154 | .add("value", value) |
| 127 | .toString(); | 155 | .toString(); |
| 128 | } | 156 | } | ... | ... |
| ... | @@ -54,6 +54,7 @@ import java.util.stream.StreamSupport; | ... | @@ -54,6 +54,7 @@ import java.util.stream.StreamSupport; |
| 54 | 54 | ||
| 55 | import org.slf4j.Logger; | 55 | import org.slf4j.Logger; |
| 56 | 56 | ||
| 57 | +import com.google.common.base.Charsets; | ||
| 57 | import com.google.common.base.Strings; | 58 | import com.google.common.base.Strings; |
| 58 | import com.google.common.primitives.UnsignedLongs; | 59 | import com.google.common.primitives.UnsignedLongs; |
| 59 | import com.google.common.util.concurrent.ThreadFactoryBuilder; | 60 | import com.google.common.util.concurrent.ThreadFactoryBuilder; |
| ... | @@ -210,6 +211,20 @@ public abstract class Tools { | ... | @@ -210,6 +211,20 @@ public abstract class Tools { |
| 210 | } | 211 | } |
| 211 | 212 | ||
| 212 | /** | 213 | /** |
| 214 | + * Returns the UTF-8 encoded byte[] representation of a String. | ||
| 215 | + */ | ||
| 216 | + public static byte[] getBytesUtf8(String input) { | ||
| 217 | + return input.getBytes(Charsets.UTF_8); | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + /** | ||
| 221 | + * Returns the String representation of UTF-8 encoded byte[]. | ||
| 222 | + */ | ||
| 223 | + public static String toStringUtf8(byte[] input) { | ||
| 224 | + return new String(input, Charsets.UTF_8); | ||
| 225 | + } | ||
| 226 | + | ||
| 227 | + /** | ||
| 213 | * Returns a copy of the input byte array. | 228 | * Returns a copy of the input byte array. |
| 214 | * | 229 | * |
| 215 | * @param original input | 230 | * @param original input | ... | ... |
| ... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
| 13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | -package org.onosproject.store.consistent.impl; | 16 | +package org.onlab.util; |
| 17 | 17 | ||
| 18 | import static junit.framework.TestCase.assertEquals; | 18 | import static junit.framework.TestCase.assertEquals; |
| 19 | import static junit.framework.TestCase.assertFalse; | 19 | import static junit.framework.TestCase.assertFalse; | ... | ... |
-
Please register or login to post a comment