2 * Copyright (c) 2014 Cisco Systems, Inc. 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.sal.binding.test.util;
10 import static com.google.common.base.Preconditions.checkState;
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ClassToInstanceMap;
14 import com.google.common.collect.ImmutableClassToInstanceMap;
15 import com.google.common.collect.ImmutableMap;
16 import com.google.common.collect.ImmutableSet;
17 import com.google.common.collect.MutableClassToInstanceMap;
18 import com.google.common.util.concurrent.ListeningExecutorService;
19 import com.google.common.util.concurrent.MoreExecutors;
21 import java.util.concurrent.Future;
22 import javassist.ClassPool;
23 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
24 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
25 import org.opendaylight.controller.md.sal.binding.compat.HeliumRpcProviderRegistry;
26 import org.opendaylight.controller.md.sal.binding.compat.HydrogenDataBrokerAdapter;
27 import org.opendaylight.controller.md.sal.binding.compat.HydrogenMountProvisionServiceAdapter;
28 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMMountPointServiceAdapter;
29 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcProviderServiceAdapter;
30 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcServiceAdapter;
31 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
32 import org.opendaylight.controller.md.sal.binding.impl.ForwardedBindingDataBroker;
33 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
34 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
35 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
36 import org.opendaylight.controller.md.sal.dom.api.DOMRpcProviderService;
37 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
38 import org.opendaylight.controller.md.sal.dom.broker.impl.DOMRpcRouter;
39 import org.opendaylight.controller.md.sal.dom.broker.impl.SerializedDOMDataBroker;
40 import org.opendaylight.controller.md.sal.dom.broker.impl.compat.BackwardsCompatibleDataBroker;
41 import org.opendaylight.controller.md.sal.dom.broker.impl.mount.DOMMountPointServiceImpl;
42 import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
43 import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
44 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
45 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
46 import org.opendaylight.controller.sal.binding.api.mount.MountProviderService;
47 import org.opendaylight.controller.sal.binding.impl.NotificationBrokerImpl;
48 import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker;
49 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
50 import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration;
51 import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration;
52 import org.opendaylight.controller.sal.core.api.BrokerService;
53 import org.opendaylight.controller.sal.core.api.RpcImplementation;
54 import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry;
55 import org.opendaylight.controller.sal.core.api.RpcRegistrationListener;
56 import org.opendaylight.controller.sal.core.spi.data.DOMStore;
57 import org.opendaylight.controller.sal.dom.broker.BrokerImpl;
58 import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareRpcBroker;
59 import org.opendaylight.yangtools.binding.data.codec.gen.impl.DataObjectSerializerGenerator;
60 import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
61 import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
62 import org.opendaylight.yangtools.concepts.ListenerRegistration;
63 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
64 import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
65 import org.opendaylight.yangtools.sal.binding.generator.impl.RuntimeGeneratedMappingServiceImpl;
66 import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
67 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
68 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
69 import org.opendaylight.yangtools.yang.common.QName;
70 import org.opendaylight.yangtools.yang.common.RpcResult;
71 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
72 import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
73 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
76 public class BindingTestContext implements AutoCloseable {
79 private RuntimeGeneratedMappingServiceImpl mappingServiceImpl;
80 private BindingToNormalizedNodeCodec codec;
82 private RootBindingAwareBroker baBrokerImpl;
84 private NotificationBrokerImpl baNotifyImpl;
88 private org.opendaylight.controller.sal.core.api.data.DataProviderService biDataLegacyBroker;
89 private BrokerImpl biBrokerImpl;
91 private final ListeningExecutorService executor;
92 private final ClassPool classPool;
94 private final boolean startWithSchema;
96 private DOMMountPointService biMountImpl;
98 private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
101 private BackwardsCompatibleDataBroker biCompatibleBroker;
104 private DataProviderService baData;
106 private DOMDataBroker newDOMDataBroker;
108 private final MockSchemaService mockSchemaService = new MockSchemaService();
110 private DataBroker dataBroker;
112 private RpcConsumerRegistry baConsumerRpc;
114 private BindingDOMRpcProviderServiceAdapter baProviderRpc;
115 private DOMRpcRouter domRouter;
119 public DOMDataBroker getDomAsyncDataBroker() {
120 return newDOMDataBroker;
123 public BindingToNormalizedNodeCodec getCodec() {
127 protected BindingTestContext(final ListeningExecutorService executor, final ClassPool classPool, final boolean startWithSchema) {
128 this.executor = executor;
129 this.classPool = classPool;
130 this.startWithSchema = startWithSchema;
133 public void startDomDataBroker() {
136 public void startNewDataBroker() {
137 checkState(executor != null, "Executor needs to be set");
138 checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
139 dataBroker = new ForwardedBindingDataBroker(newDOMDataBroker, codec);
142 public void startNewDomDataBroker() {
143 checkState(executor != null, "Executor needs to be set");
144 final InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("OPER", MoreExecutors.sameThreadExecutor());
145 final InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("CFG", MoreExecutors.sameThreadExecutor());
146 newDatastores = ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
147 .put(LogicalDatastoreType.OPERATIONAL, operStore)
148 .put(LogicalDatastoreType.CONFIGURATION, configStore)
151 newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
153 biCompatibleBroker = new BackwardsCompatibleDataBroker(newDOMDataBroker,mockSchemaService);
155 mockSchemaService.registerSchemaContextListener(configStore);
156 mockSchemaService.registerSchemaContextListener(operStore);
157 biDataLegacyBroker = biCompatibleBroker;
160 public void startBindingDataBroker() {
164 public void startBindingBroker() {
165 checkState(executor != null, "Executor needs to be set");
166 checkState(baData != null, "Binding Data Broker must be started");
167 checkState(baNotifyImpl != null, "Notification Service must be started");
169 baConsumerRpc = new BindingDOMRpcServiceAdapter(getDomRpcInvoker(), codec);
170 baProviderRpc = new BindingDOMRpcProviderServiceAdapter(getDomRpcRegistry(), codec);
172 baBrokerImpl = new RootBindingAwareBroker("test");
174 final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
175 baBrokerImpl.setMountService(mountService);
176 baBrokerImpl.setLegacyMountManager(new HydrogenMountProvisionServiceAdapter(mountService));
177 baBrokerImpl.setRpcBroker(new HeliumRpcProviderRegistry(baConsumerRpc,baProviderRpc));
178 baBrokerImpl.setLegacyDataBroker(baData);
179 baBrokerImpl.setNotificationBroker(baNotifyImpl);
180 baBrokerImpl.start();
183 public void startForwarding() {
187 private ProviderSession createMockContext() {
189 @SuppressWarnings("deprecation")
190 final ClassToInstanceMap<BrokerService> domBrokerServices = ImmutableClassToInstanceMap
191 .<BrokerService> builder()
193 .put(org.opendaylight.controller.sal.core.api.data.DataProviderService.class, biDataLegacyBroker) //
194 .put(RpcProvisionRegistry.class, biBrokerImpl.getRouter()) //
195 .put(DOMMountPointService.class, biMountImpl)
198 return new ProviderSession() {
201 public Future<RpcResult<CompositeNode>> rpc(final QName rpc, final CompositeNode input) {
202 throw new UnsupportedOperationException();
206 public <T extends BrokerService> T getService(final Class<T> service) {
207 return domBrokerServices.getInstance(service);
211 public boolean isClosed() {
216 public Set<QName> getSupportedRpcs() {
221 public void close() {
225 public ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(
226 final RpcRegistrationListener listener) {
231 public RpcRegistration addRpcImplementation(final QName rpcType, final RpcImplementation implementation)
232 throws IllegalArgumentException {
237 public RoutedRpcRegistration addRoutedRpcImplementation(final QName rpcType, final RpcImplementation implementation) {
242 public RoutedRpcRegistration addMountedRpcImplementation(final QName rpcType, final RpcImplementation implementation) {
248 public void startBindingToDomMappingService() {
249 checkState(classPool != null, "ClassPool needs to be present");
250 mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl(classPool);
251 mockSchemaService.registerSchemaContextListener(mappingServiceImpl);
253 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(classPool));
254 final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator);
255 final GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
256 codec = new BindingToNormalizedNodeCodec(loading, mappingServiceImpl, codecRegistry);
257 mockSchemaService.registerSchemaContextListener(codec);
260 private void updateYangSchema(final ImmutableSet<YangModuleInfo> moduleInfos) {
261 mockSchemaService.changeSchema(getContext(moduleInfos));
264 private SchemaContext getContext(final ImmutableSet<YangModuleInfo> moduleInfos) {
265 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
266 ctx.addModuleInfos(moduleInfos);
267 return ctx.tryToCreateSchemaContext().get();
270 public void start() {
271 startNewDomDataBroker();
274 startDomMountPoint();
275 startBindingToDomMappingService();
276 startNewDataBroker();
277 startNewBindingDataBroker();
278 startBindingNotificationBroker();
279 startBindingBroker();
282 if (startWithSchema) {
283 loadYangSchemaFromClasspath();
287 public void startNewBindingDataBroker() {
288 final HydrogenDataBrokerAdapter forwarded = new HydrogenDataBrokerAdapter(dataBroker);
292 private void startDomMountPoint() {
293 biMountImpl = new DOMMountPointServiceImpl();
296 private void startDomBroker() {
297 checkState(executor != null);
299 final SchemaAwareRpcBroker router = new SchemaAwareRpcBroker("/", mockSchemaService);
301 domRouter = new DOMRpcRouter();
302 mockSchemaService.registerSchemaContextListener(domRouter);
304 final ClassToInstanceMap<BrokerService> services = MutableClassToInstanceMap.create();
305 services.put(DOMRpcService.class, domRouter);
307 biBrokerImpl = new BrokerImpl(router,services);
311 public void startBindingNotificationBroker() {
312 checkState(executor != null);
313 baNotifyImpl = new NotificationBrokerImpl(executor);
317 public void loadYangSchemaFromClasspath() {
318 final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
319 updateYangSchema(moduleInfos);
323 public DataProviderService getBindingDataBroker() {
328 public org.opendaylight.controller.sal.core.api.data.DataProviderService getDomDataBroker() {
329 return biDataLegacyBroker;
332 public BindingIndependentMappingService getBindingToDomMappingService() {
333 return mappingServiceImpl;
336 public RpcProviderRegistry getBindingRpcRegistry() {
337 return baBrokerImpl.getRoot();
340 public DOMRpcProviderService getDomRpcRegistry() {
344 public DOMRpcService getDomRpcInvoker() {
349 public void close() throws Exception {
353 public MountProviderService getBindingMountProviderService() {
354 return baBrokerImpl.getLegacyMount();
357 public DOMMountPointService getDomMountProviderService() {
361 public DataBroker getDataBroker() {