Merge "Added conflict handling between configuration and state choice nodes. -unique...
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / main / java / org / opendaylight / controller / sal / binding / impl / connect / dom / BindingIndependentDataServiceConnector.java
index ccd6079cc997b00b9de8a2a6f5ee935155f01340..9eff29f8cc4e256f6d9c3163cb551650e226b02f 100644 (file)
@@ -22,6 +22,8 @@ import org.opendaylight.controller.sal.core.api.Provider;
 import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
 import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.Augmentable;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
@@ -32,7 +34,7 @@ import org.slf4j.LoggerFactory;
 
 public class BindingIndependentDataServiceConnector implements //
         RuntimeDataProvider, //
-        Provider {
+        Provider, AutoCloseable {
 
     private final Logger LOG = LoggerFactory.getLogger(BindingIndependentDataServiceConnector.class);
 
@@ -59,16 +61,38 @@ public class BindingIndependentDataServiceConnector implements //
 
     @Override
     public DataObject readOperationalData(InstanceIdentifier<? extends DataObject> path) {
-        org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
-        CompositeNode result = biDataService.readOperationalData(biPath);
-        return mappingService.dataObjectFromDataDom(path, result);
+        try {
+            org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
+            
+            
+            CompositeNode result = biDataService.readOperationalData(biPath);
+            Class<? extends DataObject> targetType = path.getTargetType();
+            
+            if(Augmentation.class.isAssignableFrom(targetType)) {
+                path = mappingService.fromDataDom(biPath);
+                Class<? extends Augmentation<?>> augmentType = (Class<? extends Augmentation<?>>) targetType;
+                DataObject parentTo = mappingService.dataObjectFromDataDom(path, result);
+                if(parentTo instanceof Augmentable<?>) {
+                    return (DataObject) ((Augmentable) parentTo).getAugmentation(augmentType);
+                }
+                
+            }
+            return mappingService.dataObjectFromDataDom(path, result);
+            
+        } catch (DeserializationException e) {
+            throw new IllegalStateException(e);
+        }
     }
 
     @Override
     public DataObject readConfigurationData(InstanceIdentifier<? extends DataObject> path) {
-        org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
-        CompositeNode result = biDataService.readConfigurationData(biPath);
-        return mappingService.dataObjectFromDataDom(path, result);
+        try {
+            org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path);
+            CompositeNode result = biDataService.readConfigurationData(biPath);
+            return mappingService.dataObjectFromDataDom(path, result);
+        } catch (DeserializationException e) {
+            throw new IllegalStateException(e);
+        }
     }
 
     private DataModificationTransaction createBindingToDomTransaction(
@@ -103,23 +127,42 @@ public class BindingIndependentDataServiceConnector implements //
                 .beginTransaction();
         for (Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> entry : source
                 .getUpdatedConfigurationData().entrySet()) {
-            InstanceIdentifier<?> baKey = mappingService.fromDataDom(entry.getKey());
-            DataObject baData = mappingService.dataObjectFromDataDom(baKey, entry.getValue());
-            target.putConfigurationData(baKey, baData);
+            try {
+                InstanceIdentifier<?> baKey = mappingService.fromDataDom(entry.getKey());
+                DataObject baData = mappingService.dataObjectFromDataDom(baKey, entry.getValue());
+                target.putConfigurationData(baKey, baData);
+            } catch (DeserializationException e) {
+                LOG.error("Ommiting from BA transaction: {}.", entry.getKey(), e);
+            }
         }
         for (Entry<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> entry : source
                 .getUpdatedOperationalData().entrySet()) {
-            InstanceIdentifier<?> baKey = mappingService.fromDataDom(entry.getKey());
-            DataObject baData = mappingService.dataObjectFromDataDom(baKey, entry.getValue());
-            target.putOperationalData(baKey, baData);
+            try {
+
+                InstanceIdentifier<?> baKey = mappingService.fromDataDom(entry.getKey());
+                DataObject baData = mappingService.dataObjectFromDataDom(baKey, entry.getValue());
+                target.putOperationalData(baKey, baData);
+            } catch (DeserializationException e) {
+                LOG.error("Ommiting from BA transaction: {}.", entry.getKey(), e);
+            }
         }
         for (org.opendaylight.yangtools.yang.data.api.InstanceIdentifier entry : source.getRemovedConfigurationData()) {
-            InstanceIdentifier<?> baEntry = mappingService.fromDataDom(entry);
-            target.removeConfigurationData(baEntry);
+            try {
+
+                InstanceIdentifier<?> baEntry = mappingService.fromDataDom(entry);
+                target.removeConfigurationData(baEntry);
+            } catch (DeserializationException e) {
+                LOG.error("Ommiting from BA transaction: {}.", entry, e);
+            }
         }
         for (org.opendaylight.yangtools.yang.data.api.InstanceIdentifier entry : source.getRemovedOperationalData()) {
-            InstanceIdentifier<?> baEntry = mappingService.fromDataDom(entry);
-            target.removeOperationalData(baEntry);
+            try {
+
+                InstanceIdentifier<?> baEntry = mappingService.fromDataDom(entry);
+                target.removeOperationalData(baEntry);
+            } catch (DeserializationException e) {
+                LOG.error("Ommiting from BA transaction: {}.", entry, e);
+            }
         }
         return target;
     }
@@ -162,6 +205,17 @@ public class BindingIndependentDataServiceConnector implements //
         start();
     }
 
+    @Override
+    public void close() throws Exception {
+        if (baCommitHandlerRegistration != null) {
+            baCommitHandlerRegistration.close();
+        }
+        if (biCommitHandlerRegistration != null) {
+            biCommitHandlerRegistration.close();
+        }
+
+    }
+
     private class DomToBindingTransaction implements
             DataCommitTransaction<org.opendaylight.yangtools.yang.data.api.InstanceIdentifier, CompositeNode> {
 
@@ -271,10 +325,10 @@ public class BindingIndependentDataServiceConnector implements //
 
         @Override
         public void onRegister(DataCommitHandlerRegistration<InstanceIdentifier<?>, DataObject> registration) {
-            
-            org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(registration.getPath());
-            // FIXME: do registration based on only active commit handlers.
-            
+
+            org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(registration
+                    .getPath());
+
         }
 
         @Override