2 * Copyright © 2016 AT&T 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.transportpce.test;
10 import com.google.common.collect.ClassToInstanceMap;
11 import com.google.common.collect.ImmutableClassToInstanceMap;
12 import com.google.common.collect.ImmutableMap;
13 import com.google.common.util.concurrent.ListeningExecutorService;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import java.util.LinkedList;
16 import java.util.List;
18 import java.util.ServiceLoader;
19 import java.util.concurrent.Executors;
20 import org.eclipse.jdt.annotation.NonNull;
21 import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
22 import org.opendaylight.mdsal.binding.api.DataBroker;
23 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
24 import org.opendaylight.mdsal.binding.api.NotificationService;
25 import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
26 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
27 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
28 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
29 import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext;
30 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
31 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
32 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
33 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
34 import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension;
35 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
36 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
37 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
38 import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore;
39 import org.opendaylight.yangtools.concepts.ListenerRegistration;
40 import org.opendaylight.yangtools.util.ListenerRegistry;
41 import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
42 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
43 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
44 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
45 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
49 public class DataStoreContextImpl implements DataStoreContext {
51 private static final Logger LOG = LoggerFactory.getLogger(DataStoreContextImpl.class);
53 private final Map<LogicalDatastoreType, DOMStore> datastores;
54 private final SchemaContextHolder mockedSchemaContext;
55 private final DOMNotificationRouter domNotificationRouter;
56 private final DOMDataBroker domDataBroker;
57 private final DataBroker dataBroker;
58 private final NotificationService notificationService;
59 private final NotificationPublishService notificationPublishService;
62 public DataStoreContextImpl() {
63 this.mockedSchemaContext = new SchemaContextHolder();
64 this.datastores = createDatastores();
65 this.domNotificationRouter = DOMNotificationRouter.create(16);
66 this.domDataBroker = createDOMDataBroker();
67 this.dataBroker = createDataBroker();
68 this.notificationService = createNotificationService();
69 this.notificationPublishService = createNotificationPublishService();
70 this.mockedSchemaContext.listeners.streamListeners()
71 .forEach(l -> l.onModelContextUpdated(this.mockedSchemaContext.schemaContext));
75 public DataBroker getDataBroker() {
76 return this.dataBroker;
80 public DOMDataBroker getDOMDataBroker() {
81 return this.domDataBroker;
85 public NotificationService createNotificationService() {
86 return new BindingDOMNotificationServiceAdapter(this.mockedSchemaContext.adapterContext,
87 this.domNotificationRouter);
91 public NotificationPublishService createNotificationPublishService() {
92 return new BindingDOMNotificationPublishServiceAdapter(this.mockedSchemaContext.adapterContext,
93 this.domNotificationRouter);
97 public EffectiveModelContext getSchemaContext() {
98 return this.mockedSchemaContext.schemaContext;
102 public BindingNormalizedNodeSerializer getBindingToNormalizedNodeCodec() {
103 return this.mockedSchemaContext.adapterContext.currentSerializer();
107 public NotificationService getNotificationService() {
108 return this.notificationService;
112 public NotificationPublishService getNotificationPublishService() {
113 return this.notificationPublishService;
116 private DOMDataBroker createDOMDataBroker() {
117 return new SerializedDOMDataBroker(this.datastores,
118 MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()));
121 private ListeningExecutorService getDataTreeChangeListenerExecutor() {
122 return MoreExecutors.newDirectExecutorService();
125 private DataBroker createDataBroker() {
126 return new BindingDOMDataBrokerAdapter(this.mockedSchemaContext.adapterContext, getDOMDataBroker());
129 private Map<LogicalDatastoreType, DOMStore> createDatastores() {
130 return ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
131 .put(LogicalDatastoreType.OPERATIONAL, createOperationalDatastore())
132 .put(LogicalDatastoreType.CONFIGURATION, createConfigurationDatastore()).build();
135 private DOMStore createConfigurationDatastore() {
136 final InMemoryDOMDataStore store = new InMemoryDOMDataStore("CFG", getDataTreeChangeListenerExecutor());
137 this.mockedSchemaContext.registerSchemaContextListener(store);
141 private DOMStore createOperationalDatastore() {
142 final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", getDataTreeChangeListenerExecutor());
143 this.mockedSchemaContext.registerSchemaContextListener(store);
147 private static final class SchemaContextHolder implements DOMSchemaService, EffectiveModelContextProvider {
149 private final EffectiveModelContext schemaContext;
150 private final ListenerRegistry<EffectiveModelContextListener> listeners;
151 private final AdapterContext adapterContext;
153 private SchemaContextHolder() {
154 List<YangModuleInfo> moduleInfos = loadModuleInfos();
155 this.schemaContext = BindingRuntimeHelpers.createEffectiveModel(moduleInfos);
156 this.listeners = ListenerRegistry.create();
157 this.adapterContext = new ConstantAdapterContext();
161 public EffectiveModelContext getGlobalContext() {
162 return this.schemaContext;
167 * Loads all {@link YangModelBindingProvider} on the classpath.
169 * @return list of known {@link YangModuleInfo}
171 private List<YangModuleInfo> loadModuleInfos() {
172 List<YangModuleInfo> moduleInfos = new LinkedList<>();
173 ServiceLoader<YangModelBindingProvider> yangProviderLoader =
174 ServiceLoader.load(YangModelBindingProvider.class);
175 for (YangModelBindingProvider yangModelBindingProvider : yangProviderLoader) {
176 moduleInfos.add(yangModelBindingProvider.getModuleInfo());
177 LOG.debug("Adding [{}] module into known modules", yangModelBindingProvider.getModuleInfo());
183 public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
184 EffectiveModelContextListener listener) {
185 return this.listeners.register(listener);
189 public @NonNull EffectiveModelContext getEffectiveModelContext() {
190 return this.schemaContext;
194 public @NonNull ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
195 return ImmutableClassToInstanceMap.of();