2 * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore;
10 import static java.util.Objects.requireNonNull;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.function.Predicate;
15 import org.opendaylight.controller.cluster.datastore.persisted.FrontendShardDataTreeSnapshotMetadata;
17 public class TestShard extends Shard {
18 public static class Builder extends Shard.Builder {
20 super(TestShard.class);
24 // Message to request FrontendMetadata
25 public static final class RequestFrontendMetadata {
29 private abstract static class DropMessages<T> {
30 private final Class<T> msgClass;
32 DropMessages(final Class<T> msgClass) {
33 this.msgClass = requireNonNull(msgClass);
36 final Class<T> getMsgClass() {
41 public static class StartDropMessages<T> extends DropMessages<T> {
42 public StartDropMessages(final Class<T> msgClass) {
47 public static class StopDropMessages<T> extends DropMessages<T> {
48 public StopDropMessages(final Class<T> msgClass) {
53 private final Map<Class<?>, Predicate<?>> dropMessages = new ConcurrentHashMap<>();
55 protected TestShard(AbstractBuilder<?, ?> builder) {
60 protected void handleNonRaftCommand(Object message) {
61 if (message instanceof RequestFrontendMetadata) {
62 FrontendShardDataTreeSnapshotMetadata metadataSnapshot = frontendMetadata.toSnapshot();
63 sender().tell(metadataSnapshot, self());
65 super.handleNonRaftCommand(message);
70 protected void handleCommand(Object message) {
71 if (message instanceof StartDropMessages) {
72 startDropMessages(((StartDropMessages<?>) message).getMsgClass());
73 } else if (message instanceof StopDropMessages) {
74 stopDropMessages(((StopDropMessages<?>) message).getMsgClass());
76 dropOrHandle(message);
80 private <T> void dropOrHandle(T message) {
81 Predicate<T> drop = (Predicate<T>) dropMessages.get(message.getClass());
82 if (drop == null || !drop.test(message)) {
83 super.handleCommand(message);
87 private void startDropMessages(final Class<?> msgClass) {
88 dropMessages.put(msgClass, msg -> true);
91 <T> void startDropMessages(final Class<T> msgClass, final Predicate<T> filter) {
92 dropMessages.put(msgClass, filter);
95 public void stopDropMessages(final Class<?> msgClass) {
96 dropMessages.remove(msgClass);
99 public static TestShard.Builder builder() {
100 return new TestShard.Builder();