001: /**
002: * Copyright (c) 2003-2007, David A. Czarnecki
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * Redistributions of source code must retain the above copyright notice, this list of conditions and the
009: * following disclaimer.
010: * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
011: * following disclaimer in the documentation and/or other materials provided with the distribution.
012: * Neither the name of "David A. Czarnecki" and "blojsom" nor the names of its contributors may be used to
013: * endorse or promote products derived from this software without specific prior written permission.
014: * Products derived from this software may not be called "blojsom", nor may "blojsom" appear in their name,
015: * without prior written permission of David A. Czarnecki.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
018: * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
019: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
020: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
021: * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
022: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
025: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
026: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
027: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
028: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
029: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030: */package org.blojsom.util.database;
031:
032: import org.apache.commons.logging.Log;
033: import org.apache.commons.logging.LogFactory;
034: import org.blojsom.util.BlojsomUtils;
035: import org.hibernate.SQLQuery;
036: import org.hibernate.Session;
037: import org.hibernate.SessionFactory;
038: import org.hibernate.Transaction;
039:
040: import javax.servlet.ServletConfig;
041: import java.io.BufferedReader;
042: import java.io.InputStream;
043: import java.io.InputStreamReader;
044: import java.io.StringReader;
045: import java.sql.Connection;
046: import java.sql.PreparedStatement;
047: import java.util.List;
048:
049: /**
050: * Database loader
051: *
052: * @author David Czarnecki
053: * @version $Id: DatabaseLoader.java,v 1.6 2007/01/17 02:35:18 czarneckid Exp $
054: * @since blojsom 3.0
055: */
056: public class DatabaseLoader {
057:
058: private Log _logger = LogFactory.getLog(DatabaseLoader.class);
059:
060: private static final String DEFAULT_DETECT_BLOJSOM_SQL = "show tables;";
061:
062: private String _dbScript;
063: private SessionFactory _sessionFactory;
064: private ServletConfig _servletConfig;
065: private String _detectBlojsomSQL;
066: private boolean _upgrading = false;
067:
068: /**
069: * Create a new instance of the Database loader
070: */
071: public DatabaseLoader() {
072: }
073:
074: /**
075: * Set the {@link SessionFactory}
076: *
077: * @param sessionFactory {@link SessionFactory}
078: */
079: public void setSessionFactory(SessionFactory sessionFactory) {
080: _sessionFactory = sessionFactory;
081: }
082:
083: /**
084: * Set the DB script to initialize and load the database
085: *
086: * @param dbScript DB script to initialize and load the database
087: */
088: public void setDbScript(String dbScript) {
089: _dbScript = dbScript;
090: }
091:
092: /**
093: * Set the {@link ServletConfig}
094: *
095: * @param servletConfig {@link ServletConfig}
096: */
097: public void setServletConfig(ServletConfig servletConfig) {
098: _servletConfig = servletConfig;
099: }
100:
101: /**
102: * SQL to detect blojsom
103: *
104: * @param detectBlojsomSQL SQL to detect blojsom
105: */
106: public void setDetectBlojsomSQL(String detectBlojsomSQL) {
107: _detectBlojsomSQL = detectBlojsomSQL;
108: }
109:
110: /**
111: * Signal an upgrade for the database loader
112: *
113: * @param upgrading <code>true</code> if upgrading the database using the database script, <code>false</code> otherwise
114: */
115: public void setUpgrading(boolean upgrading) {
116: _upgrading = upgrading;
117: }
118:
119: /**
120: * Initalize the blojsom database
121: */
122: public void init() {
123: if (_dbScript == null) {
124: if (_logger.isErrorEnabled()) {
125: _logger.error("No database creation script defined");
126: }
127:
128: return;
129: }
130:
131: if (BlojsomUtils.checkNullOrBlank(_detectBlojsomSQL)) {
132: _detectBlojsomSQL = DEFAULT_DETECT_BLOJSOM_SQL;
133: }
134:
135: Session session = _sessionFactory.openSession();
136: Transaction tx = null;
137:
138: try {
139: tx = session.beginTransaction();
140:
141: if (!_upgrading) {
142: if (_logger.isInfoEnabled()) {
143: _logger.info("About to create blojsom database");
144: }
145: } else {
146: if (_logger.isInfoEnabled()) {
147: _logger.info("About to upgrade blojsom database");
148: }
149: }
150:
151: SQLQuery sqlQuery = session
152: .createSQLQuery(_detectBlojsomSQL);
153: List tables = sqlQuery.list();
154:
155: if (tables.size() > 0 && !_upgrading) {
156: if (_logger.isInfoEnabled()) {
157: _logger.info("blojsom database already created");
158: }
159: } else {
160: Connection sqlConnection = session.connection();
161:
162: InputStream is = _servletConfig.getServletContext()
163: .getResourceAsStream(_dbScript);
164: BufferedReader bufferedReader = new BufferedReader(
165: new InputStreamReader(is));
166: String input;
167: StringBuffer sql = new StringBuffer();
168:
169: while ((input = bufferedReader.readLine()) != null) {
170: if (!input.startsWith("--")
171: && !"".equals(input.trim())) {
172: if (!input.endsWith(";")) {
173: sql.append(input).append(" ");
174: } else {
175: if (_dbScript.indexOf("oracle") != -1) {
176: sql.append(
177: input.substring(0, input
178: .length() - 1)).append(
179: "\n");
180: } else {
181: sql.append(input).append("\n");
182: }
183: }
184: }
185: }
186:
187: if (_logger.isInfoEnabled()) {
188: _logger.info("Read in sql script");
189: }
190:
191: bufferedReader = new BufferedReader(new StringReader(
192: sql.toString()));
193: PreparedStatement preparedStatement;
194:
195: while ((input = bufferedReader.readLine()) != null) {
196: preparedStatement = sqlConnection
197: .prepareStatement(input);
198: preparedStatement.execute();
199: }
200:
201: if (!_upgrading) {
202: if (_logger.isInfoEnabled()) {
203: _logger
204: .info("Finised blojsom database creation");
205: }
206: } else {
207: if (_logger.isInfoEnabled()) {
208: _logger
209: .info("Finised upgrading blojsom database");
210: }
211: }
212: }
213:
214: tx.commit();
215: } catch (Exception e) {
216: if (_logger.isErrorEnabled()) {
217: _logger.error(e);
218: }
219:
220: if (tx != null) {
221: tx.rollback();
222: }
223: } finally {
224: session.close();
225: }
226: }
227: }
|