1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
3 import java.util.Collections;
4 import java.util.Map.Entry;
5 import java.util.concurrent.ExecutionException;
6 import java.util.concurrent.Future;
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;
25 import com.google.common.base.Preconditions;
27 public class BindingIndependentDataServiceConnector implements //
28 RuntimeDataProvider, //
29 DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> {
31 private static final InstanceIdentifier<? extends DataObject> ROOT = InstanceIdentifier.builder().toInstance();
33 private BindingIndependentMappingService mappingService;
35 private DataBrokerService biDataService;
37 private DataProviderService baDataService;
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);
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);
55 public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> requestCommit(
56 DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
58 DataModificationTransaction translated = translateTransaction(modification);
59 return new WrappedTransaction(translated, modification);
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()
67 Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
69 target.putConfigurationData(biEntry.getKey(), biEntry.getValue());
71 for (Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : source.getUpdatedOperationalData()
73 Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
75 target.putOperationalData(biEntry.getKey(), biEntry.getValue());
77 for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedConfigurationData()) {
78 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
79 target.removeConfigurationData(biEntry);
81 for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedOperationalData()) {
82 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
83 target.removeOperationalData(biEntry);
88 private class WrappedTransaction implements
89 DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
91 private DataModificationTransaction backing;
92 private DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
94 public WrappedTransaction(DataModificationTransaction backing,
95 DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
96 this.backing = backing;
97 this.modification = modification;
101 public DataModification<InstanceIdentifier<? extends DataObject>, DataObject> getModification() {
106 public RpcResult<Void> finish() throws IllegalStateException {
107 Future<RpcResult<TransactionStatus>> result = backing.commit();
109 RpcResult<TransactionStatus> biresult = result.get();
110 } catch (InterruptedException e) {
111 throw new IllegalStateException("", e);
112 } catch (ExecutionException e) {
113 throw new IllegalStateException("", e);
115 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
119 public RpcResult<Void> rollback() throws IllegalStateException {
121 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
126 public DataBrokerService getBiDataService() {
127 return biDataService;
130 public void setBiDataService(DataBrokerService biDataService) {
131 this.biDataService = biDataService;
134 public DataProviderService getBaDataService() {
135 return baDataService;
138 public void setBaDataService(DataProviderService baDataService) {
139 this.baDataService = baDataService;
142 public void start() {
143 baDataService.registerDataReader(ROOT, this);
144 baDataService.registerCommitHandler(ROOT, this);
147 public void setMappingService(BindingIndependentMappingService mappingService) {
148 this.mappingService = mappingService;