/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.store.service;

import org.onosproject.store.primitives.TransactionId;

/**
 * Provides a context for transactional operations.
 * <p>
 * A transaction context is a vehicle for grouping operations into a unit with the
 * properties of atomicity, isolation, and durability. Transactions also provide the
 * ability to maintain an application's invariants or integrity constraints,
 * supporting the property of consistency. Together these properties are known as ACID.
 * <p>
 * A transaction context provides a boundary within which transactions
 * are run. It also is a place where all modifications made within a transaction
 * are cached until the point when the transaction commits or aborts. It thus ensures
 * isolation of work happening with in the transaction boundary. Within a transaction
 * context isolation level is REPEATABLE_READS i.e. only data that is committed can be read.
 * The only uncommitted data that can be read is the data modified by the current transaction.
 */
public interface TransactionContext extends DistributedPrimitive {

    @Override
    default DistributedPrimitive.Type type() {
        return DistributedPrimitive.Type.TRANSACTION_CONTEXT;
    }

    /**
     * Returns the transaction identifier.
     *
     * @return transaction id
     */
    TransactionId transactionId();

    /**
     * Returns if this transaction context is open.
     *
     * @return true if open, false otherwise
     */
    boolean isOpen();

    /**
     * Starts a new transaction.
     */
    void begin();

    /**
     * Commits a transaction that was previously started thereby making its changes permanent
     * and externally visible.
     *
     * @return true if this transaction succeeded, otherwise false.
     */
    boolean commit();

    /**
     * Aborts any changes made in this transaction context and discarding all locally cached updates.
     */
    void abort();

    /**
     * Returns a transactional map data structure with the specified name.
     *
     * @param <K> key type
     * @param <V> value type
     * @param mapName name of the transactional map
     * @param serializer serializer to use for encoding/decoding keys and values of the map
     * @return Transactional Map
     */
    <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName, Serializer serializer);
}
