001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.jdbc;
023:
024: import java.sql.Connection;
025: import java.sql.DriverManager;
026: import java.sql.SQLException;
027:
028: import javax.management.MBeanRegistration;
029: import javax.management.MBeanServer;
030: import javax.management.MalformedObjectNameException;
031: import javax.management.ObjectName;
032:
033: import org.jboss.system.ServiceMBeanSupport;
034:
035: /**
036: * Integration with <a href="http://incubator.apache.org/derby/index.html">Derby</a>.
037: *
038: * <p>Starts Derby database in-VM.
039: *
040: * @jmx.mbean name="jboss:service=Derby"
041: * extends="org.jboss.system.ServiceMBean"
042: *
043: * @author <a href="mailto:alex@jboss.org">Alexey Loubyansky</a>
044: * @version $Revision: 57210 $
045: */
046: public class DerbyDatabase extends ServiceMBeanSupport implements
047: DerbyDatabaseMBean, MBeanRegistration {
048: /**
049: * Default password: <code>empty string</code>.
050: */
051: private static final String DEFAULT_PASSWORD = "";
052:
053: /**
054: * Default user: <code>sa</code>.
055: */
056: private static final String DEFAULT_USER = "sa";
057:
058: /**
059: * JDBC Driver class: <code>org.apache.derby.jdbc.EmbeddedDriver</code>.
060: */
061: private static final String JDBC_DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver";
062:
063: /**
064: * JDBC URL common prefix: <code>jdbc:derby:</code>.
065: */
066: private static final String JDBC_URL_PREFIX = "jdbc:derby:";
067:
068: /**
069: * Default data subdir: <code>derby</code>.
070: */
071: private static final String DERBY_DATA_DIR = "derby";
072:
073: /**
074: * Default database name: <code>default</code>.
075: */
076: private static final String DEFAULT_DATABASE_NAME = "default";
077:
078: /**
079: * Database name.
080: */
081: String name = DEFAULT_DATABASE_NAME;
082:
083: /**
084: * Database user.
085: */
086: private String user = DEFAULT_USER;
087:
088: /**
089: * Database password.
090: */
091: private String password = DEFAULT_PASSWORD;
092:
093: /**
094: * Hold a connection for in process derby.
095: */
096: private Connection connection;
097:
098: /**
099: * Set the database name.
100: *
101: * @jmx.managed-attribute
102: */
103: public void setDatabase(String name) {
104: if (name == null) {
105: name = DEFAULT_DATABASE_NAME;
106: }
107:
108: this .name = name;
109: }
110:
111: /**
112: * Get the database name.
113: *
114: * @jmx.managed-attribute
115: */
116: public String getDatabase() {
117: return name;
118: }
119:
120: /**
121: * @return the password
122: *
123: * @jmx.managed-attribute
124: */
125: public String getPassword() {
126: return password;
127: }
128:
129: /**
130: * @return the user
131: *
132: * @jmx.managed-attribute
133: */
134: public String getUser() {
135: return user;
136: }
137:
138: /**
139: * @param password
140: *
141: * @jmx.managed-attribute
142: */
143: public void setPassword(String password) {
144: if (password == null) {
145: password = DEFAULT_PASSWORD;
146: }
147:
148: this .password = password;
149: }
150:
151: /**
152: * @param user
153: *
154: * @jmx.managed-attribute
155: */
156: public void setUser(String user) {
157: if (user == null) {
158: user = DEFAULT_USER;
159: }
160:
161: this .user = user;
162: }
163:
164: protected ObjectName getObjectName(MBeanServer server,
165: ObjectName name) throws MalformedObjectNameException {
166: return name == null ? OBJECT_NAME : name;
167: }
168:
169: protected void startService() throws Exception {
170: String dbURL = JDBC_URL_PREFIX
171: + System.getProperty("jboss.server.data.dir") + '/'
172: + DerbyDatabase.DERBY_DATA_DIR + '/' + name
173: + ";create=true";
174: log.info("starting derby " + dbURL);
175:
176: // hold a connection so hypersonic does not close the database
177: connection = getConnection(dbURL);
178: }
179:
180: protected void stopService() throws Exception {
181: try {
182: getConnection("jdbc:derby:;shutdown=true");
183: log
184: .error("According to the docs, should have caught an exception!");
185: } catch (SQLException e) {
186: log.info("Derby shutdown successfully.", e);
187: }
188:
189: connection = null;
190: }
191:
192: /**
193: * Get the connection.
194: *
195: * @param dbURL jdbc url.
196: *
197: * @return the connection, allocate one if needed.
198: *
199: * @throws Exception
200: */
201: private synchronized Connection getConnection(String dbURL)
202: throws Exception {
203: if (connection == null) {
204: ClassLoader cl = Thread.currentThread()
205: .getContextClassLoader();
206:
207: Class.forName(JDBC_DRIVER_CLASS, true, cl).newInstance();
208:
209: connection = DriverManager.getConnection(dbURL, user,
210: password);
211: }
212:
213: return connection;
214: }
215: }
|