package org.jacorb.demo.bank.transaction.explicit;
import org.omg.CORBA.*;
import org.omg.CORBA.ORBPackage.*;
import org.omg.CosTransactions.*;
import org.omg.CosNaming.*;
import java.io.*;
public class BankImpl
extends TheBankPOA
{
private ORB orb;
private org.omg.PortableServer.POA poa;
private Control control = null;
public BankImpl( ORB orb, org.omg.PortableServer.POA poa )
{
this.orb = orb;
this.poa = poa;
}
public Account open(String name, float initial_deposit)
{
try
{
AccountImpl acc = new AccountImpl(orb, name, initial_deposit);
org.omg.CORBA.Object o = poa.servant_to_reference(acc);
return acc._this(orb);
}
catch( Exception e )
{
e.printStackTrace();
throw new org.omg.CORBA.UNKNOWN();
}
}
public void transfer( Account source, Account destination, float amount )
throws InsufficientFunds
{
try
{
// obtain transaction factory object from naming service
NamingContextExt nc =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent [] name = new NameComponent[1];
name[0] = new NameComponent( "TransactionService", "service");
TransactionFactory transactionFactory =
TransactionFactoryHelper.narrow( nc.resolve(name));
// start a new transaction
System.err.println("begin transaction");
// obtain control object
control = transactionFactory.create(20);
source.debit( amount, control );
System.err.println("debited");
destination.credit( amount, control );
System.err.println("credited");
// commit the transaction
System.err.println("commit transaction");
control.get_terminator().commit( true );
System.err.println("transaction comitted");
}
catch( InsufficientFunds isf )
{
try
{
control.get_terminator().rollback();
}
catch( org.omg.CosTransactions.Unavailable nt )
{
System.err.println("No transaction - give up: " + nt );
System.exit( 1 );
}
throw( isf );
}
catch( InvalidName in )
{
System.err.println("Initialization failure: " + in );
System.exit( 1 );
}
catch( UserException ue )
{
System.err.println("transactional failure - give up: " + ue );
System.exit( 1 );
}
catch( SystemException se )
{
System.err.println("system exception - rollback transaction: " + se );
try
{
control.get_terminator().rollback();
}
catch( org.omg.CosTransactions.Unavailable nt )
{
System.err.println("No transaction - give up: " + nt );
System.exit( 1 );
}
throw( se );
}
}
}