*/
package org.opendaylight.mdsal.binding.dom.adapter;
+import static com.google.common.base.Preconditions.checkArgument;
+
import com.google.common.util.concurrent.FluentFuture;
-import org.eclipse.jdt.annotation.NonNull;
+import java.util.Map.Entry;
import org.opendaylight.mdsal.binding.api.WriteTransaction;
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;
-
-class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends
- AbstractWriteTransaction<T> implements WriteTransaction {
-
- protected BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
+class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
+ implements WriteTransaction {
+ BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
super(delegateTx, codec);
}
@Override
- public <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
- final U data) {
- put(store, path, data,false);
+ public final <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
+ final U data) {
+ final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put", path, data);
+ getDelegate().put(store, normalized.getKey(), normalized.getValue());
}
@Override
- public <D extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<D> path,
- final D data) {
- merge(store, path, data,false);
+ public final <U extends DataObject> void mergeParentStructurePut(final LogicalDatastoreType store,
+ final InstanceIdentifier<U> path, final 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) {
+ final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
+ getDelegate().merge(store, normalized.getKey(), normalized.getValue());
+ }
@Override
- public void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
- doDelete(store, path);
+ public final <U extends DataObject> void mergeParentStructureMerge(final LogicalDatastoreType store,
+ final InstanceIdentifier<U> path, final 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 @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
- return doCommit();
+ public final void delete(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);
}
@Override
- public boolean cancel() {
- return doCancel();
+ public FluentFuture<? extends CommitInfo> commit() {
+ return getDelegate().commit();
+ }
+
+ @Override
+ public final boolean cancel() {
+ 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 && !parentPath.isEmpty()) {
+ 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);
}
}