package org.exist.http.servlets; import java.io.File; import java.io.IOException; import java.io.PrintStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.exist.EXistException; import org.exist.storage.BrokerPool; import org.exist.util.Configuration; import org.exist.util.DatabaseConfigurationException; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Database; import org.xmldb.api.base.XMLDBException; // created 17. Mai 2002 /** * Servlet to configure eXist. Use this servlet in a web * application to launch the database at startup. * * *@author Wolfgang Meier <meier@ifs.tu-darmstadt.de> */ public class DatabaseAdminServlet extends HttpServlet { protected String confFile; protected Configuration configuration = null; protected String dbHome; public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintStream output = new PrintStream( response.getOutputStream() ); response.setContentType( "text/html" ); response.addHeader( "pragma", "no-cache" ); response.addHeader( "Cache-Control", "no-cache" ); output.println( "<h1>eXist Database Server Status</h1>" ); String action = request.getParameter( "action" ); try { if ( action != null ) { if ( action.equalsIgnoreCase( "start" ) ) { if ( !BrokerPool.isConfigured() ) { BrokerPool.configure( 1, 5, configuration ); output.println( "<p>Server has been started...</p>" ); } else output.println( "<p>Server is already running.</p>" ); } else if ( action.equalsIgnoreCase( "shutdown" ) ) { if ( BrokerPool.isConfigured() ) { BrokerPool.stopAll(false); output.println( "<p>Server has been shut down...</p>" ); } else output.println( "<p>Server is not running ...</p>" ); } } if ( !BrokerPool.isConfigured() ) output.println( "<p>Server is not running ...</p>" ); else { output.println( "<p>The database server is running ...</p>" ); BrokerPool pool = BrokerPool.getInstance(); Configuration conf = pool.getConfiguration(); output.println( "<table width=\"80%\"><tr>" + "<th colspan=\"2\" align=\"left\" bgcolor=\"#0086b2\"><b>Status</b></th></tr>" ); output.println( "<tr><td>Address:</td><td>" + request.getRequestURI() + "</td></tr>" ); output.println( "<tr><td>Configuration:</td><td>" + conf.getConfigFilePath() + "</td></tr>" ); output.println( "<tr><td>Data directory:</td><td>" + (String) conf.getProperty(BrokerPool.PROPERTY_DATA_DIR) + "</td></tr>" ); output.println( "<tr><td>Active instances:</td><td>" + pool.active() + "</td></tr>" ); output.println( "<tr><td>Available instances:</td><td>" + pool.available() + "</td></tr>" ); output.println( "</table>" ); } output.print( "<p><form action=\"" ); output.print( response.encodeURL( request.getRequestURI() ) ); output.println( "\" method=\"GET\">" ); output.print( "<input type=\"submit\" name=\"action\" value=\"start\">" ); output.print( "<input type=\"submit\" name=\"action\" value=\"shutdown\">" ); output.println( "</form></p>" ); output.flush(); } catch ( EXistException e ) { throw new ServletException( e.getMessage() ); } catch (DatabaseConfigurationException e) { throw new ServletException( e.getMessage() ); } } /** * Initialize the servlet. Tries to determine the base directory * for eXist (usually WEB-INF) and the location of the configuration * file. If a valid configuration is found, the database is launched * by configuring the pool of database brokers. * * In web.xml, add the option * * <load-on-startup>2</load-on-startup> * * for the servlet to be loaded on server startup. * * @see javax.servlet.Servlet#init(ServletConfig) */ public void init( ServletConfig config ) throws ServletException { super.init( config ); if(BrokerPool.isConfigured()) { this.log("database already started. Giving up."); return; } String pathSep = File.separator; try { confFile = config.getInitParameter( "configuration" ); dbHome = config.getInitParameter( "basedir" ); String start = config.getInitParameter( "start" ); if ( confFile == null ) confFile = "conf.xml"; dbHome = ( dbHome == null ) ? config.getServletContext().getRealPath( "." ) : config.getServletContext().getRealPath( dbHome ); this.log( "DatabaseAdminServlet: exist.home=" + dbHome ); File f = new File( dbHome + pathSep + confFile ); this.log("reading configuration from " + f.getAbsolutePath()); if ( !f.canRead() ) throw new ServletException( "configuration file " + confFile + " not found or not readable" ); configuration = new Configuration( confFile, dbHome ); if ( start != null && start.equals( "true" ) ) startup(); } catch ( DatabaseConfigurationException dce ) { throw new ServletException( "error in database configuration: " + dce.getMessage() ); } } public void destroy() { this.log("starting database shutdown ..."); BrokerPool.stopAll(false); } private void startup() throws ServletException { if ( configuration == null ) throw new ServletException( "database has not been " + "configured" ); this.log("configuring eXist instance"); try { if ( !BrokerPool.isConfigured() ) BrokerPool.configure( 1, 5, configuration ); } catch ( EXistException e ) { throw new ServletException( e.getMessage() ); } catch (DatabaseConfigurationException e) { throw new ServletException( e.getMessage() ); } try { this.log("registering XMLDB driver"); String driver = "org.exist.xmldb.DatabaseImpl"; Class clazz = Class.forName(driver); Database database = (Database)clazz.newInstance(); database.setProperty("auto-create", "true"); DatabaseManager.registerDatabase(database); } catch (ClassNotFoundException e) { this.log("ERROR", e); } catch (InstantiationException e) { this.log("ERROR", e); } catch (IllegalAccessException e) { this.log("ERROR", e); } catch (XMLDBException e) { this.log("ERROR", e); } } }