package org.opennaas.core.hsqldb.internal;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hsqldb.ServerConfiguration;
import org.hsqldb.ServerConstants;
import org.hsqldb.persist.HsqlProperties;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class HSQLDBServer implements InitializingBean, DisposableBean {
private static Log logger = LogFactory.getLog(HSQLDBServer.class);
// private Server databaseServer;
/**
* Properties used to customize instance.
*/
private Properties serverProperties;
/**
* The actual server instance.
*/
private org.hsqldb.Server server;
/**
* DataSource used for shutdown.
*/
private DataSource dataSource;
public Properties getServerProperties() {
return serverProperties;
}
public void setServerProperties(Properties serverProperties) {
this.serverProperties = serverProperties;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void afterPropertiesSet() throws Exception {
HsqlProperties configProps = new HsqlProperties(serverProperties);
/*
* if (configProps == null) { logger.warn("we failed at getting an HSQL Server with serverProperties, trying to get one without"); configProps
* = new HsqlProperties(); if (configProps == null) logger.error("we failed at getting an HSQL Server, period. Crash and burn from here on.");
* }
*/
ServerConfiguration.translateDefaultDatabaseProperty(configProps);
// finished setting up properties - set some important behaviors as
// well;
server = new org.hsqldb.Server();
server.setRestartOnShutdown(false);
server.setNoSystemExit(true);
server.setProperties(configProps);
logger.info("HSQL Server Startup sequence initiated");
server.start();
String portMsg = "port " + server.getPort();
logger.info("HSQL Server listening on " + portMsg);
}
public void destroy() {
logger.info("HSQL Server Shutdown sequence initiated");
if (dataSource != null) {
Connection con = null;
try {
con = dataSource.getConnection();
con.createStatement().execute("SHUTDOWN");
} catch (SQLException e) {
logger.error("HSQL Server Shutdown failed: " + e.getMessage());
} finally {
try {
if (con != null)
con.close();
} catch (Exception ignore) {
}
}
} else {
logger
.warn("HSQL ServerBean needs a dataSource property set to shutdown database safely.");
}
server.signalCloseAllServerConnections();
int status = server.stop();
long timeout = System.currentTimeMillis() + 5000;
while (status != ServerConstants.SERVER_STATE_SHUTDOWN
&& System.currentTimeMillis() < timeout) {
try {
Thread.sleep(100);
status = server.getState();
} catch (InterruptedException e) {
logger.error("Error while shutting down HSQL Server: "
+ e.getMessage());
break;
}
}
if (status != ServerConstants.SERVER_STATE_SHUTDOWN) {
logger.warn("HSQL Server failed to shutdown properly.");
} else {
logger.info("HSQL Server Shutdown completed");
}
server = null;
}
}