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
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
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
00142
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
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 }