/*
* ServerShutdown.java - Jul 20, 2003
*
* @author wolf
*/
package org.exist;
import org.apache.avalon.excalibur.cli.CLArgsParser;
import org.apache.avalon.excalibur.cli.CLOption;
import org.apache.avalon.excalibur.cli.CLOptionDescriptor;
import org.apache.avalon.excalibur.cli.CLUtil;
import org.apache.xmlrpc.XmlRpcException;
import org.exist.storage.DBBroker;
import org.exist.util.ConfigurationHelper;
import org.exist.xmldb.DatabaseInstanceManager;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.XMLDBException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
/**
* Call the main method of this class to shut down a running database instance.
*
* @author wolf
*/
public class ServerShutdown {
// command-line options
private final static int HELP_OPT = 'h';
private final static int URI_OPT = 'l';
private final static int USER_OPT = 'u';
private final static int PASSWORD_OPT = 'p';
private final static CLOptionDescriptor OPTIONS[] = new CLOptionDescriptor[] {
new CLOptionDescriptor("help",
CLOptionDescriptor.ARGUMENT_DISALLOWED, HELP_OPT,
"print help on command line options and exit."),
new CLOptionDescriptor("user",
CLOptionDescriptor.ARGUMENT_REQUIRED, USER_OPT,
"specify username (has to be a member of group dba)."),
new CLOptionDescriptor("password",
CLOptionDescriptor.ARGUMENT_REQUIRED, PASSWORD_OPT,
"specify password for the user."),
new CLOptionDescriptor("uri", CLOptionDescriptor.ARGUMENT_REQUIRED,
URI_OPT,
"the XML:DB URI of the database instance to be shut down.") };
public static void main(String[] args) {
CLArgsParser optParser = new CLArgsParser(args, OPTIONS);
if (optParser.getErrorString() != null) {
System.err.println("ERROR: " + optParser.getErrorString());
return;
}
Properties properties = loadProperties();
String user = "admin";
String passwd = null;
String uri = properties.getProperty("uri", "xmldb:exist://localhost:8080/exist/xmlrpc");
List opt = optParser.getArguments();
int size = opt.size();
CLOption option;
for (int i = 0; i < size; i++) {
option = (CLOption) opt.get(i);
switch (option.getId()) {
case HELP_OPT:
System.out.println("Usage: java "
+ ServerShutdown.class.getName() + " [options]");
System.out.println(CLUtil.describeOptions(OPTIONS)
.toString());
return;
case USER_OPT:
user = option.getArgument();
break;
case PASSWORD_OPT:
passwd = option.getArgument();
break;
case URI_OPT:
uri = option.getArgument();
}
}
try {
// initialize database drivers
Class cl = Class.forName("org.exist.xmldb.DatabaseImpl");
// create the default database
Database database = (Database) cl.newInstance();
DatabaseManager.registerDatabase(database);
if (!uri.endsWith(DBBroker.ROOT_COLLECTION))
uri = uri + DBBroker.ROOT_COLLECTION;
Collection root = DatabaseManager.getCollection(uri, user, passwd);
DatabaseInstanceManager manager = (DatabaseInstanceManager) root
.getService("DatabaseInstanceManager", "1.0");
System.out.println("Shutting down database instance at ");
System.out.println('\t' + uri);
manager.shutdown();
} catch (XMLDBException e) {
System.err.println("ERROR: " + e.getMessage());
Throwable t = e.getCause();
if(t!=null && t instanceof XmlRpcException){
System.err.println("CAUSE: "+t.getMessage());
} else {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static Properties loadProperties() {
Properties clientProps = new Properties();
File propFile = ConfigurationHelper.lookup("client.properties");
InputStream pin = null;
// Try to load from file
try {
pin = new FileInputStream(propFile);
} catch (FileNotFoundException ex) {
// File not found, no exception handling
}
if (pin == null) {
// Try to load via classloader
pin = ServerShutdown.class.getResourceAsStream("client.properties");
}
if (pin != null) {
// Try to load properties from stream
try {
clientProps.load(pin);
} catch (IOException ex) {
//
}
}
return clientProps;
}
}