1 package org.opendaylight.controller.sal.binding.test.util;
3 import java.io.InputStream;
4 import java.util.ArrayList;
8 import javassist.ClassPool;
10 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
11 import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl;
12 import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl;
13 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentDataServiceConnector;
14 import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService;
15 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
16 import org.opendaylight.controller.sal.core.api.data.DataStore;
17 import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper;
18 import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore;
19 import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter;
20 import org.opendaylight.yangtools.yang.model.api.Module;
21 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
22 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
23 import org.reflections.Reflections;
24 import org.reflections.scanners.ResourcesScanner;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import com.google.common.base.Predicate;
29 import com.google.common.util.concurrent.ListeningExecutorService;
30 import com.google.common.util.concurrent.MoreExecutors;
32 import static com.google.common.base.Preconditions.*;
34 public class BindingTestContext {
37 public static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier TREE_ROOT = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
38 .builder().toInstance();
40 private static final Logger LOG = LoggerFactory.getLogger(BindingTestContext.class);
42 private RuntimeGeneratedMappingServiceImpl mappingServiceImpl;
43 private DataBrokerImpl baDataImpl;
44 private org.opendaylight.controller.sal.dom.broker.DataBrokerImpl biDataImpl;
46 private BindingIndependentDataServiceConnector connectorServiceImpl;
47 private HashMapDataStore rawDataStore;
48 private SchemaAwareDataStoreAdapter schemaAwareDataStore;
49 private DataStoreStatsWrapper dataStoreStats;
50 private DataStore dataStore;
53 private boolean dataStoreStatisticsEnabled = false;
55 private final ListeningExecutorService executor;
56 private final ClassPool classPool;
58 private final boolean startWithSchema;
60 protected BindingTestContext(ListeningExecutorService executor, ClassPool classPool, boolean startWithSchema) {
61 this.executor = executor;
62 this.classPool = classPool;
63 this.startWithSchema = startWithSchema;
66 public void startDomDataStore() {
67 checkState(dataStore == null, "DataStore already started.");
68 checkState(biDataImpl != null, "Dom Data Broker not present");
69 rawDataStore = new HashMapDataStore();
70 schemaAwareDataStore = new SchemaAwareDataStoreAdapter();
71 schemaAwareDataStore.changeDelegate(rawDataStore);
72 if(dataStoreStatisticsEnabled) {
73 dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore);
74 dataStore = dataStoreStats;
76 dataStore = schemaAwareDataStore;
79 biDataImpl.registerConfigurationReader(TREE_ROOT, dataStore);
80 biDataImpl.registerOperationalReader(TREE_ROOT, dataStore);
81 biDataImpl.registerCommitHandler(TREE_ROOT, dataStore);
84 public void startDomDataBroker() {
85 checkState(executor != null,"Executor needs to be set");
86 biDataImpl = new org.opendaylight.controller.sal.dom.broker.DataBrokerImpl();
87 biDataImpl.setExecutor(executor);
90 public void startBindingDataBroker() {
91 checkState(executor != null,"Executor needs to be set");
92 baDataImpl = new DataBrokerImpl();
93 baDataImpl.setExecutor(executor);
96 public void startBindingToDomDataConnector() {
97 checkState(baDataImpl != null,"Binding Data Broker needs to be started");
98 checkState(biDataImpl != null,"DOM Data Broker needs to be started.");
99 checkState(mappingServiceImpl != null,"DOM Mapping Service needs to be started.");
100 connectorServiceImpl = new BindingIndependentDataServiceConnector();
101 connectorServiceImpl.setBaDataService(baDataImpl);
102 connectorServiceImpl.setBiDataService(biDataImpl);
103 connectorServiceImpl.setMappingService(mappingServiceImpl);
104 connectorServiceImpl.start();
107 public void startBindingToDomMappingService() {
108 checkState(classPool != null,"ClassPool needs to be present");
109 mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl();
110 mappingServiceImpl.setPool(classPool);
111 mappingServiceImpl.start(null);
115 public void updateYangSchema(String[] files) {
116 SchemaContext context = getContext(files);
117 if(schemaAwareDataStore != null) {
118 schemaAwareDataStore.onGlobalContextUpdated(context);
120 if(mappingServiceImpl != null) {
121 mappingServiceImpl.onGlobalContextUpdated(context);
126 public static String[] getAllYangFilesOnClasspath() {
127 Predicate<String> predicate = new Predicate<String>() {
129 public boolean apply(String input) {
130 return input.endsWith(".yang");
133 Reflections reflection = new Reflections("META-INF.yang", new ResourcesScanner());
134 Set<String> result = reflection.getResources(predicate);
135 return (String[]) result.toArray(new String[result.size()]);
138 private static SchemaContext getContext(String[] yangFiles) {
139 ClassLoader loader = BindingTestContext.class.getClassLoader();
140 List<InputStream> streams = new ArrayList<>();
141 for (String string : yangFiles) {
142 InputStream stream = loader.getResourceAsStream(string);
145 YangParserImpl parser = new YangParserImpl();
146 Set<Module> modules = parser.parseYangModelsFromStreams(streams);
147 return parser.resolveSchemaContext(modules);
150 public void start() {
151 startBindingDataBroker();
152 startDomDataBroker();
154 startBindingToDomMappingService();
155 startBindingToDomDataConnector();
156 if(startWithSchema) {
157 loadYangSchemaFromClasspath();
161 public void loadYangSchemaFromClasspath() {
162 String[] files = getAllYangFilesOnClasspath();
163 updateYangSchema(files);
166 public DataProviderService getBindingDataBroker() {
170 public org.opendaylight.controller.sal.core.api.data.DataProviderService getDomDataBroker() {
174 public DataStore getDomDataStore() {
178 public BindingIndependentMappingService getBindingToDomMappingService() {
179 return mappingServiceImpl;
182 public void logDataStoreStatistics() {
183 if(dataStoreStats == null) {
187 LOG.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
188 dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(),
189 dataStoreStats.getConfigurationReadAverageTime());
191 LOG.info("BIDataStore Statistics: Operational Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
192 dataStoreStats.getOperationalReadCount(), dataStoreStats.getOperationalReadTotalTime(),
193 dataStoreStats.getOperationalReadAverageTime());
195 LOG.info("BIDataStore Statistics: Request Commit Count: {} TotalTime: {} ms AverageTime (ns): {} ms",
196 dataStoreStats.getRequestCommitCount(), dataStoreStats.getRequestCommitTotalTime(),
197 dataStoreStats.getRequestCommitAverageTime());