Binding2 - Implement RpcActionProviderService
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / test / BindingTestContext.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies 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.mdsal.binding.javav2.dom.adapter.test;
9
10 import static com.google.common.base.Preconditions.checkState;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableMap;
14 import com.google.common.collect.ImmutableSet;
15 import com.google.common.util.concurrent.ListeningExecutorService;
16 import com.google.common.util.concurrent.MoreExecutors;
17 import javassist.ClassPool;
18 import org.opendaylight.mdsal.binding.javav2.api.DataBroker;
19 import org.opendaylight.mdsal.binding.javav2.api.MountPointService;
20 import org.opendaylight.mdsal.binding.javav2.api.NotificationPublishService;
21 import org.opendaylight.mdsal.binding.javav2.api.NotificationService;
22 import org.opendaylight.mdsal.binding.javav2.api.RpcActionConsumerRegistry;
23 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.data.BindingDOMDataBrokerAdapter;
24 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.mountpoint.BindingDOMMountPointServiceAdapter;
25 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.notification.BindingDOMNotificationPublishServiceAdapter;
26 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.notification.BindingDOMNotificationServiceAdapter;
27 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation.BindingDOMOperationProviderServiceAdapter;
28 import org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation.BindingDOMOperationServiceAdapter;
29 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.api.TreeNodeSerializerGenerator;
30 import org.opendaylight.mdsal.binding.javav2.dom.codec.generator.impl.StreamWriterGenerator;
31 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
32 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
33 import org.opendaylight.mdsal.binding.javav2.generator.impl.GeneratedClassLoadingStrategy;
34 import org.opendaylight.mdsal.binding.javav2.runtime.context.ModuleInfoBackedContext;
35 import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
36 import org.opendaylight.mdsal.binding.javav2.runtime.reflection.BindingReflections;
37 import org.opendaylight.mdsal.binding.javav2.spec.runtime.YangModuleInfo;
38 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
39 import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
40 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
41 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
42 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
43 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
44 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
45 import org.opendaylight.mdsal.dom.api.DOMRpcService;
46 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
47 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
48 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
49 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
50 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
51 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
52 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
53
54 @Beta
55 public class BindingTestContext implements AutoCloseable {
56
57     private final MockSchemaService mockSchemaService = new MockSchemaService();
58     private final ListeningExecutorService executor;
59     private final ClassPool classPool;
60     private final boolean startWithSchema;
61
62     private DOMMountPointService biMountImpl;
63     private BindingToNormalizedNodeCodec codec;
64     private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
65     private DOMDataBroker newDOMDataBroker;
66     private DataBroker dataBroker;
67     private RpcActionConsumerRegistry baConsumerRpc;
68     private BindingDOMOperationProviderServiceAdapter baProviderRpc;
69     private DOMRpcRouter domRouter;
70     private NotificationPublishService publishService;
71     private NotificationService listenService;
72     private DOMNotificationPublishService domPublishService;
73     private DOMNotificationService domListenService;
74
75     public DOMDataBroker getDomAsyncDataBroker() {
76         return newDOMDataBroker;
77     }
78
79     public BindingToNormalizedNodeCodec getCodec() {
80         return codec;
81     }
82
83     protected BindingTestContext(final ListeningExecutorService executor, final ClassPool classPool,
84             final boolean startWithSchema) {
85         this.executor = executor;
86         this.classPool = classPool;
87         this.startWithSchema = startWithSchema;
88     }
89
90     public void startDomDataBroker() {
91     }
92
93     public void startNewDataBroker() {
94         checkState(executor != null, "Executor needs to be set");
95         checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
96         dataBroker = new BindingDOMDataBrokerAdapter(newDOMDataBroker, codec);
97     }
98
99     public void startNewDomDataBroker() {
100         checkState(executor != null, "Executor needs to be set");
101         final InMemoryDOMDataStore operStore =
102                 new InMemoryDOMDataStore("OPER", MoreExecutors.newDirectExecutorService());
103         final InMemoryDOMDataStore configStore =
104                 new InMemoryDOMDataStore("CFG", MoreExecutors.newDirectExecutorService());
105         newDatastores =
106                 ImmutableMap.<LogicalDatastoreType, DOMStore>builder().put(LogicalDatastoreType.OPERATIONAL, operStore)
107                         .put(LogicalDatastoreType.CONFIGURATION, configStore).build();
108
109         newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
110
111         mockSchemaService.registerSchemaContextListener(configStore);
112         mockSchemaService.registerSchemaContextListener(operStore);
113     }
114
115     public void startBindingDataBroker() {
116
117     }
118
119     public void startBindingBroker() {
120         checkState(executor != null, "Executor needs to be set");
121
122         baConsumerRpc = new BindingDOMOperationServiceAdapter(getDomRpcInvoker(), codec);
123         baProviderRpc = new BindingDOMOperationProviderServiceAdapter(getDomRpcRegistry(), getDomActionRegistry(),
124             codec);
125         final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
126     }
127
128     public void startForwarding() {
129
130     }
131
132     public void startBindingToDomMappingService() {
133         checkState(classPool != null, "ClassPool needs to be present");
134
135         final TreeNodeSerializerGenerator generator =
136                 StreamWriterGenerator.create(JavassistUtils.forClassPool(classPool));
137         final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator);
138         final GeneratedClassLoadingStrategy loading =
139                 (GeneratedClassLoadingStrategy) GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
140         codec = new BindingToNormalizedNodeCodec(loading, codecRegistry);
141         mockSchemaService.registerSchemaContextListener(codec);
142     }
143
144     private void updateYangSchema(final ImmutableSet<YangModuleInfo> moduleInfos) {
145         mockSchemaService.changeSchema(getContext(moduleInfos));
146     }
147
148     private static SchemaContext getContext(final ImmutableSet<YangModuleInfo> moduleInfos) {
149         final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
150         ctx.addModuleInfos(moduleInfos);
151         return ctx.tryToCreateSchemaContext().get();
152     }
153
154     public SchemaContext getContext() {
155         return mockSchemaService.getSchemaContext();
156     }
157
158     public void start() {
159         startNewDomDataBroker();
160
161         startDomBroker();
162         startDomMountPoint();
163         startBindingToDomMappingService();
164         startNewDataBroker();
165         startBindingNotificationBroker();
166         startBindingBroker();
167
168         startForwarding();
169         if (startWithSchema) {
170             loadYangSchemaFromClasspath();
171         }
172     }
173
174     private void startDomMountPoint() {
175         biMountImpl = new DOMMountPointServiceImpl();
176     }
177
178     private void startDomBroker() {
179         checkState(executor != null);
180         domRouter = new DOMRpcRouter();
181         mockSchemaService.registerSchemaContextListener(domRouter);
182     }
183
184     public void startBindingNotificationBroker() {
185         checkState(executor != null);
186         final DOMNotificationRouter router = DOMNotificationRouter.create(16);
187         domPublishService = router;
188         domListenService = router;
189         publishService = new BindingDOMNotificationPublishServiceAdapter(codec, domPublishService);
190         listenService = new BindingDOMNotificationServiceAdapter(codec, domListenService);
191
192     }
193
194     public void loadYangSchemaFromClasspath() {
195         final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
196         updateYangSchema(moduleInfos);
197     }
198
199     public DOMRpcProviderService getDomRpcRegistry() {
200         return domRouter.getRpcProviderService();
201     }
202
203     public DOMActionProviderService getDomActionRegistry() {
204         return domRouter.getActionProviderService();
205     }
206
207     public DOMRpcService getDomRpcInvoker() {
208         return domRouter.getRpcService();
209     }
210
211     @Override
212     public void close() throws Exception {
213
214     }
215
216     public DOMMountPointService getDomMountProviderService() {
217         return biMountImpl;
218     }
219
220     public DataBroker getDataBroker() {
221         return dataBroker;
222     }
223 }