get rid of mdsal.binding.dom.codec.impl
[transportpce.git] / common / src / main / java / org / opendaylight / transportpce / common / DataStoreContextImpl.java
1 /*
2  * Copyright © 2016 AT&T 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.transportpce.common;
9
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;
17 import java.util.Map;
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;
48
49 public class DataStoreContextImpl implements DataStoreContext {
50
51     private static final Logger LOG = LoggerFactory.getLogger(DataStoreContextImpl.class);
52
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;
60
61
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));
72     }
73
74     @Override
75     public DataBroker getDataBroker() {
76         return this.dataBroker;
77     }
78
79     @Override
80     public DOMDataBroker getDOMDataBroker() {
81         return this.domDataBroker;
82     }
83
84     @Override
85     public NotificationService createNotificationService() {
86         return new BindingDOMNotificationServiceAdapter(this.mockedSchemaContext.adapterContext,
87                 this.domNotificationRouter);
88     }
89
90     @Override
91     public NotificationPublishService createNotificationPublishService() {
92         return new BindingDOMNotificationPublishServiceAdapter(this.mockedSchemaContext.adapterContext,
93                 this.domNotificationRouter);
94     }
95
96     @Override
97     public EffectiveModelContext getSchemaContext() {
98         return this.mockedSchemaContext.schemaContext;
99     }
100
101     @Override
102     public BindingNormalizedNodeSerializer getBindingToNormalizedNodeCodec() {
103         return this.mockedSchemaContext.adapterContext.currentSerializer();
104     }
105
106     @Override
107     public NotificationService getNotificationService() {
108         return this.notificationService;
109     }
110
111     @Override
112     public NotificationPublishService getNotificationPublishService() {
113         return this.notificationPublishService;
114     }
115
116     private DOMDataBroker createDOMDataBroker() {
117         return new SerializedDOMDataBroker(this.datastores,
118                 MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()));
119     }
120
121     private ListeningExecutorService getDataTreeChangeListenerExecutor() {
122         return MoreExecutors.newDirectExecutorService();
123     }
124
125     private DataBroker createDataBroker() {
126         return new BindingDOMDataBrokerAdapter(this.mockedSchemaContext.adapterContext, getDOMDataBroker());
127     }
128
129     private Map<LogicalDatastoreType, DOMStore> createDatastores() {
130         return ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
131                 .put(LogicalDatastoreType.OPERATIONAL, createOperationalDatastore())
132                 .put(LogicalDatastoreType.CONFIGURATION, createConfigurationDatastore()).build();
133     }
134
135     private DOMStore createConfigurationDatastore() {
136         final InMemoryDOMDataStore store = new InMemoryDOMDataStore("CFG", getDataTreeChangeListenerExecutor());
137         this.mockedSchemaContext.registerSchemaContextListener(store);
138         return store;
139     }
140
141     private DOMStore createOperationalDatastore() {
142         final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", getDataTreeChangeListenerExecutor());
143         this.mockedSchemaContext.registerSchemaContextListener(store);
144         return store;
145     }
146
147     private static final class SchemaContextHolder implements DOMSchemaService, EffectiveModelContextProvider {
148
149         private final EffectiveModelContext schemaContext;
150         private final ListenerRegistry<EffectiveModelContextListener> listeners;
151         private final AdapterContext adapterContext;
152
153         private SchemaContextHolder() {
154             List<YangModuleInfo> moduleInfos = loadModuleInfos();
155             this.schemaContext = BindingRuntimeHelpers.createEffectiveModel(moduleInfos);
156             this.listeners = ListenerRegistry.create();
157             this.adapterContext = new ConstantAdapterContext();
158         }
159
160         @Override
161         public EffectiveModelContext getGlobalContext() {
162             return this.schemaContext;
163         }
164
165
166         /**
167          * Loads all {@link YangModelBindingProvider} on the classpath.
168          *
169          * @return list of known {@link YangModuleInfo}
170          */
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());
178             }
179             return moduleInfos;
180         }
181
182         @Override
183         public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
184                 EffectiveModelContextListener listener) {
185             return this.listeners.register(listener);
186         }
187
188         @Override
189         public @NonNull EffectiveModelContext getEffectiveModelContext() {
190             return this.schemaContext;
191         }
192
193         @Override
194         public @NonNull ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
195             return ImmutableClassToInstanceMap.of();
196         }
197
198
199     }
200 }