Package com.btmatthews.maven.plugins.inmemdb.db.hsqldb

Source Code of com.btmatthews.maven.plugins.inmemdb.db.hsqldb.HSQLDBDatabase

/*
* 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;
        }
    }
}
TOP

Related Classes of com.btmatthews.maven.plugins.inmemdb.db.hsqldb.HSQLDBDatabase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.