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