    001package com.hammurapi.common.concurrent.transactions;
    002
    003import java.util.concurrent.Future;
    004
    005import javax.transaction.Transaction;
    006import javax.transaction.xa.XAResource;
    007
    008import com.hammurapi.common.Context;
    009import com.hammurapi.common.MutableContext;
    010import com.hammurapi.common.concurrent.Logger;
    011import com.hammurapi.common.concurrent.PropertySet;
    012
    013/**
    014 * Transactional execution context.
    015 * @author Pavel Vlasov
    016 *
    017 * @param <KP>
    018 */
    019public interface ExecutionContext<KP> extends Context, ProgressMonitorFactory {
    020
    021        Transaction getTransaction();
    022
    023//      ExecutorService getExecutorService(); Obtain through context lookup.
    024
    025        /**
    026         * Resources shall be registered before it can be used - Bitronix idiosyncrasy.
    027         * Resources are automatically unregistered upon transaction completion.
    028         * @param xaResource
    029         */
    030        void registerXAResource(XAResource xaResource);
    031
    032        /**
    033         * Adds a command to be executed on transaction rollback.
    034         * Use it to rollback modifications done on non-XA resources.
    035         * @param undoCommand
    036         */
    037        void addUndo(Runnable undoCommand);
    038
    039        /**
    040         * Executes command either in the same thread on in a background thread but in the context of the same transaction.
    041         * @param command
    042         * @param properties
    043         * @param args
    044         * @return
    045         */
    046        <V> Future<V> execute(Command<KP, V> command, Context context, PropertySet<KP> properties, Object... args);
    047
    048        PropertySet<KP> createPropertySet(PropertySet<KP>... chain);
    049
    050        /**
    051         * Creates a mutable context chained with this executor. This method is used for passing bindings and services to subtasks.
    052         * @return
    053         */
    054        MutableContext createContext();
    055
    056        /**
    057         * By invoking this method command indicates that it cannot complete because of pending dependencies and shall be
    058         * executed later.
    059         */
    060        void yield();
    061
    062        Logger getLogger();
    063
    064}