KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > easybeans > component > hsqldb > HSQLDBComponent


1 /**
2  * EasyBeans
3  * Copyright (C) 2006 Bull S.A.S.
4  * Contact: easybeans@objectweb.org
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  * USA
20  *
21  * --------------------------------------------------------------------------
22  * $Id: HSQLDBComponent.java 1142 2006-10-06 11:24:57Z benoitf $
23  * --------------------------------------------------------------------------
24  */

25
26 package org.objectweb.easybeans.component.hsqldb;
27
28 import java.io.File JavaDoc;
29 import java.sql.Connection JavaDoc;
30 import java.sql.DriverManager JavaDoc;
31 import java.sql.ResultSet JavaDoc;
32 import java.sql.SQLException JavaDoc;
33 import java.sql.Statement JavaDoc;
34 import java.util.Iterator JavaDoc;
35 import java.util.List JavaDoc;
36
37 import org.hsqldb.DatabaseManager;
38 import org.hsqldb.Server;
39 import org.hsqldb.ServerConstants;
40 import org.objectweb.easybeans.component.api.EZBComponentException;
41 import org.objectweb.easybeans.component.itf.EmbeddedDBComponent;
42 import org.objectweb.easybeans.log.JLog;
43 import org.objectweb.easybeans.log.JLogFactory;
44
45 /**
46  * Allows to start an embedded HSQLDB server.
47  * @author Florent Benoit
48  */

49 public class HSQLDBComponent implements EmbeddedDBComponent {
50
51     /**
52      * Logger.
53      */

54     private static JLog logger = JLogFactory.getLog(HSQLDBComponent.class);
55
56     /**
57      * List of users.
58      */

59     private List JavaDoc<User> users = null;
60
61     /**
62      * Name of database.
63      */

64     private String JavaDoc databaseName = null;
65
66     /**
67      * Default port number.
68      */

69     private static final String JavaDoc DEFAULT_PORT = "9001";
70
71     /**
72      * Sleep value.
73      */

74     private static final int SLEEP_VALUE = 100;
75
76     /**
77      * Max retry number.
78      */

79     private static final int MAX_RETRY_NB = 20;
80
81     /**
82      * port number used.
83      */

84     private String JavaDoc portNumber = null;
85
86     /**
87      * HsqlDB server.
88      */

89     private Server server = null;
90
91     /**
92      * Default constructor.<br>
93      * Use default port number.
94      */

95     public HSQLDBComponent() {
96         this.portNumber = DEFAULT_PORT;
97     }
98
99     /**
100      * Init method.<br/> This method is called before the start method.
101      * @throws EZBComponentException if the initialization has failed.
102      */

103     @SuppressWarnings JavaDoc("unchecked")
104     public void init() throws EZBComponentException {
105
106         server = new Server();
107         // Remove all traces if level != DEBUG
108
if (!logger.isDebugEnabled()) {
109             server.setLogWriter(null);
110             server.setErrWriter(null);
111             server.setSilent(true);
112             server.setTrace(false);
113             server.setLogWriter(null);
114         } else {
115             // Enable all traces : verbose mode (as user needs DEBUG)
116
server.setSilent(false);
117             server.setTrace(true);
118         }
119
120         String JavaDoc baseDir = System.getProperty("java.io.tmpdir") + File.separator + "easybeans" + File.separator + "hsqldb"
121                 + File.separator + databaseName;
122         String JavaDoc pString = "";
123         if (portNumber != null) {
124             pString = ";port=" + portNumber;
125         }
126         String JavaDoc serverProps = "database.0=" + baseDir + ";dbname.0=" + databaseName + pString;
127         logger.debug("Server properties = {0}", serverProps);
128         server.putPropertiesFromString(serverProps);
129
130         try {
131             Class.forName("org.hsqldb.jdbcDriver");
132         } catch (ClassNotFoundException JavaDoc e) {
133             throw new EZBComponentException("Cannot access to HSQL Driver 'org.hsqldb.jdbcDriver'.", e);
134         }
135
136     }
137
138     /**
139      * Start method.<br/> This method is called after the init method.
140      * @throws EZBComponentException if the start has failed.
141      */

142     @SuppressWarnings JavaDoc("boxing")
143     public void start() throws EZBComponentException {
144
145         logger.info("Starting ''{0}'' ''{1}'' on port ''{2}''", server.getProductName(), server.getProductVersion(), portNumber);
146
147         server.start();
148
149         // Wait the start
150
int retryNb = 0;
151         while (server.getState() != ServerConstants.SERVER_STATE_ONLINE) {
152             try {
153                 Thread.sleep(SLEEP_VALUE);
154             } catch (InterruptedException JavaDoc ie) {
155                 logger.error("Cannot wait that the service is online", ie);
156             }
157             // Error if server state is "SHUTDOWN" during a long period
158
// Maybe strange but 'SHUTDOWN' state seems to be an intermediate
159
// state during startup
160
retryNb++;
161             if (server.getState() == ServerConstants.SERVER_STATE_SHUTDOWN && retryNb >= MAX_RETRY_NB) {
162                 Throwable JavaDoc t = server.getServerError();
163                 throw new EZBComponentException("Cannot start the server. The server has not started and is shutdown.", t);
164             }
165             logger.debug("retry= {0}, serverState= {1}", retryNb, server.getState());
166         }
167
168         String JavaDoc connURL = "jdbc:hsqldb:hsql://localhost:" + portNumber + "/" + databaseName;
169         logger.info("{0} started with URL {1}", server.getProductName(), connURL);
170
171         Connection JavaDoc conn = null;
172         Statement JavaDoc st = null;
173
174         try {
175             conn = DriverManager.getConnection(connURL, "sa", "");
176             st = conn.createStatement();
177         } catch (SQLException JavaDoc e) {
178             throw new EZBComponentException("Cannot access to HSQL", e);
179         }
180
181         // Drop users before recreating it
182
User user = null;
183         String JavaDoc userName = null;
184         String JavaDoc password = null;
185         ResultSet JavaDoc rs = null;
186         for (Iterator JavaDoc it = users.iterator(); it.hasNext();) {
187             user = (User) it.next();
188             try {
189                 password = user.getPassword();
190                 userName = user.getUserName();
191                 logger.debug("Dropping and adding user {0} with password {1}.", userName, password);
192                 try {
193                     rs = st.executeQuery("DROP USER " + userName);
194                 } catch (SQLException JavaDoc e) {
195                     logger.debug("User {0} doesn't exists", userName, e);
196                 }
197                 rs = st.executeQuery("Create USER " + userName + " PASSWORD " + password + " ADMIN");
198                 rs.close();
199             } catch (SQLException JavaDoc e) {
200                 logger.error("Error while creating/adding user", e);
201             }
202
203         }
204
205         try {
206             st.close();
207         } catch (SQLException JavaDoc e) {
208             logger.error("Error while closing statement object", e);
209         }
210
211     }
212
213     /**
214      * Gets the list of users.
215      * @return the list of users.
216      */

217     public List JavaDoc<User> getUsers() {
218         return this.users;
219     }
220
221     /**
222      * Set the list of users.
223      * @param users the list of users.
224      */

225     public void setUsers(final List JavaDoc<User> users) {
226         this.users = users;
227     }
228
229     /**
230      * Stop method.<br/> This method is called when component needs to be
231      * stopped.
232      * @throws EZBComponentException if the stop is failing.
233      */

234     public void stop() throws EZBComponentException {
235         server.shutdown();
236         DatabaseManager.getTimer().shutDown();
237     }
238
239     /**
240      * Sets the port number.
241      * @param portNumber the port number to use.
242      */

243     public void setPortNumber(final String JavaDoc portNumber) {
244         this.portNumber = portNumber;
245     }
246
247     /**
248      * Sets the database name.
249      * @param databaseName the name of the database.
250      */

251     public void setDatabaseName(final String JavaDoc databaseName) {
252         this.databaseName = databaseName;
253     }
254
255 }
256
Popular Tags