org.jboss.jdbc.DerbyDatabase Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import org.jboss.system.ServiceMBeanSupport;
/**
* Integration with Derby.
*
* Starts Derby database in-VM.
*
* @jmx.mbean name="jboss:service=Derby"
* extends="org.jboss.system.ServiceMBean"
*
* @author Alexey Loubyansky
* @version $Revision: 81038 $
*/
public class DerbyDatabase
extends ServiceMBeanSupport
implements DerbyDatabaseMBean, MBeanRegistration
{
/**
* Default password: empty string
.
*/
private static final String DEFAULT_PASSWORD = "";
/**
* Default user: sa
.
*/
private static final String DEFAULT_USER = "sa";
/**
* JDBC Driver class: org.apache.derby.jdbc.EmbeddedDriver
.
*/
private static final String JDBC_DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver";
/**
* JDBC URL common prefix: jdbc:derby:
.
*/
private static final String JDBC_URL_PREFIX = "jdbc:derby:";
/**
* Default data subdir: derby
.
*/
private static final String DERBY_DATA_DIR = "derby";
/**
* Default database name: default
.
*/
private static final String DEFAULT_DATABASE_NAME = "default";
/**
* Database name.
*/
String name = DEFAULT_DATABASE_NAME;
/**
* Database user.
*/
private String user = DEFAULT_USER;
/**
* Database password.
*/
private String password = DEFAULT_PASSWORD;
/**
* Hold a connection for in process derby.
*/
private Connection connection;
/**
* Set the database name.
*
* @jmx.managed-attribute
*/
public void setDatabase(String name)
{
if (name == null)
{
name = DEFAULT_DATABASE_NAME;
}
this.name = name;
}
/**
* Get the database name.
*
* @jmx.managed-attribute
*/
public String getDatabase()
{
return name;
}
/**
* @return the password
*
* @jmx.managed-attribute
*/
public String getPassword()
{
return password;
}
/**
* @return the user
*
* @jmx.managed-attribute
*/
public String getUser()
{
return user;
}
/**
* @param password
*
* @jmx.managed-attribute
*/
public void setPassword(String password)
{
if (password == null)
{
password = DEFAULT_PASSWORD;
}
this.password = password;
}
/**
* @param user
*
* @jmx.managed-attribute
*/
public void setUser(String user)
{
if (user == null)
{
user = DEFAULT_USER;
}
this.user = user;
}
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
throws MalformedObjectNameException
{
return name == null ? OBJECT_NAME : name;
}
protected void startService() throws Exception
{
String dbURL = JDBC_URL_PREFIX + System.getProperty("jboss.server.data.dir") +
'/' + DerbyDatabase.DERBY_DATA_DIR +
'/' + name + ";create=true";
log.info("starting derby " + dbURL);
// hold a connection so hypersonic does not close the database
connection = getConnection(dbURL);
}
protected void stopService() throws Exception
{
try
{
getConnection("jdbc:derby:;shutdown=true");
log.error("According to the docs, should have caught an exception!");
}
catch(SQLException e)
{
log.info("Derby shutdown successfully.", e);
}
connection = null;
}
/**
* Get the connection.
*
* @param dbURL jdbc url.
*
* @return the connection, allocate one if needed.
*
* @throws Exception
*/
private synchronized Connection getConnection(String dbURL) throws Exception
{
if (connection == null)
{
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class.forName(JDBC_DRIVER_CLASS, true, cl).newInstance();
connection = DriverManager.getConnection(dbURL, user, password);
}
return connection;
}
}