Added configuration options to MD-SAL
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / connect / dom / BindingIndependentDataServiceConnector.java
1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.Map.Entry;
6 import java.util.concurrent.ExecutionException;
7 import java.util.concurrent.Future;
8
9 import org.opendaylight.controller.config.api.jmx.CommitStatus;
10 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
11 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
12 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
13 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
14 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction;
15 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
16 import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider;
17 import org.opendaylight.controller.sal.common.util.Rpcs;
18 import org.opendaylight.controller.sal.core.api.Provider;
19 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
20 import org.opendaylight.controller.sal.core.api.data.DataBrokerService;
21 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
22 import org.opendaylight.yangtools.yang.binding.DataObject;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.opendaylight.yangtools.yang.common.RpcError;
25 import org.opendaylight.yangtools.yang.common.RpcResult;
26 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
27
28 import com.google.common.base.Preconditions;
29
30 public class BindingIndependentDataServiceConnector implements //
31         RuntimeDataProvider, //
32         DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>, Provider {
33
34     private static final InstanceIdentifier<? extends DataObject> ROOT = InstanceIdentifier.builder().toInstance();
35
36     private BindingIndependentMappingService mappingService;
37
38     private DataBrokerService biDataService;
39
40     private DataProviderService baDataService;
41
42     @Override
43     public DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
44         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
45         CompositeNode result = biDataService.readOperationalData(biPath);
46         return mappingService.dataObjectFromDataDom(path, result);
47     }
48
49     @Override
50     public DataObject readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
51         org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
52         CompositeNode result = biDataService.readConfigurationData(biPath);
53         return mappingService.dataObjectFromDataDom(path, result);
54     }
55
56     @Override
57     public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> requestCommit(
58             DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
59
60         DataModificationTransaction translated = translateTransaction(modification);
61         return new WrappedTransaction(translated, modification);
62     }
63
64     private DataModificationTransaction translateTransaction(
65             DataModification<InstanceIdentifier<? extends DataObject>, DataObject> source) {
66         DataModificationTransaction target = biDataService.beginTransaction();
67         for (Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : source.getUpdatedConfigurationData()
68                 .entrySet()) {
69             Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
70                     .toDataDom(entry);
71             target.putConfigurationData(biEntry.getKey(), biEntry.getValue());
72         }
73         for (Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : source.getUpdatedOperationalData()
74                 .entrySet()) {
75             Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
76                     .toDataDom(entry);
77             target.putOperationalData(biEntry.getKey(), biEntry.getValue());
78         }
79         for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedConfigurationData()) {
80             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
81             target.removeConfigurationData(biEntry);
82         }
83         for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedOperationalData()) {
84             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
85             target.removeOperationalData(biEntry);
86         }
87         return target;
88     }
89
90     private class WrappedTransaction implements
91             DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
92
93         private DataModificationTransaction backing;
94         private DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
95
96         public WrappedTransaction(DataModificationTransaction backing,
97                 DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
98             this.backing = backing;
99             this.modification = modification;
100         }
101
102         @Override
103         public DataModification<InstanceIdentifier<? extends DataObject>, DataObject> getModification() {
104             return modification;
105         }
106
107         @Override
108         public RpcResult<Void> finish() throws IllegalStateException {
109             Future<RpcResult<TransactionStatus>> result = backing.commit();
110             try {
111                 RpcResult<TransactionStatus> biresult = result.get();
112             } catch (InterruptedException e) {
113                 throw new IllegalStateException("", e);
114             } catch (ExecutionException e) {
115                 throw new IllegalStateException("", e);
116             }
117             return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
118         }
119
120         @Override
121         public RpcResult<Void> rollback() throws IllegalStateException {
122             // backing.cancel();
123             return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
124         }
125
126     }
127
128     public DataBrokerService getBiDataService() {
129         return biDataService;
130     }
131
132     public void setBiDataService(DataBrokerService biDataService) {
133         this.biDataService = biDataService;
134     }
135
136     public DataProviderService getBaDataService() {
137         return baDataService;
138     }
139
140     public void setBaDataService(DataProviderService baDataService) {
141         this.baDataService = baDataService;
142     }
143
144     public void start() {
145         baDataService.registerDataReader(ROOT, this);
146         baDataService.registerCommitHandler(ROOT, this);
147     }
148
149     public void setMappingService(BindingIndependentMappingService mappingService) {
150         this.mappingService = mappingService;
151     }
152     
153     @Override
154     public Collection<ProviderFunctionality> getProviderFunctionality() {
155         return Collections.emptyList();
156     }
157     
158     @Override
159     public void onSessionInitiated(ProviderSession session) {
160         setBiDataService(session.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class));
161         start();
162     }
163
164 }