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.BindingDOMDataBrokerAdapter;
29 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMMountPointServiceAdapter;
30 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcProviderServiceAdapter;
31 import org.opendaylight.controller.md.sal.binding.impl.BindingDOMRpcServiceAdapter;
32 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
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.util.JavassistUtils;
66 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
67 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
68 import org.opendaylight.yangtools.yang.common.QName;
69 import org.opendaylight.yangtools.yang.common.RpcResult;
70 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
71 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
74 public class BindingTestContext implements AutoCloseable {
77 private BindingToNormalizedNodeCodec codec;
79 private RootBindingAwareBroker baBrokerImpl;
81 private NotificationBrokerImpl baNotifyImpl;
85 private org.opendaylight.controller.sal.core.api.data.DataProviderService biDataLegacyBroker;
86 private BrokerImpl biBrokerImpl;
88 private final ListeningExecutorService executor;
89 private final ClassPool classPool;
91 private final boolean startWithSchema;
93 private DOMMountPointService biMountImpl;
95 private ImmutableMap<LogicalDatastoreType, DOMStore> newDatastores;
98 private BackwardsCompatibleDataBroker biCompatibleBroker;
101 private DataProviderService baData;
103 private DOMDataBroker newDOMDataBroker;
105 private final MockSchemaService mockSchemaService = new MockSchemaService();
107 private DataBroker dataBroker;
109 private RpcConsumerRegistry baConsumerRpc;
111 private BindingDOMRpcProviderServiceAdapter baProviderRpc;
112 private DOMRpcRouter domRouter;
116 public DOMDataBroker getDomAsyncDataBroker() {
117 return newDOMDataBroker;
120 public BindingToNormalizedNodeCodec getCodec() {
124 protected BindingTestContext(final ListeningExecutorService executor, final ClassPool classPool, final boolean startWithSchema) {
125 this.executor = executor;
126 this.classPool = classPool;
127 this.startWithSchema = startWithSchema;
130 public void startDomDataBroker() {
133 public void startNewDataBroker() {
134 checkState(executor != null, "Executor needs to be set");
135 checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
136 dataBroker = new BindingDOMDataBrokerAdapter(newDOMDataBroker, codec);
139 public void startNewDomDataBroker() {
140 checkState(executor != null, "Executor needs to be set");
141 final InMemoryDOMDataStore operStore = new InMemoryDOMDataStore("OPER", MoreExecutors.sameThreadExecutor());
142 final InMemoryDOMDataStore configStore = new InMemoryDOMDataStore("CFG", MoreExecutors.sameThreadExecutor());
143 newDatastores = ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
144 .put(LogicalDatastoreType.OPERATIONAL, operStore)
145 .put(LogicalDatastoreType.CONFIGURATION, configStore)
148 newDOMDataBroker = new SerializedDOMDataBroker(newDatastores, executor);
150 biCompatibleBroker = new BackwardsCompatibleDataBroker(newDOMDataBroker,mockSchemaService);
152 mockSchemaService.registerSchemaContextListener(configStore);
153 mockSchemaService.registerSchemaContextListener(operStore);
154 biDataLegacyBroker = biCompatibleBroker;
157 public void startBindingDataBroker() {
161 public void startBindingBroker() {
162 checkState(executor != null, "Executor needs to be set");
163 checkState(baData != null, "Binding Data Broker must be started");
164 checkState(baNotifyImpl != null, "Notification Service must be started");
166 baConsumerRpc = new BindingDOMRpcServiceAdapter(getDomRpcInvoker(), codec);
167 baProviderRpc = new BindingDOMRpcProviderServiceAdapter(getDomRpcRegistry(), codec);
169 baBrokerImpl = new RootBindingAwareBroker("test");
171 final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
172 baBrokerImpl.setMountService(mountService);
173 baBrokerImpl.setLegacyMountManager(new HydrogenMountProvisionServiceAdapter(mountService));
174 baBrokerImpl.setRpcBroker(new HeliumRpcProviderRegistry(baConsumerRpc,baProviderRpc));
175 baBrokerImpl.setLegacyDataBroker(baData);
176 baBrokerImpl.setNotificationBroker(baNotifyImpl);
177 baBrokerImpl.start();
180 public void startForwarding() {
184 private ProviderSession createMockContext() {
186 @SuppressWarnings("deprecation")
187 final ClassToInstanceMap<BrokerService> domBrokerServices = ImmutableClassToInstanceMap
188 .<BrokerService> builder()
190 .put(org.opendaylight.controller.sal.core.api.data.DataProviderService.class, biDataLegacyBroker) //
191 .put(RpcProvisionRegistry.class, biBrokerImpl.getRouter()) //
192 .put(DOMMountPointService.class, biMountImpl)
195 return new ProviderSession() {
198 public Future<RpcResult<CompositeNode>> rpc(final QName rpc, final CompositeNode input) {
199 throw new UnsupportedOperationException();
203 public <T extends BrokerService> T getService(final Class<T> service) {
204 return domBrokerServices.getInstance(service);
208 public boolean isClosed() {
213 public Set<QName> getSupportedRpcs() {
218 public void close() {
222 public ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(
223 final RpcRegistrationListener listener) {
228 public RpcRegistration addRpcImplementation(final QName rpcType, final RpcImplementation implementation)
229 throws IllegalArgumentException {
234 public RoutedRpcRegistration addRoutedRpcImplementation(final QName rpcType, final RpcImplementation implementation) {
239 public RoutedRpcRegistration addMountedRpcImplementation(final QName rpcType, final RpcImplementation implementation) {
245 public void startBindingToDomMappingService() {
246 checkState(classPool != null, "ClassPool needs to be present");
248 final DataObjectSerializerGenerator generator = StreamWriterGenerator.create(JavassistUtils.forClassPool(classPool));
249 final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(generator);
250 final GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
251 codec = new BindingToNormalizedNodeCodec(loading, codecRegistry);
252 mockSchemaService.registerSchemaContextListener(codec);
255 private void updateYangSchema(final ImmutableSet<YangModuleInfo> moduleInfos) {
256 mockSchemaService.changeSchema(getContext(moduleInfos));
259 private SchemaContext getContext(final ImmutableSet<YangModuleInfo> moduleInfos) {
260 final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
261 ctx.addModuleInfos(moduleInfos);
262 return ctx.tryToCreateSchemaContext().get();
265 public void start() {
266 startNewDomDataBroker();
269 startDomMountPoint();
270 startBindingToDomMappingService();
271 startNewDataBroker();
272 startNewBindingDataBroker();
273 startBindingNotificationBroker();
274 startBindingBroker();
277 if (startWithSchema) {
278 loadYangSchemaFromClasspath();
282 public void startNewBindingDataBroker() {
283 final HydrogenDataBrokerAdapter forwarded = new HydrogenDataBrokerAdapter(dataBroker);
287 private void startDomMountPoint() {
288 biMountImpl = new DOMMountPointServiceImpl();
291 private void startDomBroker() {
292 checkState(executor != null);
294 final SchemaAwareRpcBroker router = new SchemaAwareRpcBroker("/", mockSchemaService);
296 domRouter = new DOMRpcRouter();
297 mockSchemaService.registerSchemaContextListener(domRouter);
299 final ClassToInstanceMap<BrokerService> services = MutableClassToInstanceMap.create();
300 services.put(DOMRpcService.class, domRouter);
302 biBrokerImpl = new BrokerImpl(router,services);
306 public void startBindingNotificationBroker() {
307 checkState(executor != null);
308 baNotifyImpl = new NotificationBrokerImpl(executor);
312 public void loadYangSchemaFromClasspath() {
313 final ImmutableSet<YangModuleInfo> moduleInfos = BindingReflections.loadModuleInfos();
314 updateYangSchema(moduleInfos);
318 public DataProviderService getBindingDataBroker() {
323 public org.opendaylight.controller.sal.core.api.data.DataProviderService getDomDataBroker() {
324 return biDataLegacyBroker;
327 public RpcProviderRegistry getBindingRpcRegistry() {
328 return baBrokerImpl.getRoot();
331 public DOMRpcProviderService getDomRpcRegistry() {
335 public DOMRpcService getDomRpcInvoker() {
340 public void close() throws Exception {
344 public MountProviderService getBindingMountProviderService() {
345 return baBrokerImpl.getLegacyMount();
348 public DOMMountPointService getDomMountProviderService() {
352 public DataBroker getDataBroker() {