package oracle.otnsamples.jdbc.dtran;
import java.io.IOException; import java.io.PrintWriter;
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;
import java.util.Enumeration; import java.util.Properties; import java.util.ResourceBundle; import java.util.Vector;
import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import javax.sql.XAConnection; import javax.transaction.xa.XAException; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid;
import oracle.jdbc.xa.OracleXid; import oracle.jdbc.xa.client.OracleXADataSource;
public class DistributedTransactionServlet extends HttpServlet {
private ServletContext context = null;
private String rate = null;
private String servletPath = null;
private Vector tableVector = null;
private XAConnection xaConnectionGlobal;
private XAConnection xaConnectionTravel;
public void init( ServletConfig config ) throws ServletException { super.init( config );
boolean status = this.createConnection( );
if ( status == true ) { tableVector = this.populateTable( ); }
context = config.getServletContext( ); }
public void service( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { res.setHeader( "pragma", "no-cache" ); res.setContentType( "text/html" );
PrintWriter out = new PrintWriter( res.getOutputStream( ) );
String reqType = req.getParameter( "REQ_TYPE" );
if ( reqType == null ) { out.println( DistributedTransactionHTML.generateMainPageHTML( ) ); }
else if ( reqType.equals( "HOME" ) ) { out.println( DistributedTransactionHTML.generateTableFrameHTML( tableVector, servletPath, "Home Country" ) ); }
else if ( reqType.equals( "DESTINATION" ) ) { out.println( DistributedTransactionHTML.generateTableFrameHTML( tableVector, servletPath, "Destination Country" ) ); }
else if ( reqType.equals( "BUTTON" ) ) { out.println( DistributedTransactionHTML.generateButtonFrameHTML( ) ); }
else if ( reqType.equals( "INPUT" ) ) { out.println( DistributedTransactionHTML.generateInputFrameHTML( "" ) ); }
else if ( reqType.equals( "UPDATE" ) ) { int hotelID = Integer.parseInt( req.getParameter( "HOME_ID" ) );
int destinationID = Integer.parseInt( req.getParameter( "DESTINATION_ID" ) );
float value = Float.parseFloat( req.getParameter( "VALUE" ) );
this.updateTables( hotelID, destinationID, value ); this.getExchangeRate( hotelID, destinationID );
out.println( DistributedTransactionHTML.generateInputFrameHTML(rate)); }
else if ( reqType.equals( "INPUTUPDATE" ) ) { int hotelID = Integer.parseInt( req.getParameter( "HOME_ID" ) );
int destinationID = Integer.parseInt( req.getParameter( "DESTINATION_ID" ) );
this.getExchangeRate( hotelID, destinationID );
out.println( DistributedTransactionHTML.generateInputFrameHTML( rate )); }
out.close( ); }
private static Properties loadParams( String file ) throws IOException { Properties prop = new Properties( ); ResourceBundle bundle = ResourceBundle.getBundle( file ); Enumeration enum = bundle.getKeys( ); String key = null;
while ( enum.hasMoreElements( ) ) { key = (String) enum.nextElement( ); prop.put( key, bundle.getObject( key ) ); }
return prop; }
private boolean createConnection( ) { boolean status = false;
try { Properties prop = this.loadParams( "Connection" );
OracleXADataSource oxadsTravel = new OracleXADataSource( ); OracleXADataSource oxadsGlobal = new OracleXADataSource( );
String urlTravel = "jdbc:oracle:thin:@" + (String) prop.get( "HostName1" ) + ":" + (String) prop.get( "Port1" ) + ":" + (String) prop.get( "SID1" );
String urlGlobal = "jdbc:oracle:thin:@" + (String) prop.get( "HostName2" ) + ":" + (String) prop.get( "Port2" ) + ":" + (String) prop.get( "SID2" );
oxadsTravel.setURL( urlTravel ); oxadsGlobal.setURL( urlGlobal );
xaConnectionTravel = oxadsTravel.getXAConnection((String) prop.get( "UserName1" ), (String) prop.get( "Password1" )); xaConnectionGlobal = oxadsGlobal.getXAConnection( (String) prop.get( "UserName2" ), (String) prop.get( "Password2" ) );
if ( ( xaConnectionTravel == null ) || ( xaConnectionGlobal == null )){ status = false; } else { status = true; } } catch ( SQLException ex ) { context.log( ex.toString( ) ); } catch ( IOException ex ) { context.log( ex.toString( ) ); }
return status; }
private static Xid createXid( int pbID ) throws XAException { byte[] gID = new byte[ 1 ]; gID[ 0 ] = (byte) 9;
byte[] bID = new byte[ 1 ]; bID[ 0 ] = (byte) pbID;
byte[] globalID = new byte[ 64 ]; byte[] branchID = new byte[ 64 ];
System.arraycopy( gID, 0, globalID, 0, 1 ); System.arraycopy( bID, 0, branchID, 0, 1 );
Xid xid = new OracleXid( 0x1234, globalID, branchID );
return xid; }
private Vector populateTable( ) { Vector hotelDetails = new Vector( ); Connection connection = null;
try { connection = xaConnectionTravel.getConnection( );
Statement statement = connection.createStatement( );
ResultSet resultSet = statement.executeQuery( "SELECT id,name,currency FROM otn_countries ORDER BY id" );
while ( resultSet.next( ) ) { Vector hotel = new Vector( ); hotel.addElement( resultSet.getString( 1 ) ); hotel.addElement( resultSet.getString( 2 ) ); hotel.addElement( resultSet.getString( 3 ) ); hotelDetails.addElement( hotel ); }
statement.close( ); } catch ( SQLException ex ) { context.log( ex.toString( ) ); } finally {
if ( connection != null ) { try { connection.close( ); } catch ( SQLException e ) { context.log( e.toString( ) ); } } }
return hotelDetails; }
private void getExchangeRate( int homeID, int destinationID ) { Connection connection = null;
try { connection = xaConnectionTravel.getConnection( );
Statement stmt = connection.createStatement( );
ResultSet rs = stmt.executeQuery( "SELECT rate FROM otn_exchange_rates "
+"WHERE home_con_id=" + homeID +" AND new_con_id=" + destinationID );
if ( rs.next( ) ) { rate = rs.getString( 1 ); } } catch ( SQLException ex ) { context.log( ex.toString( ) ); } finally {
if ( connection != null ) { try { connection.close( ); } catch ( SQLException e ) { context.log( e.toString( ) ); } } } }
private void updateTables( int homeID, int destinationID, float exchangeRate ) { Connection connectionTravel = null; Connection connectionGlobal = null;
try { connectionTravel = xaConnectionTravel.getConnection( ); connectionGlobal = xaConnectionGlobal.getConnection( );
XAResource xaResourceTravel = xaConnectionTravel.getXAResource( ); XAResource xaResourceGlobal = xaConnectionGlobal.getXAResource( );
Xid xidTravel = createXid( 1 ); Xid xidGlobal = createXid( 2 );
xaResourceTravel.start( xidTravel, XAResource.TMNOFLAGS ); xaResourceGlobal.start( xidGlobal, XAResource.TMNOFLAGS );
Statement stmtTravel = connectionTravel.createStatement( ); Statement stmtGlobal = connectionGlobal.createStatement( );
int no = stmtTravel.executeUpdate( "UPDATE otn_exchange_rates SET rate=" +exchangeRate + " WHERE home_con_id=" + homeID + " AND new_con_id=" + destinationID );
no = stmtGlobal.executeUpdate( "UPDATE otn_exchange_rates SET rate=" + exchangeRate + " WHERE home_con_id=" + homeID + " AND new_con_id=" + destinationID );
xaResourceTravel.end( xidTravel, XAResource.TMSUCCESS ); xaResourceGlobal.end( xidGlobal, XAResource.TMSUCCESS );
int prepareGlobal = xaResourceGlobal.prepare( xidGlobal ); int prepareTravel = xaResourceTravel.prepare( xidTravel );
boolean doCommit = true;
if ( !( ( prepareTravel == XAResource.XA_OK ) || ( prepareTravel == XAResource.XA_RDONLY ) ) ) { doCommit = false; }
if ( !( ( prepareGlobal == XAResource.XA_OK ) || ( prepareGlobal == XAResource.XA_RDONLY ) ) ) { doCommit = false; }
if ( prepareTravel == XAResource.XA_OK ) { if ( doCommit ) { xaResourceTravel.commit( xidTravel, false ); } else { xaResourceTravel.rollback( xidTravel ); } }
if ( prepareGlobal == XAResource.XA_OK ) { if ( doCommit ) { xaResourceGlobal.commit( xidGlobal, false ); } else { xaResourceGlobal.rollback( xidGlobal ); } }
stmtTravel.close( ); stmtGlobal.close( ); } catch ( SQLException ex ) { context.log( ex.toString( ) ); } catch ( XAException xae ) { context.log( xae.toString( ) ); } finally {
if ( connectionTravel != null ) { try { connectionTravel.close( ); } catch ( SQLException e ) { context.log( e.toString( ) ); } }
if ( connectionGlobal != null ) { try { connectionGlobal.close( ); } catch ( SQLException e ) { context.log( e.toString( ) ); } } } } }
|