blob: 0defb8814ebb0d90ab728375ff9c18582c0f09cc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* 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. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.testing;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.derby.drda.NetworkServerControl;
import org.apache.roller.weblogger.business.startup.SQLScriptRunner;
import org.junit.jupiter.api.extension.*;
import java.io.File;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
public class DerbyExtension implements BeforeAllCallback, AfterAllCallback {
private static Log log = LogFactory.getLog(DerbyExtension.class);
private static DerbyStartStopper derbyStartStopper =
new DerbyStartStopper("target/derby-system", "target/dbscripts", "4224");
@Override
public void beforeAll(ExtensionContext extensionContext) throws Exception {
derbyStartStopper.start();
}
@Override
public void afterAll(ExtensionContext extensionContext) throws Exception {
try {
derbyStartStopper.stop();
} catch (Exception e) {
log.warn("Error stopping Derby", e);
}
}
}
class DerbyStartStopper {
private String databaseDir;
private String databaseScriptsDir;
private String port;
DerbyStartStopper( String databaseDir, String databaseScriptsDir, String port ) {
this.databaseDir = databaseDir;
this.databaseScriptsDir = databaseScriptsDir;
this.port = port;
}
public void start() throws Exception {
System.out.println("==============");
System.out.println("Starting Derby");
System.out.println("==============");
System.setProperty("derby.system.home", databaseDir);
System.setProperty("derby.drda.portNumber", port);
System.setProperty("derby.drda.host", "localhost");
System.setProperty("derby.drda.maxThreads", "10");
//System.setProperty("derby.drda.logConnections","true");
NetworkServerControl server = new NetworkServerControl();
server.start(new PrintWriter(System.out));
try {
Thread.sleep(2000);
} catch (Exception ignored) {
}
System.out.println("Runtime Info: " + server.getRuntimeInfo());
System.out.println("System Info: " + server.getSysinfo());
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn = DriverManager.getConnection("jdbc:derby:rollerdb;create=true", "APP", "APP");
// create roller tables
SQLScriptRunner runner1 = new SQLScriptRunner(
databaseScriptsDir
+ File.separator + "droptables.sql");
runner1.runScript(conn, false);
SQLScriptRunner runner = new SQLScriptRunner(
databaseScriptsDir
+ File.separator + "derby"
+ File.separator + "createdb.sql");
try {
runner.runScript(conn, true);
} catch (Exception ignored) {
for (String message : runner.getMessages()) {
System.out.println(message);
}
ignored.printStackTrace();
}
}
public void stop() throws Exception {
String driverURL = "jdbc:derby://localhost:" + port + "/rollerdb";
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn = DriverManager.getConnection(driverURL,"APP", "APP");
// drop Roller tables
SQLScriptRunner runner = new SQLScriptRunner(
databaseScriptsDir + File.separator + "droptables.sql");
runner.runScript(conn, false);
System.out.println("==============");
System.out.println("Stopping Derby");
System.out.println("==============");
try {
DriverManager.getConnection(driverURL + ";shutdown=true");
} catch (Exception ignored) {
}
System.setProperty("derby.system.home", databaseDir);
// Network Derby
System.setProperty("derby.drda.portNumber", port);
System.setProperty("derby.drda.host", "localhost");
System.setProperty("derby.drda.maxThreads", "10");
//System.setProperty("derby.drda.logConnections","true");
NetworkServerControl server = new NetworkServerControl();
server.shutdown();
try {
while (true) {
server.ping();
}
} catch (Exception expected) {}
DriverManager.getConnection("jdbc:derby:;shutdown=true");
try {Thread.sleep(2000);} catch (Exception ignored) {}
}
}