Added response data to operational datastore, refactored data validation
[packetcable.git] / packetcable-policy-server / src / main / java / org / opendaylight / controller / packetcable / provider / MdsalUtils.java
index 8f32d0d9fc8acf9884c4c36e8dda7f0112b03a96..04739ade6e6a40ea9560a21dd7554ef04a489b31 100644 (file)
@@ -8,16 +8,19 @@
 
 package org.opendaylight.controller.packetcable.provider;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.util.concurrent.CheckedFuture;
-
 public class MdsalUtils {
     private static final Logger LOG = LoggerFactory.getLogger(MdsalUtils.class);
     private DataBroker databroker = null;
@@ -25,7 +28,7 @@ public class MdsalUtils {
     /**
      * Class constructor setting the data broker.
      *
-     * @param dataBroker the {@link org.opendaylight.controller.md.sal.binding.api.DataBroker}
+     * @param dataBroker the {@link DataBroker}
      */
     public MdsalUtils(DataBroker dataBroker) {
         this.databroker = dataBroker;
@@ -39,7 +42,7 @@ public class MdsalUtils {
      * @param <D> the data object type
      * @return the result of the request
      */
-    public <D extends org.opendaylight.yangtools.yang.binding.DataObject> boolean delete(
+    public <D extends DataObject> boolean delete(
             final LogicalDatastoreType store, final InstanceIdentifier<D> path)  {
         boolean result = false;
         final WriteTransaction transaction = databroker.newWriteOnlyTransaction();
@@ -62,7 +65,7 @@ public class MdsalUtils {
      * @param <D> the data object type
      * @return the result of the request
      */
-    public <D extends org.opendaylight.yangtools.yang.binding.DataObject> boolean merge(
+    public <D extends DataObject> boolean merge(
             final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier<D> path, D data)  {
         boolean result = false;
         final WriteTransaction transaction = databroker.newWriteOnlyTransaction();
@@ -76,4 +79,49 @@ public class MdsalUtils {
         }
         return result;
     }
+
+    /**
+     * Execures a read as a blocking transaction.
+     *
+     * @param logicalDatastoreType which datastore to read from
+     * @param path The path to read
+     * @param <D> the DataObject type
+     * @return an Optional containing the object.
+     */
+    public <D extends DataObject> Optional<D> read(final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier<D> path) {
+        final ReadOnlyTransaction readOnlyTransaction = databroker.newReadOnlyTransaction();
+
+        CheckedFuture<Optional<D>, ReadFailedException> future = readOnlyTransaction.read(logicalDatastoreType, path);
+
+        try {
+            return future.checkedGet();
+        } catch (ReadFailedException e) {
+            LOG.error("Failed to read {} at path {}", logicalDatastoreType, path, e);
+        }
+
+        return Optional.absent();
+    }
+
+    /**
+     * Executes put as a blocking transaction.
+     *
+     * @param logicalDatastoreType {@link LogicalDatastoreType} which should be modified
+     * @param path {@link InstanceIdentifier} for path to read
+     * @param <D> the data object type
+     * @return the result of the request
+     */
+    public <D extends DataObject> boolean put(
+            final LogicalDatastoreType logicalDatastoreType, final InstanceIdentifier<D> path, D data)  {
+        boolean result = false;
+        final WriteTransaction transaction = databroker.newWriteOnlyTransaction();
+        transaction.put(logicalDatastoreType, path, data, true);
+        CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+        try {
+            future.checkedGet();
+            result = true;
+        } catch (TransactionCommitFailedException e) {
+            LOG.warn("Failed to merge {} ", path, e);
+        }
+        return result;
+    }
 }