Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

GenericTransactionalController.java

00001 package edu.virtualschool.jwaa.dbms;
00002 
00003 import java.io.IOException;
00004 
00005 import javax.servlet.ServletException;
00006 import javax.servlet.http.HttpServletRequest;
00007 import javax.servlet.http.HttpServletResponse;
00008 
00009 import org.apache.log4j.Logger;
00010 
00011 import edu.virtualschool.jwaa.Fault;
00012 import edu.virtualschool.jwaa.GenericPage;
00013 import edu.virtualschool.jwaa.GenericServlet;
00014 import edu.virtualschool.jwaa.IgnorableFault;
00015 import edu.virtualschool.jwaa.MetaPage;
00016 
00017 public abstract class GenericTransactionalController 
00018   extends GenericPage
00019 {
00020   public DB dbms;
00021   
00022   final static Logger logger = Logger.getLogger(GenericTransactionalController.class.getName());
00023   
00024   public GenericTransactionalController() {}
00025   
00026   public void init(
00027       MetaPage meta,
00028       GenericServlet servlet,
00029       HttpServletRequest req,
00030       HttpServletResponse rsp
00031   ) throws IOException, ServletException
00032   {
00033     super.init(meta, servlet, req, rsp);
00034     try
00035     {
00036       this.dbms = ((GenericTransactionalServlet)this.servlet).getDB();
00037     }
00038     catch (Fault e)
00039     {
00040       throw new ServletException("Fault allocating DB for page "+this, e);
00041     }
00042   }
00043   public final void run() throws Fault
00044   {
00045     try
00046     {
00047       logger.debug(this+" transaction start");
00048       runTransaction();
00049       logger.debug(this+" transaction commit: return");
00050       dbms.commit();
00051     }
00052     catch (IgnorableFault e)
00053     {
00054       logger.debug(this+" transaction commit: ignorable fault");
00055       dbms.commit();
00056       throw e;
00057     }
00058     catch (Fault e)
00059     {
00060       logger.error(this+" transaction roll back: fault "+e, e);
00061       dbms.rollback();
00062       throw e;
00063     }
00064     catch (Throwable e)
00065     {
00066       logger.error(this+" transaction roll back: throwable "+e, e);
00067       dbms.rollback();
00068       throw new Fault(e, e);
00069     }
00070     finally
00071     {
00072       dbms.close();
00073     }
00074   }
00075   public void redirect(MetaPage meta) throws Fault
00076   {
00077     try
00078     {
00079       logger.debug("redirect to page"+meta);
00080       super.redirect(meta);
00081       logger.debug("transaction commit (runTransaction return)");
00082       dbms.commit();
00083     }
00084     catch (IgnorableFault e)
00085     {
00086       logger.debug("transaction commit (ignorable fault)");
00087       dbms.commit();
00088       throw e;
00089     }
00090     catch (Fault e)
00091     {
00092       logger.error("transaction roll back (fault)", e);
00093       dbms.rollback();
00094       throw e;
00095     }
00096     catch (Throwable e)
00097     {
00098       logger.error("transaction roll back (throwable)", e);
00099       dbms.rollback();
00100       throw new Fault(e, e);
00101     }
00102     finally
00103     {
00104       dbms.close();
00105     }
00106   }
00107   public void forward(MetaPage meta) throws Fault
00108   {
00109     try
00110     {
00111       logger.debug("forward to page "+meta);
00112       super.forward(meta);
00113       logger.debug("transaction commit (runTransaction return)");
00114       dbms.commit();
00115     }
00116     catch (IgnorableFault e)
00117     {
00118       logger.debug("transaction commit (ignorable fault)");
00119       dbms.commit();
00120       throw e;
00121     }
00122     catch (Fault e)
00123     {
00124       logger.error("transaction roll back (fault)", e);
00125       dbms.rollback();
00126       throw e;
00127     }
00128     catch (Throwable e)
00129     {
00130       logger.error("transaction roll back (throwable)", e);
00131       dbms.rollback();
00132       throw new Fault(e, e);
00133     }
00134     finally
00135     {
00136       dbms.close();
00137     }
00138   }
00139   public abstract void runTransaction() throws Fault;
00140 }