Bug 1002 - REST POST transaction is not commited
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / restconf / impl / BrokerFacade.java
index 68c9340bb1672551c1479a8a267474bd7302cfd3..1cc1f783d676ed69f68c959d1024a58349dc51d9 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.controller.sal.restconf.impl;
 
-import com.google.common.base.Objects;
-
-import java.util.Map;
 import java.util.concurrent.Future;
 
 import javax.ws.rs.core.Response.Status;
@@ -22,7 +19,6 @@ import org.opendaylight.controller.sal.core.api.data.DataChangeListener;
 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.core.api.mount.MountInstance;
 import org.opendaylight.controller.sal.rest.impl.RestconfProvider;
-import org.opendaylight.controller.sal.restconf.impl.ResponseException;
 import org.opendaylight.controller.sal.streams.listeners.ListenerAdapter;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -133,23 +129,22 @@ public class BrokerFacade implements DataReader<InstanceIdentifier, CompositeNod
     }
 
     public Future<RpcResult<TransactionStatus>> commitConfigurationDataPost( final InstanceIdentifier path,
-                                                                             final CompositeNode payload ) {
+                                                                             final CompositeNode payload) {
         this.checkPreconditions();
 
         final DataModificationTransaction transaction = dataService.beginTransaction();
-        transaction.putConfigurationData( path, payload );
-        Map<InstanceIdentifier, CompositeNode> createdConfigurationData =
-                                                           transaction.getCreatedConfigurationData();
-        CompositeNode createdNode = createdConfigurationData.get( path );
-
-        if( Objects.equal( payload, createdNode ) ) {
-            LOG.trace( "Post Configuration via Restconf: {}", path );
-            return transaction.commit();
+        /* check for available Node in Configuration DataStore by path */
+        CompositeNode availableNode = transaction.readConfigurationData( path );
+        if (availableNode != null) {
+            String errMsg = "Post Configuration via Restconf was not executed because data already exists";
+            BrokerFacade.LOG.warn((new StringBuilder(errMsg)).append(" : ").append(path).toString());
+            // FIXME: return correct ietf-restconf:errors -> follow specification
+            // (http://tools.ietf.org/html/draft-bierman-netconf-restconf-03#page-48)
+            throw new ResponseException(Status.CONFLICT, errMsg);
         }
-
-        LOG.trace( "Post Configuration via Restconf was not executed because data already exists: {}",
-                   path );
-        return null;
+        BrokerFacade.LOG.trace( "Post Configuration via Restconf: {}", path );
+        transaction.putConfigurationData( path, payload );
+        return transaction.commit();
     }
 
     public Future<RpcResult<TransactionStatus>> commitConfigurationDataPostBehindMountPoint(
@@ -157,19 +152,18 @@ public class BrokerFacade implements DataReader<InstanceIdentifier, CompositeNod
         this.checkPreconditions();
 
         final DataModificationTransaction transaction = mountPoint.beginTransaction();
-        transaction.putConfigurationData( path, payload );
-        Map<InstanceIdentifier, CompositeNode> createdConfigurationData =
-                                                               transaction.getCreatedConfigurationData();
-        CompositeNode createdNode = createdConfigurationData.get( path );
-
-        if( Objects.equal( payload, createdNode ) ) {
-            LOG.trace( "Post Configuration via Restconf: {}", path );
-            return transaction.commit();
+        /* check for available Node in Configuration DataStore by path */
+        CompositeNode availableNode = transaction.readConfigurationData( path );
+        if (availableNode != null) {
+            String errMsg = "Post Configuration via Restconf was not executed because data already exists";
+            BrokerFacade.LOG.warn((new StringBuilder(errMsg)).append(" : ").append(path).toString());
+            // FIXME: return correct ietf-restconf:errors -> follow specification
+            // (http://tools.ietf.org/html/draft-bierman-netconf-restconf-03#page-48)
+            throw new ResponseException(Status.CONFLICT, errMsg);
         }
-
-        LOG.trace( "Post Configuration via Restconf was not executed because data already exists: {}",
-                    path );
-        return null;
+        BrokerFacade.LOG.trace( "Post Configuration via Restconf: {}", path );
+        transaction.putConfigurationData( path, payload );
+        return transaction.commit();
     }
 
     public Future<RpcResult<TransactionStatus>> commitConfigurationDataDelete( final InstanceIdentifier path ) {