2 * Copyright (c) 2017 Pantheon Technologies 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.mdsal.binding.javav2.dom.adapter.test;
10 import static com.google.common.base.Preconditions.checkState;
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.DOMDataBroker;
40 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
41 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
42 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
43 import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
44 import org.opendaylight.mdsal.dom.api.DOMRpcService;
45 import org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl;
46 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
47 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter;
48 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
49 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
50 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
51 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
54 public class BindingTestContext implements AutoCloseable {
56 private final MockSchemaService mockSchemaService = new MockSchemaService();
57 private final ListeningExecutorService executor;
58 private final ClassPool classPool;
59 private final boolean startWithSchema;
61 private DOMMountPointService biMountImpl;
62 private BindingToNormalizedNodeCodec codec;
63 private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
64 private DOMDataBroker newDOMDataBroker;
65 private DataBroker dataBroker;
66 private RpcActionConsumerRegistry baConsumerRpc;
67 private BindingDOMOperationProviderServiceAdapter baProviderRpc;
68 private DOMRpcRouter domRouter;
69 private NotificationPublishService publishService;
70 private NotificationService listenService;
71 private DOMNotificationPublishService domPublishService;
72 private DOMNotificationService domListenService;
74 public DOMDataBroker getDomAsyncDataBroker() {
75 return newDOMDataBroker;
78 public BindingToNormalizedNodeCodec getCodec() {
82 protected BindingTestContext(final ListeningExecutorService executor, final ClassPool classPool,
83 final boolean startWithSchema) {
84 this.executor = executor;
85 this.classPool = classPool;
86 this.startWithSchema = startWithSchema;
89 public void startDomDataBroker() {
92 public void startNewDataBroker() {
93 checkState(executor != null, "Executor needs to be set");
94 checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
95 dataBroker = new BindingDOMDataBrokerAdapter(newDOMDataBroker, codec);
98 public void startNewDomDataBroker() {
99 checkState(executor != null, "Executor needs to be set");
100 final InMemoryDOMDataStore operStore =
101 new InMemoryDOMDataStore("OPER", MoreExecutors.newDirectExecutorService());
102 final InMemoryDOMDataStore configStore =
103 new InMemoryDOMDataStore("CFG", MoreExecutors.newDirectExecutorService());
105 ImmutableMap.<LogicalDatastoreType, DOMStore>builder().put(LogicalDatastoreType.OPERATIONAL, operStore)
106 .put(LogicalDatastoreType.CONFIGURATION, configStore).build();
108 newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
110 mockSchemaService.registerSchemaContextListener(configStore);
111 mockSchemaService.registerSchemaContextListener(operStore);
114 public void startBindingDataBroker() {
118 public void startBindingBroker() {
119 checkState(executor != null, "Executor needs to be set");
121 baConsumerRpc = new BindingDOMOperationServiceAdapter(getDomRpcInvoker(), codec);
122 baProviderRpc = new BindingDOMOperationProviderServiceAdapter(getDomRpcRegistry(), codec);
123 final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
126 public void startForwarding() {
130 public void startBindingToDomMappingService() {
131 checkState(classPool != null, "ClassPool needs to be present");
133 final TreeNodeSerializerGenerator generator =
134 StreamWriterGenerator.create(JavassistUtils.forClassPool(classPool));
135 final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator);
136 final GeneratedClassLoadingStrategy loading =
137 (GeneratedClassLoadingStrategy) GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
138 codec = new BindingToNormalizedNodeCodec(loading, codecRegistry);
139 mockSchemaService.registerSchemaContextListener(codec);
142 private void updateYangSchema(final ImmutableSet<YangModuleInfo> moduleInfos) {
143 mockSchemaService.changeSchema(getContext(moduleInfos));
146 private SchemaContext getContext(final ImmutableSet<YangModuleInfo> moduleInfos) {
147 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
148 ctx.addModuleInfos(moduleInfos);
149 return ctx.tryToCreateSchemaContext().get();
152 public SchemaContext getContext() {
153 return mockSchemaService.getSchemaContext();
156 public void start() {
157 startNewDomDataBroker();
160 startDomMountPoint();
161 startBindingToDomMappingService();
162 startNewDataBroker();
163 startBindingNotificationBroker();
164 startBindingBroker();
167 if (startWithSchema) {
168 loadYangSchemaFromClasspath();
172 private void startDomMountPoint() {
173 biMountImpl = new DOMMountPointServiceImpl();
176 private void startDomBroker() {
177 checkState(executor != null);
178 domRouter = new DOMRpcRouter();
179 mockSchemaService.registerSchemaContextListener(domRouter);
182 public void startBindingNotificationBroker() {
183 checkState(executor != null);
184 final DOMNotificationRouter router = DOMNotificationRouter.create(16);
185 domPublishService = router;
186 domListenService = router;
187 publishService = new BindingDOMNotificationPublishServiceAdapter(codec, domPublishService);
188 listenService = new BindingDOMNotificationServiceAdapter(codec, domListenService);
192 public void loadYangSchemaFromClasspath() {
193 final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
194 updateYangSchema(moduleInfos);
197 public DOMRpcProviderService getDomRpcRegistry() {
201 public DOMRpcService getDomRpcInvoker() {
206 public void close() throws Exception {
210 public DOMMountPointService getDomMountProviderService() {
214 public DataBroker getDataBroker() {