
// CosTransactions Module
// OMG Transaction Service v1.1, November 1997.

#pragma prefix "omg.org"
#pragma javaPackage "org.omg"

module CosTransactions {
// DATATYPES
enum Status {
	StatusActive,
	StatusMarkedRollback,
	StatusPrepared,
	StatusCommitted,
	StatusRolledBack,
	StatusUnknown,
	StatusNoTransaction,
	StatusPreparing,
	StatusCommitting,
	StatusRollingBack
};

enum Vote {
	VoteCommit,
	VoteRollback,
	VoteReadOnly
};

// Forward references for interfaces defined later in module
interface Current;
interface TransactionFactory; 
interface Control;
interface Terminator;
interface Coordinator;
interface RecoveryCoordinator;
interface Resource;
interface Synchronization;
interface SubtransactionAwareResource;
interface TransactionalObject;

// Structure definitions
struct otid_t {
	long formatID; /*format identifier. 0 is OSI TP */
	long bequal_length;
	sequence <octet> tid;
};
struct TransIdentity {
	Coordinator coord;
	Terminator term;
	otid_t otid;
};
struct PropagationContext {
	unsigned long timeout;
	TransIdentity current;
	sequence <TransIdentity> parents;
	any implementation_specific_data;
};

// Heuristic exceptions
exception HeuristicRollback {};
exception HeuristicCommit {};
exception HeuristicMixed {};
exception HeuristicHazard {};

// Other transaction-specific exceptions
exception SubtransactionsUnavailable {};
exception NotSubtransaction {};
exception Inactive {};
exception NotPrepared {};
exception NoTransaction {};
exception InvalidControl {};
exception Unavailable {};
exception SynchronizationUnavailable {}; 

// Current is a pseudo object. It cannot be marshaled outside the process 
// in which it was created.
// Commented out to prevent IDL compiler from generating stubs etc.
//
// interface Current : CORBA::Current {
//	void begin()
//		raises(SubtransactionsUnavailable);
//	void commit(in boolean report_heuristics)
//		raises(
//			NoTransaction,
//			HeuristicMixed,
//			HeuristicHazard
//		);
//	void rollback()
//		raises(NoTransaction);
//	void rollback_only()
//		raises(NoTransaction);
//
//	Status get_status();
//	string get_transaction_name();
//	void set_timeout(in unsigned long seconds);
//
//	Control get_control();
//	Control suspend();
//	void resume(in Control which)
//		raises(InvalidControl);
// };

interface TransactionFactory {
	Control create(in unsigned long time_out);
	Control recreate(in PropagationContext ctx);
};

interface Control {
	Terminator get_terminator()
		raises (Unavailable);
	Coordinator get_coordinator()
		raises (Unavailable);
};

interface Terminator {
	void commit(in boolean report_heuristics)
		raises (HeuristicMixed,
			HeuristicHazard);
	void rollback();
};


interface Coordinator {

	Status get_status();
	Status get_parent_status();
	Status get_top_level_status();

	boolean is_same_transaction(in Coordinator tc);
	boolean is_related_transaction(in Coordinator tc);
	boolean is_ancestor_transaction(in Coordinator tc);
	boolean is_descendant_transaction(in Coordinator tc);
	boolean is_top_level_transaction();

	unsigned long hash_transaction();
	unsigned long hash_top_level_tran();

	RecoveryCoordinator register_resource(in Resource rr)
		raises (Inactive);

	void register_synchronization(in Synchronization sync)
		raises (Inactive, 
			SynchronizationUnavailable);

	void register_subtran_aware(in SubtransactionAwareResource rr)
		raises (Inactive, 
			NotSubtransaction);

	void rollback_only()
		raises (Inactive);

	string get_transaction_name();

	Control create_subtransaction()
		raises (SubtransactionsUnavailable, 
			Inactive);

	PropagationContext get_txcontext()
		raises (Unavailable);
};

interface RecoveryCoordinator {
	Status replay_completion(in Resource rr)
		raises(NotPrepared);
};

interface Resource {
	Vote prepare ()
		raises (HeuristicMixed,
			HeuristicHazard);
	void rollback ()
	  	raises (HeuristicCommit, 
			HeuristicMixed, 
			HeuristicHazard);
	void commit ()
	  	raises (NotPrepared, 
			HeuristicRollback, 
			HeuristicMixed, 
			HeuristicHazard);
	void commit_one_phase ()
	  	raises (HeuristicHazard);
	void forget ();
};

interface TransactionalObject {
};

interface Synchronization : TransactionalObject {
	void before_completion ();
	void after_completion (in Status status);
};

interface SubtransactionAwareResource : Resource {
	void commit_subtransaction (in Coordinator parent);
	void rollback_subtransaction ();
};

}; // End of CosTransactions Module
