/*
* Copyright 2011-2012 Brian Matthews
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.btmatthews.maven.plugins.inmemdb.db.hsqldb;
import java.text.MessageFormat;
import javax.sql.DataSource;
import org.hsqldb.DatabaseURL;
import org.hsqldb.jdbc.JDBCDataSource;
import org.hsqldb.server.Server;
import org.hsqldb.server.ServerConstants;
import com.btmatthews.maven.plugins.inmemdb.Loader;
import com.btmatthews.maven.plugins.inmemdb.db.AbstractSQLDatabase;
import com.btmatthews.maven.plugins.inmemdb.ldr.dbunit.DBUnitCSVLoader;
import com.btmatthews.maven.plugins.inmemdb.ldr.dbunit.DBUnitFlatXMLLoader;
import com.btmatthews.maven.plugins.inmemdb.ldr.dbunit.DBUnitXLSLoader;
import com.btmatthews.maven.plugins.inmemdb.ldr.dbunit.DBUnitXMLLoader;
import com.btmatthews.maven.plugins.inmemdb.ldr.sqltool.SQLLoader;
import com.btmatthews.utils.monitor.Logger;
/**
* Implements support for in-memory HSQLDB databases.
*
* @author <a href="mailto:brian@btmatthews.com">Brian Matthews</a>
* @version 1.0.0
*/
public final class HSQLDBDatabase extends AbstractSQLDatabase {
/**
* The connection protocol for in-memory HSQLDB databases.
*/
private static final String PROTOCOL = "hsqldb:hsql://localhost:{0,number,#}/";
/**
* Default port HSQLDB listens on, can be altered via setting port property
*/
private static final int DEFAULT_PORT = ServerConstants.SC_DEFAULT_HSQL_SERVER_PORT;
private static final int PING_RETRIES = 10;
private static final int PING_DELAY = 100;
/**
* The loaders that are supported for loading data or executing scripts.
*/
private static final Loader[] LOADERS = new Loader[]{
new DBUnitXMLLoader(), new DBUnitFlatXMLLoader(),
new DBUnitCSVLoader(), new DBUnitXLSLoader(), new SQLLoader()};
/**
* The HSQLDB server.
*/
private Server server;
/**
* The default constructor initializes the default database port.
*/
public HSQLDBDatabase() {
super(DEFAULT_PORT);
}
/**
* Get the database connection protocol.
*
* @return Always returns {@link HSQLDBDatabase#PROTOCOL}.
*/
@Override
protected String getUrlProtocol() {
return MessageFormat.format(PROTOCOL, getPort());
}
/**
* Get the data source that describes the connection to the in-memory HSQLDB
* database.
*
* @return Returns {@code dataSource} which was initialised by the
* constructor.
*/
@Override
public DataSource getDataSource() {
final JDBCDataSource dataSource = new JDBCDataSource();
dataSource.setUrl(getUrl());
dataSource.setUser(getUsername());
dataSource.setPassword(getPassword());
return dataSource;
}
/**
* Get the loaders that are supported for loading data or executing scripts.
*
* @return Returns {@link #LOADERS}.
*/
@Override
public Loader[] getLoaders() {
return LOADERS;
}
/**
* Start the in-memory HSQLDB server.
*
* @param logger Used to report errors and raise exceptions.
*/
@Override
public void start(final Logger logger) {
logger.logInfo("Starting embedded HSQLDB database");
server = new Server();
server.setDatabasePath(0, DatabaseURL.S_MEM + getDatabaseName());
server.setDatabaseName(0, getDatabaseName());
server.setDaemon(true);
server.setAddress(ServerConstants.SC_DEFAULT_ADDRESS);
server.setPort(getPort());
server.setErrWriter(null);
server.setLogWriter(null);
server.setTls(false);
server.setTrace(false);
server.setSilent(true);
server.setNoSystemExit(true);
server.setRestartOnShutdown(false);
server.start();
logger.logInfo("Started embedded HSQLDB database");
}
/**
* Shutdown the in-memory HSQLDB database by sending it a SHUTDOWN command.
*
* @param logger Used to report errors and raise exceptions.
*/
@Override
public void stop(final Logger logger) {
logger.logInfo("Stopping embedded HSQLDB database");
if (server != null) {
server.stop();
server.shutdown();
}
logger.logInfo("Stopping embedded HSQLDB database");
}
@Override
public boolean isStarted(final Logger logger) {
if (server != null) {
try {
server.checkRunning(true);
return true;
} catch (final RuntimeException e) {
return false;
}
}
return false;
}
@Override
public boolean isStopped(final Logger logger) {
try {
server.checkRunning(false);
return true;
} catch (final RuntimeException e) {
return false;
}
}
}