Convert DatastoreSnapshotRestore to OSGi DS
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / TestShard.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.datastore;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.util.Map;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.function.Predicate;
15 import org.opendaylight.controller.cluster.datastore.persisted.FrontendShardDataTreeSnapshotMetadata;
16
17 public class TestShard extends Shard {
18     public static class Builder extends Shard.Builder {
19         Builder() {
20             super(TestShard.class);
21         }
22     }
23
24     // Message to request FrontendMetadata
25     public static final class RequestFrontendMetadata {
26
27     }
28
29     private abstract static class DropMessages<T> {
30         private final Class<T> msgClass;
31
32         DropMessages(final Class<T> msgClass) {
33             this.msgClass = requireNonNull(msgClass);
34         }
35
36         final Class<T> getMsgClass() {
37             return msgClass;
38         }
39     }
40
41     public static class StartDropMessages<T> extends DropMessages<T> {
42         public StartDropMessages(final Class<T> msgClass) {
43             super(msgClass);
44         }
45     }
46
47     public static class StopDropMessages<T> extends DropMessages<T> {
48         public StopDropMessages(final Class<T> msgClass) {
49             super(msgClass);
50         }
51     }
52
53     private final Map<Class<?>, Predicate<?>> dropMessages = new ConcurrentHashMap<>();
54
55     protected TestShard(AbstractBuilder<?, ?> builder) {
56         super(builder);
57     }
58
59     @Override
60     protected void handleNonRaftCommand(Object message) {
61         if (message instanceof  RequestFrontendMetadata) {
62             FrontendShardDataTreeSnapshotMetadata metadataSnapshot = frontendMetadata.toSnapshot();
63             sender().tell(metadataSnapshot, self());
64         } else {
65             super.handleNonRaftCommand(message);
66         }
67     }
68
69     @Override
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());
75         } else {
76             dropOrHandle(message);
77         }
78     }
79
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);
84         }
85     }
86
87     private void startDropMessages(final Class<?> msgClass) {
88         dropMessages.put(msgClass, msg -> true);
89     }
90
91     <T> void startDropMessages(final Class<T> msgClass, final Predicate<T> filter) {
92         dropMessages.put(msgClass, filter);
93     }
94
95     public void stopDropMessages(final Class<?> msgClass) {
96         dropMessages.remove(msgClass);
97     }
98
99     public static TestShard.Builder builder() {
100         return new TestShard.Builder();
101     }
102 }