1 23 package org.infoglue.cms.util.workflow; 24 25 import org.apache.log4j.Logger; 26 import org.exolab.castor.jdo.Database; 27 import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; 28 29 import com.opensymphony.workflow.WorkflowException; 30 31 34 public class DatabaseSession 35 { 36 39 private final static Logger logger = Logger.getLogger(DatabaseSession.class.getName()); 40 41 44 private Database db; 45 46 49 private boolean rollbackOnly; 50 51 54 public DatabaseSession() 55 { 56 super(); 57 } 58 59 62 public void setRollbackOnly() 63 { 64 rollbackOnly = true; 65 } 66 67 74 public Database getDB() throws WorkflowException 75 { 76 if(db == null) 77 { 78 try 79 { 80 logger.debug("Creating a new database"); 81 db = CastorDatabaseService.getDatabase(); 82 db.begin(); 83 } 84 catch(Exception e) 85 { 86 logger.error("Unable to create database", e); 87 throw new WorkflowException(e); 88 } 89 } 90 return db; 91 } 92 93 99 public void releaseDB() throws WorkflowException 100 { 101 logger.debug("releaseDB : " + (rollbackOnly ? "rollback" : "commit")); 102 if(rollbackOnly) 103 { 104 rollback(); 105 } 106 else 107 { 108 commit(); 109 } 110 } 111 112 117 private void rollback() throws WorkflowException 118 { 119 logger.debug("rollback()"); 120 try 121 { 122 doRollback(); 123 } 124 finally 125 { 126 doClose(); 127 } 128 } 129 130 135 private void commit() throws WorkflowException 136 { 137 logger.debug("commit()"); 138 try 139 { 140 doCommit(); 141 } 142 catch(Exception e) 143 { 144 doRollback(); 145 throw new WorkflowException(e); 146 } 147 finally 148 { 149 doClose(); 150 } 151 } 152 153 156 private void doCommit() throws WorkflowException 157 { 158 if(db != null && db.isActive()) 159 { 160 try 161 { 162 logger.debug("doCommit()"); 163 db.commit(); 164 } 165 catch(Exception e) 166 { 167 logger.error(e); 168 throw new WorkflowException(e); 169 } 170 } 171 } 172 173 176 private void doRollback() throws WorkflowException 177 { 178 if(db != null && db.isActive()) 179 { 180 try 181 { 182 logger.debug("doRollback()"); 183 db.rollback(); 184 } 185 catch(Exception e) 186 { 187 logger.error(e); 188 throw new WorkflowException(e); 189 } 190 } 191 } 192 193 196 private void doClose() throws WorkflowException 197 { 198 if(db != null && !db.isClosed()) 199 { 200 try 201 { 202 logger.debug("doClose()"); 203 db.close(); 204 } 205 catch(Exception e) 206 { 207 logger.error(e); 208 throw new WorkflowException(e); 209 } 210 } 211 } 212 } 213 | Popular Tags |