Share Pastebin
Guest
Public paste!

yay

By: a guest | Mar 20th, 2010 | Syntax: Java | Size: 3.99 KB | Hits: 54 | Expires: Never
Copy text to clipboard
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. package at.viswars.database.framework.transaction;
  7.  
  8. import at.viswars.database.framework.ReadWriteTable;
  9. import at.viswars.database.framework.core.DatabaseTable;
  10. import at.viswars.database.framework.exception.TransactionException;
  11. import at.viswars.model.Model;
  12. import java.lang.reflect.Field;
  13.  
  14. /**
  15.  *
  16.  * @author Stefan
  17.  */
  18. public class Transaction extends BaseTransaction {    
  19.     private final ReadWriteTable g;
  20.     private final Model m;
  21.     private final int type;
  22.    
  23.     private Transaction reverseTransaction = null;
  24.    
  25.     public Transaction(ReadWriteTable g, Model m, int type) {
  26.         this.g = g;
  27.         this.m = m;
  28.         this.type = type;
  29.     }
  30.    
  31.     protected Object execute() throws TransactionException {
  32.         Model result = null;
  33.                
  34.         switch (type) {
  35.             case(TRANSACTION_TYPE_UPDATE):
  36.                 Transaction rb = new Transaction(g,(Model)getCurrentEntry(m),Transaction.TRANSACTION_TYPE_UPDATE);                
  37.                 this.reverseTransaction = rb;
  38.                 try {
  39.                     result = (Model)getDataSource().merge(m);
  40.                 } catch (Exception e) {
  41.                     e.printStackTrace();
  42.                     getTransaction().setTransactionError(new TransactionException("Internal Transaction Error",e));
  43.                 }
  44.                 // result = (Model)g.update(m);
  45.                 if (getTransaction().isError()) throw getTransaction().getTransactionError();
  46.                 return result;
  47.             case(TRANSACTION_TYPE_INSERT):                
  48.                 try {
  49.                     result = (Model)getDataSource().insert(m);
  50.                     // result = (Model)g.add(m);                      
  51.                 } catch (Exception e) {
  52.                     e.printStackTrace();
  53.                     getTransaction().setTransactionError(new TransactionException("Internal Transaction Error",e));
  54.                 }
  55.                 if (getTransaction().isError()) throw getTransaction().getTransactionError();
  56.                 rb = new Transaction(g,result,Transaction.TRANSACTION_TYPE_DELETE);
  57.                 this.reverseTransaction = rb;
  58.                 return result;
  59.             case(TRANSACTION_TYPE_DELETE):
  60.                 rb = new Transaction(g,(Model)getCurrentEntry(m),Transaction.TRANSACTION_TYPE_INSERT);
  61.                 this.reverseTransaction = rb;
  62.                 try {
  63.                     // g.remove(m);                                                
  64.                     getDataSource().delete(m);
  65.                 } catch (Exception e) {
  66.                     e.printStackTrace();
  67.                     getTransaction().setTransactionError(new TransactionException("Internal Transaction Error",e));
  68.                 }
  69.                 if (getTransaction().isError()) throw getTransaction().getTransactionError();
  70.                 return null;
  71.         }
  72.        
  73.         return result;
  74.     }
  75.    
  76.     protected void rollback() {
  77.         switch (reverseTransaction.type) {
  78.             case(TRANSACTION_TYPE_UPDATE):
  79.                 g.update(reverseTransaction.m);
  80.                 break;
  81.             case(TRANSACTION_TYPE_INSERT):
  82.                 g.add(reverseTransaction.m);
  83.                 break;
  84.             case(TRANSACTION_TYPE_DELETE):
  85.                 g.remove(reverseTransaction.m);
  86.                 break;            
  87.         }
  88.     }
  89.    
  90.     private Object getCurrentEntry(Model m) {
  91.         return g.get(m);
  92.     }
  93.    
  94.     private DatabaseTable getDataSource() throws TransactionException {
  95.         try {
  96.             Field f = g.getClass().getSuperclass().getSuperclass().getDeclaredField("datasource");
  97.             f.setAccessible(true);
  98.             return (DatabaseTable)f.get(g);
  99.         } catch (Exception e) {
  100.             e.printStackTrace();
  101.             throw new TransactionException("Internal Transaction Error",e);
  102.         }                
  103.     }    
  104. }