*/
package org.opendaylight.controller.cluster.datastore;
+import static java.util.Objects.requireNonNull;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Predicate;
import org.opendaylight.controller.cluster.datastore.persisted.FrontendShardDataTreeSnapshotMetadata;
public class TestShard extends Shard {
+ public static class Builder extends Shard.Builder {
+ Builder() {
+ super(TestShard.class);
+ }
+ }
+
// Message to request FrontendMetadata
public static final class RequestFrontendMetadata {
}
+ private abstract static class DropMessages<T> {
+ private final Class<T> msgClass;
+
+ DropMessages(final Class<T> msgClass) {
+ this.msgClass = requireNonNull(msgClass);
+ }
+
+ final Class<T> getMsgClass() {
+ return msgClass;
+ }
+ }
+
+ public static class StartDropMessages<T> extends DropMessages<T> {
+ public StartDropMessages(final Class<T> msgClass) {
+ super(msgClass);
+ }
+ }
+
+ public static class StopDropMessages<T> extends DropMessages<T> {
+ public StopDropMessages(final Class<T> msgClass) {
+ super(msgClass);
+ }
+ }
+
+ private final Map<Class<?>, Predicate<?>> dropMessages = new ConcurrentHashMap<>();
+
protected TestShard(AbstractBuilder<?, ?> builder) {
super(builder);
}
}
}
- public static Shard.Builder builder() {
- return new TestShard.Builder();
+ @Override
+ protected void handleCommand(Object message) {
+ if (message instanceof StartDropMessages) {
+ startDropMessages(((StartDropMessages<?>) message).getMsgClass());
+ } else if (message instanceof StopDropMessages) {
+ stopDropMessages(((StopDropMessages<?>) message).getMsgClass());
+ } else {
+ dropOrHandle(message);
+ }
}
- public static class Builder extends Shard.Builder {
- Builder() {
- super(TestShard.class);
+ private <T> void dropOrHandle(T message) {
+ Predicate<T> drop = (Predicate<T>) dropMessages.get(message.getClass());
+ if (drop == null || !drop.test(message)) {
+ super.handleCommand(message);
}
}
-}
+ private void startDropMessages(final Class<?> msgClass) {
+ dropMessages.put(msgClass, msg -> true);
+ }
+
+ <T> void startDropMessages(final Class<T> msgClass, final Predicate<T> filter) {
+ dropMessages.put(msgClass, filter);
+ }
+
+ public void stopDropMessages(final Class<?> msgClass) {
+ dropMessages.remove(msgClass);
+ }
+
+ public static TestShard.Builder builder() {
+ return new TestShard.Builder();
+ }
+}