/*
 * 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.controller.md.sal.binding.api;

import org.opendaylight.controller.md.sal.common.api.data.AsyncWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;

/**
 * A transaction that provides mutation capabilities on a data tree.
 * <p>
 * For more information on usage and examples, please see the documentation in {@link AsyncWriteTransaction}.
 */
public interface WriteTransaction extends AsyncWriteTransaction<InstanceIdentifier<?>, DataObject> {

    /**
     * Stores a piece of data at the specified path. This acts as an add / replace
     * operation, which is to say that whole subtree will be replaced by the specified data.
     * * <p>
     * This method does not automatically create missing parent nodes. It is equivalent to invoking
     * {@link #put(LogicalDatastoreType, InstanceIdentifier, DataObject, boolean)}
     * with <code>createMissingParents</code> set to false.
     * <p>
     * For more information on usage and examples, please see the documentation in {@link AsyncWriteTransaction}.
     * <p>
     * If you need to make sure that a parent object exists but you do not want modify
     * its pre-existing state by using put, consider using {@link #merge} instead.
     *
     * @param store
     *            the logical data store which should be modified
     * @param path
     *            the data object path
     * @param data
     *            the data object to be written to the specified path
     * @throws IllegalStateException
     *             if the transaction has already been submitted
     */
    <T extends DataObject> void put(LogicalDatastoreType store, InstanceIdentifier<T> path, T data);


    /**
     * Stores a piece of data at the specified path. This acts as an add /
     * replace operation, which is to say that whole subtree will be replaced by
     * the specified data.
     * <p>
     * For more information on usage and examples, please see the documentation
     * in {@link AsyncWriteTransaction}.
     * <p>
     * If you need to make sure that a parent object exists but you do not want
     * modify its pre-existing state by using put, consider using {@link #merge}
     * instead.
     *
     * Note: Using <code>createMissingParents</code> with value true, may
     * introduce garbage in data store, or recreate nodes, which were deleted by
     * previous transaction.
     *
     * @param store
     *            the logical data store which should be modified
     * @param path
     *            the data object path
     * @param data
     *            the data object to be written to the specified path
     * @param createMissingParents
     *            if true, any missing parent nodes will be automatically
     *            created using a merge operation.
     * @throws IllegalStateException
     *             if the transaction has already been submitted
     */
    <T extends DataObject> void put(LogicalDatastoreType store, InstanceIdentifier<T> path, T data,
            boolean createMissingParents);

    /**
     * Merges a piece of data with the existing data at a specified path. Any pre-existing data
     * which is not explicitly overwritten will be preserved. This means that if you store a container,
     * its child lists will be merged.
     * <p>
     * This method does not automatically create missing parent nodes. It is equivalent to invoking
     * {@link #merge(LogicalDatastoreType, InstanceIdentifier, DataObject, boolean)}
     * with <code>createMissingParents</code> set to false.
     * <p>
     * For more information on usage and examples, please see the documentation in {@link AsyncWriteTransaction}.
     *<p>
     * If you require an explicit replace operation, use {@link #put} instead.
     * @param store
     *            the logical data store which should be modified
     * @param path
     *            the data object path
     * @param data
     *            the data object to be merged to the specified path
     * @throws IllegalStateException
     *             if the transaction has already been submitted
     */
    <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data);

    /**
     * Merges a piece of data with the existing data at a specified path. Any
     * pre-existing data which is not explicitly overwritten will be preserved.
     * This means that if you store a container, its child lists will be merged.
     * <p>
     * For more information on usage and examples, please see the documentation
     * in {@link AsyncWriteTransaction}.
     * <p>
     * If you require an explicit replace operation, use {@link #put} instead.
     *
     * @param store
     *            the logical data store which should be modified
     * @param path
     *            the data object path
     * @param data
     *            the data object to be merged to the specified path
     * @param createMissingParents
     *            if true, any missing parent nodes will be automatically created
     *            using a merge operation.
     * @throws IllegalStateException
     *             if the transaction has already been submitted
     */
    <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data,
            boolean createMissingParents);

    @Override
    void delete(LogicalDatastoreType store, InstanceIdentifier<?> path);
}

@@ -3131,36 +3131,78 @@
 *            if 
+%7B@link #CREATE_MISSING_PARENTS%7D (%7B@code 
 true
+%7D)
 , any missing pa
@@ -3190,32 +3190,50 @@
 e%7D), any missing
+%0A     *           
  parent nodes wi
@@ -3251,34 +3251,16 @@
 atically
-%0A     *           
  created
@@ -3265,32 +3265,50 @@
 ed using a merge
+%0A     *           
  operation.%0A    
@@ -5484,20 +5484,62 @@
      if 
+%7B@link #CREATE_MISSING_PARENTS%7D (%7B@code 
 true
+%7D)
 , any mi
@@ -5535,32 +5535,50 @@
 e%7D), any missing
+%0A     *           
  parent nodes wi
@@ -5604,16 +5604,30 @@
  created
+ using a merge
 %0A     * 
@@ -5641,22 +5641,8 @@
     
-using a merge 
 oper
@@ -5918,16 +5918,16 @@
 verride%0A
-
     void
@@ -5990,11 +5990,275 @@
 %3E path);
+%0A%0A    /**%0A     * Flag value indicating that missing parents should be created.%0A     */%0A    boolean CREATE_MISSING_PARENTS = true;%0A%0A    /**%0A     * Flag value indicating that missing parents should cause an error.%0A     */%0A    boolean FAIL_ON_MISSING_PARENTS = false;
 %0A%7D%0A

Add "documentation" flags for WriteTransaction