001: package demo.bank.concurrency;
002:
003: import org.omg.CORBA.*;
004: import org.omg.CORBA.ORBPackage.*;
005: import org.omg.CosTransactions.*;
006: import org.omg.CosConcurrencyControl.*;
007: import org.omg.CosNaming.*;
008: import java.io.*;
009:
010: public class BankImpl extends TheBankPOA {
011: private ORB orb;
012: private org.omg.PortableServer.POA poa;
013: private TransactionFactory transactionFactory;
014: private LockSetFactory lockSetFactory;
015:
016: public BankImpl(ORB orb, org.omg.PortableServer.POA poa) {
017: this .orb = orb;
018: this .poa = poa;
019: try {
020: // obtain transaction factory object from naming service
021: NamingContextExt nc = NamingContextExtHelper.narrow(orb
022: .resolve_initial_references("NameService"));
023: NameComponent[] name = new NameComponent[1];
024: name[0] = new NameComponent("TransactionService", "service");
025: transactionFactory = TransactionFactoryHelper.narrow(nc
026: .resolve(name));
027:
028: // obtain LockSet factory object from naming service
029: name[0] = new NameComponent("ConcurrencyControlService",
030: "service");
031: lockSetFactory = LockSetFactoryHelper.narrow(nc
032: .resolve(name));
033: } catch (Exception n) {
034: n.printStackTrace();
035: System.exit(1);
036: }
037: }
038:
039: public Account open(String name, float initial_deposit) {
040: try {
041: TransactionalLockSet lock_set = lockSetFactory
042: .create_transactional();
043: AccountImpl acc = new AccountImpl(lock_set, name,
044: initial_deposit, 0);
045: org.omg.CORBA.Object o = poa.servant_to_reference(acc);
046: return acc._this (orb);
047: } catch (Exception e) {
048: e.printStackTrace();
049: throw new org.omg.CORBA.UNKNOWN();
050: }
051: }
052:
053: public void transfer(Account source, Account destination,
054: float amount) throws InsufficientFunds {
055: Control control = null;
056: try {
057: // start a new transaction
058: System.err.println("begin transaction");
059:
060: // obtain control object
061: control = transactionFactory.create(20);
062: Coordinator coord = control.get_coordinator();
063:
064: // Lock in upgrade mode for prevent dead lock
065: TransactionalLockSet lock_set = source.get_lock_set();
066: lock_set.lock(coord, lock_mode.upgrade);
067: lock_set = destination.get_lock_set();
068: lock_set.lock(coord, lock_mode.upgrade);
069:
070: source.debit(amount, control);
071:
072: System.err.println("debited");
073:
074: destination.credit(amount, control);
075:
076: System.err.println("credited");
077:
078: // commit the transaction
079: System.err.println("commit transaction");
080: control.get_terminator().commit(true);
081: System.err.println("transaction comitted");
082: } catch (InsufficientFunds isf) {
083: try {
084: control.get_terminator().rollback();
085: } catch (org.omg.CosTransactions.Unavailable nt) {
086: System.err.println("No transaction - give up: " + nt);
087: System.exit(1);
088: }
089: throw (isf);
090: } catch (UserException ue) {
091: System.err
092: .println("transactional failure - give up: " + ue);
093: System.exit(1);
094: } catch (SystemException se) {
095: System.err
096: .println("system exception - rollback transaction: "
097: + se);
098: try {
099: control.get_terminator().rollback();
100: } catch (org.omg.CosTransactions.Unavailable nt) {
101: System.err.println("No transaction - give up: " + nt);
102: System.exit(1);
103: }
104: throw (se);
105: }
106: }
107:
108: }
|