1 package org.opendaylight.controller.sal.binding.impl.connect.dom;
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;
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;
28 import com.google.common.base.Preconditions;
30 public class BindingIndependentDataServiceConnector implements //
31 RuntimeDataProvider, //
32 DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>, Provider {
34 private static final InstanceIdentifier<? extends DataObject> ROOT = InstanceIdentifier.builder().toInstance();
36 private BindingIndependentMappingService mappingService;
38 private DataBrokerService biDataService;
40 private DataProviderService baDataService;
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);
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);
57 public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> requestCommit(
58 DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
60 DataModificationTransaction translated = translateTransaction(modification);
61 return new WrappedTransaction(translated, modification);
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()
69 Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
71 target.putConfigurationData(biEntry.getKey(), biEntry.getValue());
73 for (Entry<InstanceIdentifier<? extends DataObject>, DataObject> entry : source.getUpdatedOperationalData()
75 Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> biEntry = mappingService
77 target.putOperationalData(biEntry.getKey(), biEntry.getValue());
79 for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedConfigurationData()) {
80 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
81 target.removeConfigurationData(biEntry);
83 for(InstanceIdentifier<? extends DataObject> entry : source.getRemovedOperationalData()) {
84 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biEntry = mappingService.toDataDom(entry);
85 target.removeOperationalData(biEntry);
90 private class WrappedTransaction implements
91 DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> {
93 private DataModificationTransaction backing;
94 private DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification;
96 public WrappedTransaction(DataModificationTransaction backing,
97 DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
98 this.backing = backing;
99 this.modification = modification;
103 public DataModification<InstanceIdentifier<? extends DataObject>, DataObject> getModification() {
108 public RpcResult<Void> finish() throws IllegalStateException {
109 Future<RpcResult<TransactionStatus>> result = backing.commit();
111 RpcResult<TransactionStatus> biresult = result.get();
112 } catch (InterruptedException e) {
113 throw new IllegalStateException("", e);
114 } catch (ExecutionException e) {
115 throw new IllegalStateException("", e);
117 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
121 public RpcResult<Void> rollback() throws IllegalStateException {
123 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
128 public DataBrokerService getBiDataService() {
129 return biDataService;
132 public void setBiDataService(DataBrokerService biDataService) {
133 this.biDataService = biDataService;
136 public DataProviderService getBaDataService() {
137 return baDataService;
140 public void setBaDataService(DataProviderService baDataService) {
141 this.baDataService = baDataService;
144 public void start() {
145 baDataService.registerDataReader(ROOT, this);
146 baDataService.registerCommitHandler(ROOT, this);
149 public void setMappingService(BindingIndependentMappingService mappingService) {
150 this.mappingService = mappingService;
154 public Collection<ProviderFunctionality> getProviderFunctionality() {
155 return Collections.emptyList();
159 public void onSessionInitiated(ProviderSession session) {
160 setBiDataService(session.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class));