HsqlDBServiceImpl.java

00001 
00025 package org.objectweb.jonas.db.hsqldb;
00026 
00027 import java.io.File;
00028 import java.sql.Connection;
00029 import java.sql.DriverManager;
00030 import java.sql.ResultSet;
00031 import java.sql.Statement;
00032 import java.util.Iterator;
00033 import java.util.List;
00034 
00035 import org.hsqldb.Server;
00036 import org.hsqldb.ServerConstants;
00037 import org.objectweb.jonas.common.JProp;
00038 import org.objectweb.jonas.db.AbsDBServiceImpl;
00039 import org.objectweb.jonas.db.AbsDBServiceImplMBean;
00040 import org.objectweb.jonas.db.DBService;
00041 import org.objectweb.jonas.db.User;
00042 import org.objectweb.jonas.service.ServiceException;
00043 import org.objectweb.util.monolog.api.BasicLevel;
00044 
00049 public class HsqlDBServiceImpl extends AbsDBServiceImpl implements DBService, AbsDBServiceImplMBean {
00050 
00054     private List users = null;
00055 
00059     private String databaseName = null;
00060 
00064     private static final String DEFAULT_PORT = "9001";
00065 
00069     private static final int SLEEP_VALUE = 100;
00070 
00074     private static final int MAX_RETRY_NB = 20;
00075 
00079     private String portNumber = null;
00080 
00084     private Server server = null;
00085 
00093     protected void initServer(List users, String databaseName, String portNumber) {
00094         this.users = users;
00095         if (portNumber != null) {
00096             this.portNumber = portNumber;
00097         } else {
00098             this.portNumber = DEFAULT_PORT;
00099         }
00100         this.databaseName = databaseName;
00101         String jBase = JProp.getJonasBase();
00102 
00103         server = new Server();
00104         // Remove all traces if level != DEBUG
00105         if (!getLogger().isLoggable(BasicLevel.DEBUG)) {
00106             server.setLogWriter(null);
00107             server.setErrWriter(null);
00108             server.setSilent(true);
00109             server.setTrace(false);
00110             server.setLogWriter(null);
00111         }
00112 
00113         String baseDir = jBase + File.separator + "work" + File.separator + "hsqldb" + File.separator + databaseName;
00114         String pString = "";
00115         if (portNumber != null) {
00116             pString = ";port=" + portNumber;
00117         }
00118         String serverProps = "database.0=" + baseDir + ";dbname.0=" + databaseName + pString;
00119         server.putPropertiesFromString(serverProps);
00120 
00121     }
00122 
00127     protected void doStart() throws ServiceException {
00128         super.doStart();
00129         getLogger().log(BasicLevel.INFO, "Starting " + server.getProductName() + " " + server.getProductVersion() + " on port " + portNumber);
00130         getLogger().log(BasicLevel.DEBUG, "serverState=" + server.getState());
00131         server.start();
00132 
00133         // Wait the start
00134         int retryNb = 0;
00135         while (server.getState() != ServerConstants.SERVER_STATE_ONLINE) {
00136             try {
00137                 Thread.sleep(SLEEP_VALUE);
00138             } catch (InterruptedException ie) {
00139                 getLogger().log(BasicLevel.ERROR, "Can't wait that the service is online :" + ie.getMessage());
00140             }
00141             // Error if server state is "SHUTDOWN" during a long period
00142             // Maybe strange but 'SHUTDOWN' state seems to be an intermediate state during startup
00143             retryNb++;
00144             if (server.getState() == ServerConstants.SERVER_STATE_SHUTDOWN && retryNb >= MAX_RETRY_NB) {
00145                     throw new ServiceException("The server was shutdown. Enable the traces in trace.properties file to see why the service has failed.");
00146             }
00147             getLogger().log(BasicLevel.DEBUG, "retry=" + retryNb + ", serverState=" + server.getState());
00148         }
00149 
00150         getLogger().log(BasicLevel.INFO, server.getProductName() + " started.");
00151         Connection conn = null;
00152         Statement st = null;
00153         try {
00154 
00155             Class.forName("org.hsqldb.jdbcDriver");
00156             conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:" + portNumber + "/" + databaseName, "sa",
00157                     "");
00158             st = conn.createStatement();
00159         } catch (Exception e) {
00160             getLogger().log(BasicLevel.ERROR, e.getMessage());
00161         }
00162 
00163         // Drop users before recreating it
00164         User user = null;
00165         String userName = null;
00166         String password = null;
00167         ResultSet rs = null;
00168         for (Iterator it = users.iterator(); it.hasNext();) {
00169             user = (User) it.next();
00170             try {
00171                 password = user.getPassword();
00172                 userName = user.getUserName();
00173                 getLogger().log(BasicLevel.INFO,
00174                         "Dropping and adding user '" + userName + "' with password '" + password + "'.");
00175                 try {
00176                     rs = st.executeQuery("DROP USER " + userName);
00177                 } catch (Exception ee) {
00178                     getLogger().log(BasicLevel.DEBUG, "User doesn't exists");
00179                 }
00180                 rs = st.executeQuery("Create USER " + userName + " PASSWORD " + password + " ADMIN");
00181                 rs.close();
00182             } catch (Exception e) {
00183                 getLogger().log(BasicLevel.ERROR, "Error while creating/adding user : '" + e.getMessage() + "'.");
00184             }
00185 
00186         }
00187 
00188         try {
00189             st.close();
00190         } catch (Exception e) {
00191             getLogger().log(BasicLevel.DEBUG, "Error while closing statement object : '" + e.getMessage() + "'.");
00192         }
00193 
00194     }
00195 
00200     protected void doStop() throws ServiceException {
00201         super.doStop();
00202 
00203         server.stop();
00204     }
00205 
00206 }

Generated on Tue Feb 15 15:05:14 2005 for JOnAS by  doxygen 1.3.9.1