Updated AbstractDataModification to also implement DataChange 09/2509/1
authorTony Tkacik <ttkacik@cisco.com>
Thu, 7 Nov 2013 14:28:27 +0000 (15:28 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Thu, 7 Nov 2013 14:28:27 +0000 (15:28 +0100)
  - AbstractDataModification now creates DataChange in the background
    during the creation of diff.
    This DataChange is easier for Commit Handlers to read
    and do processing based on more granular changes.

Change-Id: Id0e41c444afa415c804922d0c87650dd50c555f7
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataTransactionImpl.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChange.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataChangeEvent.java
opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/DataModification.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/AbstractDataModification.java

index 9cb9caf7c1c3d22c35263de52fb8debc91e87bc6..c970fc5e920db0cfbfcd8a277ec9bcaa8a109fb6 100644 (file)
@@ -22,6 +22,7 @@ public class DataTransactionImpl extends AbstractDataModification<InstanceIdenti
     final DataBrokerImpl broker;
 
     public DataTransactionImpl(DataBrokerImpl dataBroker) {
+        super(dataBroker);
         identifier = new Object();
         broker = dataBroker;
         status = TransactionStatus.NEW;
index 55565252a2b7a408579f46e05b9794cbe707d81a..30a607d95b6a025619e836dd26097707704ecae3 100644 (file)
@@ -49,6 +49,8 @@ public interface DataChange<P/* extends Path<P> */, D> {
      */
     Map<P, D> getUpdatedConfigurationData();
 
+
+
     /**
      * Returns a set of paths of removed objects.
      * 
@@ -82,33 +84,4 @@ public interface DataChange<P/* extends Path<P> */, D> {
      * @return map of paths and original state of updated and removed objectd.
      */
     Map<P, D> getOriginalOperationalData();
-
-    /**
-     * Returns a original subtree of data, which starts at the path
-     * where listener was registered.
-     * 
-     */
-    D getOriginalConfigurationSubtree();
-
-    /**
-     * Returns a original subtree of data, which starts at the path
-     * where listener was registered.
-     * 
-     */
-    D getOriginalOperationalSubtree();
-
-    /**
-     * Returns a new subtree of data, which starts at the path
-     * where listener was registered.
-     * 
-     */
-    D getUpdatedConfigurationSubtree();
-
-    /**
-     * Returns a new subtree of data, which starts at the path
-     * where listener was registered.
-     * 
-     */
-    D getUpdatedOperationalSubtree();
-
 }
index 590541374504489f06785732fb93075b3d3aa883..144a81b2566f549c56e7cbb00bb0e9567db644f2 100644 (file)
@@ -11,4 +11,17 @@ import org.opendaylight.yangtools.concepts.Immutable;
 
 public interface DataChangeEvent<P,D> extends DataChange<P, D>, Immutable {
 
+    /**
+     * Returns a new subtree of data, which starts at the path
+     * where listener was registered.
+     * 
+     */
+    D getUpdatedConfigurationSubtree();
+
+    /**
+     * Returns a new subtree of data, which starts at the path
+     * where listener was registered.
+     * 
+     */
+    D getUpdatedOperationalSubtree();
 }
index 1ab7c34589bec6cbed7ce375e3330c591add348b..d059766dea71bee37fb8fa26a051c52b2e044cfa 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
 // import org.opendaylight.yangtools.concepts.Path;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
-public interface DataModification<P/* extends Path<P> */, D> extends DataReader<P, D> {
+public interface DataModification<P/* extends Path<P> */, D> extends DataChange<P, D>, DataReader<P, D> {
 
     /**
      * Returns transaction identifier
@@ -27,21 +27,29 @@ public interface DataModification<P/* extends Path<P> */, D> extends DataReader<
 
     TransactionStatus getStatus();
 
+    /**
+     * 
+     * Use {@link #putOperationalData(Object, Object)} instead.
+     * 
+     * @param path
+     * @param data
+     */
     void putRuntimeData(P path, D data);
 
+    void putOperationalData(P path, D data);
+
     void putConfigurationData(P path, D data);
 
+    /**
+     * Use {@link #removeOperationalData(Object)}
+     * 
+     * @param path
+     */
     void removeRuntimeData(P path);
 
-    void removeConfigurationData(P path);
-
-    public Map<P, D> getUpdatedConfigurationData();
+    void removeOperationalData(P path);
 
-    public Map<P, D> getUpdatedOperationalData();
-
-    public Set<P> getRemovedConfigurationData();
-
-    public Set<P> getRemovedOperationalData();
+    void removeConfigurationData(P path);
 
     /**
      * Initiates a two-phase commit of modification.
index 5d76717ab6ab0d5128bb2eb578f05bda48120a7f..c335b75e15981989078fa862ad31b88dd70d4e04 100644 (file)
@@ -5,68 +5,109 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
+import org.opendaylight.controller.md.sal.common.api.data.DataReader;
 import org.opendaylight.yangtools.concepts.Path;
 
 import static org.opendaylight.controller.md.sal.common.api.TransactionStatus.NEW;
 
-public abstract class AbstractDataModification<P /*extends Path<P>*/, D> implements DataModification<P, D> {
+public abstract class AbstractDataModification<P /* extends Path<P> */, D> implements DataModification<P, D> {
 
-    private final Map<P, D> configurationUpdate;
-    private final Map<P, D> operationalUpdate;
+    private final ConcurrentMap<P, D> operationalOriginal;
+    private final ConcurrentMap<P, D> configurationOriginal;
 
-    private final Set<P> configurationRemove;
-    private final Set<P> operationalRemove;
+    private final ConcurrentMap<P, D> operationalCreated;
+    private final ConcurrentMap<P, D> configurationCreated;
 
+    private final ConcurrentMap<P, D> configurationUpdate;
+    private final ConcurrentMap<P, D> operationalUpdate;
+
+    private final ConcurrentMap<P, P> configurationRemove;
+    private final ConcurrentMap<P, P> operationalRemove;
+
+    private final Map<P, D> unmodifiable_configurationOriginal;
+    private final Map<P, D> unmodifiable_operationalOriginal;
+    private final Map<P, D> unmodifiable_configurationCreated;
+    private final Map<P, D> unmodifiable_operationalCreated;
     private final Map<P, D> unmodifiable_configurationUpdate;
     private final Map<P, D> unmodifiable_operationalUpdate;
     private final Set<P> unmodifiable_configurationRemove;
     private final Set<P> unmodifiable_OperationalRemove;
+    private DataReader<P, D> reader;
+
+    public AbstractDataModification(DataReader<P, D> reader) {
+        this.reader = reader;
+        this.configurationUpdate = new ConcurrentHashMap<>();
+        this.operationalUpdate = new ConcurrentHashMap<>();
+        this.configurationRemove = new ConcurrentHashMap<>();
+        this.operationalRemove = new ConcurrentHashMap<>();
 
-    public AbstractDataModification(Map<P, D> configurationUpdate, Map<P, D> operationalUpdate,
-            Set<P> configurationRemove, Set<P> operationalRemove) {
-        this.configurationUpdate = configurationUpdate;
-        this.operationalUpdate = operationalUpdate;
-        this.configurationRemove = configurationRemove;
-        this.operationalRemove = operationalRemove;
+        this.configurationOriginal = new ConcurrentHashMap<>();
+        this.operationalOriginal = new ConcurrentHashMap<>();
 
+        this.configurationCreated = new ConcurrentHashMap<>();
+        this.operationalCreated = new ConcurrentHashMap<>();
+
+        unmodifiable_configurationOriginal = Collections.unmodifiableMap(configurationOriginal);
+        unmodifiable_operationalOriginal = Collections.unmodifiableMap(operationalOriginal);
+        unmodifiable_configurationCreated = Collections.unmodifiableMap(configurationCreated);
+        unmodifiable_operationalCreated = Collections.unmodifiableMap(operationalCreated);
         unmodifiable_configurationUpdate = Collections.unmodifiableMap(configurationUpdate);
         unmodifiable_operationalUpdate = Collections.unmodifiableMap(operationalUpdate);
-        unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove);
-        unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove);
-    }
+        unmodifiable_configurationRemove = Collections.unmodifiableSet(configurationRemove.keySet());
+        unmodifiable_OperationalRemove = Collections.unmodifiableSet(operationalRemove.keySet());
 
-    public AbstractDataModification() {
-        this(new HashMap<P, D>(), new HashMap<P, D>(), new HashSet<P>(), new HashSet<P>());
     }
 
     @Override
     public final void putConfigurationData(P path, D data) {
         checkMutable();
+
+        if (!hasConfigurationOriginal(path)) {
+            configurationCreated.put(path, data);
+        }
+
         configurationUpdate.put(path, data);
         configurationRemove.remove(path);
     }
 
     @Override
-    public final void putRuntimeData(P path, D data) {
+    public final void putOperationalData(P path, D data) {
         checkMutable();
+        if (!hasOperationalOriginal(path)) {
+            operationalCreated.put(path, data);
+        }
         operationalUpdate.put(path, data);
         operationalRemove.remove(path);
     }
 
     @Override
-    public final void removeRuntimeData(P path) {
+    public final void putRuntimeData(P path, D data) {
+        putRuntimeData(path, data);
+    }
+
+    @Override
+    public final void removeOperationalData(P path) {
         checkMutable();
+        hasOperationalOriginal(path);
         operationalUpdate.remove(path);
-        operationalRemove.add(path);
+        operationalRemove.put(path, path);
+    }
+
+    @Override
+    public final void removeRuntimeData(P path) {
+        removeOperationalData(path);
     }
 
     @Override
     public final void removeConfigurationData(P path) {
         checkMutable();
+        hasConfigurationOriginal(path);
         configurationUpdate.remove(path);
-        configurationRemove.add(path);
+        configurationRemove.put(path, path);
     }
 
     private final void checkMutable() {
@@ -75,24 +116,77 @@ public abstract class AbstractDataModification<P /*extends Path<P>*/, D> impleme
     }
 
     @Override
-    public Map<P, D> getUpdatedConfigurationData() {
+    public final Map<P, D> getUpdatedConfigurationData() {
 
         return unmodifiable_configurationUpdate;
     }
 
     @Override
-    public Map<P, D> getUpdatedOperationalData() {
+    public final Map<P, D> getUpdatedOperationalData() {
         return unmodifiable_operationalUpdate;
     }
 
     @Override
-    public Set<P> getRemovedConfigurationData() {
+    public final Set<P> getRemovedConfigurationData() {
         return unmodifiable_configurationRemove;
     }
 
     @Override
-    public Set<P> getRemovedOperationalData() {
+    public final Set<P> getRemovedOperationalData() {
         return unmodifiable_OperationalRemove;
     }
 
+    @Override
+    public Map<P, D> getCreatedConfigurationData() {
+        return unmodifiable_configurationCreated;
+    }
+
+    @Override
+    public Map<P, D> getCreatedOperationalData() {
+        return unmodifiable_operationalCreated;
+    }
+
+    @Override
+    public Map<P, D> getOriginalConfigurationData() {
+        return unmodifiable_configurationOriginal;
+    }
+
+    @Override
+    public Map<P, D> getOriginalOperationalData() {
+        return unmodifiable_operationalOriginal;
+    }
+
+    @Override
+    public D readOperationalData(P path) {
+        return reader.readOperationalData(path);
+    }
+
+    @Override
+    public D readConfigurationData(P path) {
+        return reader.readConfigurationData(path);
+    }
+
+    private boolean hasConfigurationOriginal(P path) {
+        if (configurationOriginal.containsKey(path)) {
+            return true;
+        }
+        D data = reader.readConfigurationData(path);
+        if (data != null) {
+            configurationOriginal.putIfAbsent(path, data);
+            return true;
+        }
+        return false;
+    }
+
+    private boolean hasOperationalOriginal(P path) {
+        if (operationalOriginal.containsKey(path)) {
+            return true;
+        }
+        D data = reader.readConfigurationData(path);
+        if (data != null) {
+            operationalOriginal.putIfAbsent(path, data);
+            return true;
+        }
+        return false;
+    }
 }