Make WriteOperations.(put,merge) with boolean default methods 44/81444/5
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 8 Apr 2019 11:20:39 +0000 (13:20 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 8 Apr 2019 21:48:22 +0000 (23:48 +0200)
This inverts the API, so that implementations are required to
provide implementations of mergeParentStructure{Merge,Put} instead
of the boolean-forking put()/merge() methods, addressing associated
FIXMEs.

Change-Id: I9750982fa1ec833fda17d583e2806d4350618c1c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/WriteOperations.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java [deleted file]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java
binding/mdsal-binding-util/src/main/java/org/opendaylight/mdsal/binding/util/TypedWriteTransaction.java

index cf9e6e918e4e6bef26fdbf244828dde983fbe47c..da346e2d710b0799df9c5e8953348134a4423fb5 100644 (file)
@@ -62,8 +62,14 @@ public interface WriteOperations {
      *             instead.
      */
     @Deprecated
-    <T extends DataObject> void put(@NonNull LogicalDatastoreType store, @NonNull InstanceIdentifier<T> path,
-            @NonNull T data, boolean createMissingParents);
+    default <T extends DataObject> void put(@NonNull LogicalDatastoreType store, @NonNull InstanceIdentifier<T> path,
+            @NonNull T data, boolean createMissingParents) {
+        if (createMissingParents) {
+            mergeParentStructurePut(store, path, data);
+        } else {
+            put(store, path, data);
+        }
+    }
 
     /**
      * Stores a piece of data at the specified path. This acts as an add / replace operation, which is to say that whole
@@ -87,13 +93,10 @@ public interface WriteOperations {
      * @throws IllegalStateException if the transaction has already been submitted
      * @throws NullPointerException if any of the arguments is null
      */
-    // FIXME: 4.0.0: make this method non-default
     // TODO: can we come up with a better name?
     @Beta
-    default <T extends DataObject> void mergeParentStructurePut(@NonNull final LogicalDatastoreType store,
-            @NonNull final InstanceIdentifier<T> path, @NonNull final T data) {
-        put(store, path, data, CREATE_MISSING_PARENTS);
-    }
+    <T extends DataObject> void mergeParentStructurePut(@NonNull LogicalDatastoreType store,
+            @NonNull InstanceIdentifier<T> path, @NonNull T data);
 
     /**
      * Merges a piece of data with the existing data at a specified path. Any pre-existing data which is not explicitly
@@ -132,8 +135,14 @@ public interface WriteOperations {
      *             instead.
      */
     @Deprecated
-    <T extends DataObject> void merge(@NonNull LogicalDatastoreType store, @NonNull InstanceIdentifier<T> path,
-            @NonNull T data, boolean createMissingParents);
+    default <T extends DataObject> void merge(@NonNull LogicalDatastoreType store, @NonNull InstanceIdentifier<T> path,
+            @NonNull T data, boolean createMissingParents) {
+        if (createMissingParents) {
+            mergeParentStructureMerge(store, path, data);
+        } else {
+            merge(store, path, data);
+        }
+    }
 
     /**
      * Merges a piece of data with the existing data at a specified path. Any pre-existing data which is not explicitly
@@ -156,13 +165,10 @@ public interface WriteOperations {
      * @throws IllegalStateException if the transaction has already been submitted
      * @throws NullPointerException if any of the arguments is null
      */
-    // FIXME: 4.0.0: make this method non-default
     // TODO: can we come up with a better name?
     @Beta
-    default <T extends DataObject> void mergeParentStructureMerge(@NonNull final LogicalDatastoreType store,
-            @NonNull final InstanceIdentifier<T> path, @NonNull final T data) {
-        merge(store, path, data, CREATE_MISSING_PARENTS);
-    }
+    <T extends DataObject> void mergeParentStructureMerge(@NonNull LogicalDatastoreType store,
+            @NonNull InstanceIdentifier<T> path, @NonNull T data);
 
     /**
      * Removes a piece of data from specified path. This operation does not fail if the specified path does not exist.
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java
deleted file mode 100644 (file)
index 083760e..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.binding.dom.adapter;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.util.concurrent.FluentFuture;
-import java.util.Map.Entry;
-import java.util.Optional;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.common.api.CommitInfo;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-
-/**
- * Abstract Base Transaction for transactions which are backed by {@link DOMDataTreeWriteTransaction}.
- */
-// FIXME: 4.0.0: hide this class and merge it with BindingDOMWriteTransactionAdapter
-public abstract class AbstractWriteTransaction<T extends DOMDataTreeWriteTransaction> extends
-        AbstractForwardedTransaction<T> {
-
-    protected AbstractWriteTransaction(final T delegate, final BindingToNormalizedNodeCodec codec) {
-        super(delegate, codec);
-    }
-
-    public final <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
-            final U data, final boolean createParents) {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put", path, data);
-        if (createParents) {
-            ensureParentsByMerge(store, normalized.getKey(), path);
-        }
-
-        getDelegate().put(store, normalized.getKey(), normalized.getValue());
-    }
-
-    public final <U extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
-            final U data,final boolean createParents) {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
-        if (createParents) {
-            ensureParentsByMerge(store, normalized.getKey(), path);
-        }
-
-        getDelegate().merge(store, normalized.getKey(), normalized.getValue());
-    }
-
-    private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
-            final String operation, final InstanceIdentifier<U> path, final U data) {
-        checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
-        return getCodec().toNormalizedNode(path, data);
-    }
-
-    /**
-     * Use {@link YangInstanceIdentifier#getParent()} instead.
-     */
-    @Deprecated
-    protected static Optional<YangInstanceIdentifier> getParent(final YangInstanceIdentifier child) {
-        return Optional.ofNullable(child.getParent());
-    }
-
-    /**
-     * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their
-     * underlying transaction.
-     *
-     * @param store an instance of LogicalDatastoreType
-     * @param domPath an instance of YangInstanceIdentifier
-     * @param path an instance of InstanceIdentifier
-     */
-    protected final void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath,
-            final InstanceIdentifier<?> path) {
-        final YangInstanceIdentifier parentPath = domPath.getParent();
-        if (parentPath != null) {
-            final NormalizedNode<?, ?> parentNode = getCodec().instanceIdentifierToNode(parentPath);
-            getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
-        }
-    }
-
-    protected final void doDelete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
-        checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
-
-        final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path);
-        getDelegate().delete(store, normalized);
-    }
-
-    protected final @NonNull FluentFuture<? extends @NonNull CommitInfo> doCommit() {
-        return getDelegate().commit();
-    }
-
-    protected final boolean doCancel() {
-        return getDelegate().cancel();
-    }
-}
index cff986948a25a62ec91ef88822cd7a3d129756e2..8e217a447ea02b6ca17f023855db492db1ba3d1d 100644 (file)
@@ -7,7 +7,10 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.util.concurrent.FluentFuture;
+import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
@@ -15,8 +18,10 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractWriteTransaction<T>
+class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
         implements WriteTransaction {
     BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
         super(delegateTx, codec);
@@ -25,27 +30,72 @@ class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> e
     @Override
     public final <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
             final U data) {
-        put(store, path, data, false);
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put", path, data);
+        getDelegate().put(store, normalized.getKey(), normalized.getValue());
+    }
+
+    @Override
+    public final <U extends DataObject> void mergeParentStructurePut(@NonNull LogicalDatastoreType store,
+            @NonNull InstanceIdentifier<U> path, @NonNull U data) {
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put",
+            path, data);
+        ensureParentsByMerge(store, normalized.getKey(), path);
+        getDelegate().put(store, normalized.getKey(), normalized.getValue());
     }
 
     @Override
     public final <D extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<D> path,
             final D data) {
-        merge(store, path, data, false);
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
+        getDelegate().merge(store, normalized.getKey(), normalized.getValue());
+    }
+
+    @Override
+    public final <U extends DataObject> void mergeParentStructureMerge(@NonNull LogicalDatastoreType store,
+            @NonNull InstanceIdentifier<U> path, @NonNull U data) {
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
+        ensureParentsByMerge(store, normalized.getKey(), path);
+        getDelegate().merge(store, normalized.getKey(), normalized.getValue());
     }
 
     @Override
     public final void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
-        doDelete(store, path);
+        checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
+
+        final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path);
+        getDelegate().delete(store, normalized);
     }
 
     @Override
     public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
-        return doCommit();
+        return getDelegate().commit();
     }
 
     @Override
     public final boolean cancel() {
-        return doCancel();
+        return getDelegate().cancel();
+    }
+
+    /**
+     * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their
+     * underlying transaction.
+     *
+     * @param store an instance of LogicalDatastoreType
+     * @param domPath an instance of YangInstanceIdentifier
+     * @param path an instance of InstanceIdentifier
+     */
+    private void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath,
+            final InstanceIdentifier<?> path) {
+        final YangInstanceIdentifier parentPath = domPath.getParent();
+        if (parentPath != null) {
+            final NormalizedNode<?, ?> parentNode = getCodec().instanceIdentifierToNode(parentPath);
+            getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
+        }
+    }
+
+    private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
+            final String operation, final InstanceIdentifier<U> path, final U data) {
+        checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
+        return getCodec().toNormalizedNode(path, data);
     }
 }
index e2790eb6b59773e6effed3ca3d35bec928eaa4b7..5bf4938bf808fef8a3d4780f1fa4936b2ed8ecf6 100644 (file)
@@ -47,7 +47,14 @@ public interface TypedWriteTransaction<D extends Datastore> extends Transaction
      *             {@link #mergeParentStructurePut(InstanceIdentifier, DataObject)} instead.
      */
     @Deprecated
-    <T extends DataObject> void put(InstanceIdentifier<T> path, T data, boolean createMissingParents);
+    default <T extends DataObject> void put(final InstanceIdentifier<T> path, final T data,
+            final boolean createMissingParents) {
+        if (createMissingParents) {
+            mergeParentStructurePut(path, data);
+        } else {
+            put(path, data);
+        }
+    }
 
     /**
      * Writes an object to the given path, creating significant parents, like presence containers and list entries,
@@ -61,10 +68,7 @@ public interface TypedWriteTransaction<D extends Datastore> extends Transaction
      */
     // TODO: can we come up with a better name?
     @Beta
-    @SuppressWarnings("deprecation")
-    default <T extends DataObject> void mergeParentStructurePut(final InstanceIdentifier<T> path, final T data) {
-        put(path, data, WriteOperations.CREATE_MISSING_PARENTS);
-    }
+    <T extends DataObject> void mergeParentStructurePut(InstanceIdentifier<T> path, T data);
 
     /**
      * Merges an object with the data already present at the given path.
@@ -92,7 +96,14 @@ public interface TypedWriteTransaction<D extends Datastore> extends Transaction
      *             {@link #mergeParentStructureMerge(InstanceIdentifier, DataObject)} instead.
      */
     @Deprecated
-    <T extends DataObject> void merge(InstanceIdentifier<T> path, T data, boolean createMissingParents);
+    default <T extends DataObject> void merge(final InstanceIdentifier<T> path, final T data,
+            final boolean createMissingParents) {
+        if (createMissingParents) {
+            mergeParentStructureMerge(path, data);
+        } else {
+            merge(path, data);
+        }
+    }
 
     /**
      * Merges an object with the data already present at the given path, creating missing parents if requested.
@@ -103,14 +114,9 @@ public interface TypedWriteTransaction<D extends Datastore> extends Transaction
      * @param data The object to merge.
      * @param <T> The type of the provided object.
      */
-    // FIXME: 4.0.0: make this method non-default
     // TODO: can we come up with a better name?
     @Beta
-    @SuppressWarnings("deprecation")
-    default <T extends DataObject> void mergeParentStructureMerge(final InstanceIdentifier<T> path,
-            final T data) {
-        merge(path, data, WriteOperations.CREATE_MISSING_PARENTS);
-    }
+    <T extends DataObject> void mergeParentStructureMerge(InstanceIdentifier<T> path, T data);
 
     /**
      * Deletes the object present at the given path.