You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by ke...@apache.org on 2003/07/14 20:30:55 UTC

cvs commit: xml-xindice/java/src/org/apache/xindice/server XindiceServlet.java

kevinross    2003/07/14 11:30:55

  Modified:    java/src/org/apache/xindice/server XindiceServlet.java
  Log:
  refactored for:
  1.  consistency of loading between embed and xmlrpc options
  2.  reduce double checks for log levels when not doing an expensive logging operation
  3.  exceptions.  Wow.  was try/catch, don't always log, sometimes do, catches everywhere.
  
  Revision  Changes    Path
  1.16      +113 -121  xml-xindice/java/src/org/apache/xindice/server/XindiceServlet.java
  
  Index: XindiceServlet.java
  ===================================================================
  RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/server/XindiceServlet.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- XindiceServlet.java	14 Jul 2003 16:30:12 -0000	1.15
  +++ XindiceServlet.java	14 Jul 2003 18:30:55 -0000	1.16
  @@ -76,7 +76,7 @@
   import org.apache.xindice.core.Database;
   import org.apache.xindice.server.rpc.RPCMessageInterface;
   import org.apache.xindice.util.Configuration;
  -import org.apache.xindice.util.XindiceException;
  +import org.apache.xindice.util.ConfigurationException;
   import org.apache.xindice.xml.dom.DOMParser;
   import org.apache.xmlrpc.XmlRpc;
   import org.apache.xmlrpc.XmlRpcServer;
  @@ -95,7 +95,7 @@
   	private static final String DEFAULT_XMLRPC_DRIVER = "xerces";
   	protected static Log log = LogFactory.getLog("org.apache.xindice.servlet");
   	protected Database database;
  -	protected XmlRpcServer xmlrpc;
  +	protected XmlRpcServer xmlrpcServer;
   
   	private String xmlRpcDriver;
   
  @@ -107,9 +107,8 @@
   			if (database != null) {
   				database.close();
   			}
  -			if (log.isInfoEnabled()) {
  -				log.info("Database successfully closed");
  -			}
  +
  +			log.info("Database successfully closed");
   		}
   		catch (Exception e) {
   			log.error("Error in destroy", e);
  @@ -128,7 +127,7 @@
   	 * only XML-RPC query is supported.
   	 */
   	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  -		byte[] result = xmlrpc.execute(request.getInputStream());
  +		byte[] result = xmlrpcServer.execute(request.getInputStream());
   		response.setContentType("text/xml");
   		response.setContentLength(result.length);
   		OutputStream output = response.getOutputStream();
  @@ -152,70 +151,62 @@
   	 * TODO: verify that if is an error occured, the database will be closed
   	 * propertly
   	 */
  -	public void init(ServletConfig config) throws ServletException {
  +	public void init(ServletConfig servletConfig) throws ServletException {
   
  -		/* note: there no need to call the DatabaseManager since we already
  -		 * know the database we are using: the XML-RPC one */
  -		database = new Database();
  +		Configuration configuration = loadConfiguration(servletConfig);
   
  -		/* holds the database configuration */
  -		Document configurationDocument;
  +		//
  +		// The configuration is wrapped in a <xindice> element so we need to get the "root-collection" configuration.
  +		//
   		try {
  -			configurationDocument = loadConfiguration(config);
  -		}
  -		catch (Exception e) {
  -			throw new ServletException("Could not load database configuration", e);
  -		}
  +			Configuration rootCollectionConfiguration = configuration.getChild("root-collection");
   
  -		Configuration configuration = new Configuration(configurationDocument, false);
  +			if (rootCollectionConfiguration == null) {
   
  -		// The configuration is wrapped in a <xindice> element so we need to get
  -		// the "root-collection" configuration.
  -		try {
  -			Configuration collConf = configuration.getChild("root-collection");
  -			if (collConf != null) {
  +				throw new ConfigurationException("The database configuration is missing the <root-collection> element");
  +			}
  +			else {
   
  +				//
   				// We need to ensure that the database points to a place where it makes
  -				// sense. If the path in the system.xml file is an absolute path, then
  -				// honor it. If it's not, we first check for the system property "xindice.db.home"
  -				// and if the lookup is successful we use it as the database root parent. If
  -				// the property is not set, we use /WEB-INF relative to the servlet context, unless
  -				// the war has not been unpacked. In this case, we throw an exception and 
  -				// ask the user to specify the location of database root
  -
  -				String dbRoot = collConf.getAttribute(Database.DBROOT, "./db/");
  +				// 	sense. If the path in the system.xml file is an absolute path, then
  +				// 	honor it. If it's not, we first check for the system property "xindice.db.home"
  +				// 	and if the lookup is successful we use it as the database root parent. If
  +				// 	the property is not set, we use /WEB-INF relative to the servlet context, unless
  +				// 	the war has not been unpacked. In this case, we throw an exception and 
  +				// 	ask the user to specify the location of database root
  +				//
  +				String dbRoot = rootCollectionConfiguration.getAttribute(Database.DBROOT, "./db/");
   				File dbRootDir = new File(dbRoot);
   
  -				if (dbRootDir.isAbsolute()) {
  -					database.setConfig(collConf);
  -				}
  -				else {
  -					// OK, no absolute path. We have to perform some checks.
  -
  -					// Stupid hack but spec compliant. If getRealPath() returns null
  -					// the war archive has not been unpacked.
  -					String realPath = config.getServletContext().getRealPath("/WEB-INF");
  +				//
  +				// If there is no absolute path, we have to perform some checks.
  +				//
  +				if (!dbRootDir.isAbsolute()) {
  +
  +					// Stupid hack but spec compliant. 
  +					//		If getRealPath() returns null the war archive has not been unpacked.
  +					//
  +					String realPath = servletConfig.getServletContext().getRealPath("/WEB-INF");
   
   					// Let's see if the property was specified.
   					String home = System.getProperty("xindice.db.home");
   
   					if (home != null) {
  -						collConf.setAttribute(Database.DBROOT, home + System.getProperty("file.separator") + dbRoot);
  +						rootCollectionConfiguration.setAttribute(Database.DBROOT, home + System.getProperty("file.separator") + dbRoot);
   					}
   					else if (realPath != null) {
  -						if (log.isWarnEnabled()) {
  -							log.warn(
  -								"The database root directory has been set to "
  -									+ realPath
  -									+ System.getProperty("file.separator")
  -									+ dbRoot
  -									+ ". Keep in mind that if a war upgrade will take place the database"
  -									+ " will be lost.");
  -						}
  -						collConf.setAttribute(Database.DBROOT, realPath + System.getProperty("file.separator") + dbRoot);
  +						log.warn(
  +							"The database root directory has been set to "
  +								+ realPath
  +								+ System.getProperty("file.separator")
  +								+ dbRoot
  +								+ ". Keep in mind that if a war upgrade will take place the database will be lost.");
  +
  +						rootCollectionConfiguration.setAttribute(Database.DBROOT, realPath + System.getProperty("file.separator") + dbRoot);
   					}
   					else {
  -						log.fatal(
  +						throw new ConfigurationException(
   							"The database configuration points to a relative path, "
   								+ "but there was no xindice.home property set. "
   								+ "Furthermore, the war was not unpacked by the application server "
  @@ -223,104 +214,105 @@
   								+ "Please check /WEB-INF/system.xml and set an absolute path "
   								+ "as the \"dbroot\" attribute of \"root-collection\" "
   								+ "or specify a suitable xindice.db.home system property.");
  -						throw new ServletException("An error occurred initializing the database." + "Please see the logs for details");
   					}
  -
   				}
   
  -				database.setConfig(collConf);
  +				//
  +				// We need to use this method to be consistent between deployments (embed, standalone, etc)
  +				//	 and let the Database object maintain the set of Databases. 
  +				//
  +				this.database = Database.getDatabase(rootCollectionConfiguration);
  +			}
  +
  +			// Setup the XML-RPC impl to support UTF-8 input via Xerces.
  +			XmlRpc.setEncoding("UTF8");
  +
  +			/*
  +			 * Setup the SAX parser XML-RPC impl will use.
  +			 * The XmlRpc.setDriver() method takes either the classname or a shorthand
  +			 * name for the SAX parser it will use.  The default (for backwards compatibility
  +			 * if nothing else) is xerces.
  +			 */
  +			String xmlrpcDriver = DEFAULT_XMLRPC_DRIVER;
  +
  +			Configuration xmlRpcConfiguration = configuration.getChild("xml-rpc");
  +			if (xmlRpcConfiguration != null) {
  +				Configuration xmlRpcDriverConfiguration = xmlRpcConfiguration.getChild("driver");
  +				if (xmlRpcDriverConfiguration != null) {
  +					xmlrpcDriver = xmlRpcDriverConfiguration.getAttribute("name", DEFAULT_XMLRPC_DRIVER);
  +					if (xmlrpcDriver == null || xmlrpcDriver.equals("")) { // this will probably never happen due to the default.
  +
  +						throw new ConfigurationException(
  +							"The xml-rpc configuration (in '"
  +								+ servletConfig.getInitParameter(Xindice.PROP_XINDICE_CONFIGURATION)
  +								+ "' contains a malformed 'driver' element."
  +								+ "  The 'driver' element must have a 'name' attribute specifying the driver (XML-RPC terminology for SAX parser)  to use.");
  +					}
  +				}
  +			}
   
  +			try {
  +				XmlRpc.setDriver(xmlrpcDriver);
   			}
  -			else {
  -				throw new ServletException("The database configuration is missing the <root-collection> element");
  +			catch (Exception e) {
  +				throw new ConfigurationException("Failed to set driver for XmlRpc to: " + xmlrpcDriver, e);
   			}
  -		}
  -		catch (Exception e) {
  -			throw new ServletException("Error while handling the configuration", e);
  -		}
   
  -		// Setup the XML-RPC impl to support UTF-8 input via Xerces.
  -		XmlRpc.setEncoding("UTF8");
  -
  -		/*
  -		 * Setup the SAX parser XML-RPC impl will use.
  -		 * The XmlRpc.setDriver() method takes either the classname or a shorthand
  -		 * name for the SAX parser it will use.  The default (for backwards compatibility
  -		 * if nothing else) is xerces.
  -		 */
  -		String xmlrpcDriver = DEFAULT_XMLRPC_DRIVER;
  -
  -		Configuration xmlRpcConfiguration = configuration.getChild("xml-rpc");
  -		if (xmlRpcConfiguration != null) {
  -			Configuration xmlRpcDriverConfiguration = xmlRpcConfiguration.getChild("driver");
  -			if (xmlRpcDriverConfiguration != null) {
  -				xmlrpcDriver = xmlRpcDriverConfiguration.getAttribute("name", DEFAULT_XMLRPC_DRIVER);
  -				if (xmlrpcDriver == null || xmlrpcDriver.equals("")) { // this will probably never happen due to the default.
  -
  -					throw new ServletException(
  -						"The xml-rpc configuration (in '"
  -							+ config.getInitParameter(Xindice.PROP_XINDICE_CONFIGURATION)
  -							+ "' contains a malformed 'driver' element."
  -							+ "  The 'driver' element must have a 'name' attribute specifying the driver"
  -							+ " (XML-RPC terminology for SAX parser)  to use.");
  -				}
  +			// Create the XML-RPC server and add our handler as the default.
  +			this.xmlrpcServer = new XmlRpcServer();
  +			try {
  +				this.xmlrpcServer.addHandler("$default", new RPCMessageInterface());
  +			}
  +			catch (Exception e) {
  +				throw new ConfigurationException("Failed to add default handler to XmlRpc server.", e);
   			}
  -		}
   
  -		try {
  -			XmlRpc.setDriver(xmlrpcDriver);
  -		}
  -		catch (Exception e) {
  -			throw new ServletException("XML-RPC error message: '" + e.getMessage() + "'", e);
  +			log.info("Database successfully started");
   		}
  +		catch (RuntimeException e) {
   
  -		// Create the XML-RPC server and add our handler as the default.
  -		xmlrpc = new XmlRpcServer();
  -		try {
  -			xmlrpc.addHandler("$default", new RPCMessageInterface());
  +			log.fatal(e);
  +			throw new ServletException("Error while handling the configuration", e);
   		}
   		catch (Exception e) {
  -			throw new ServletException("Startup error", e);
  -		}
   
  -		if (log.isInfoEnabled()) {
  -			log.info("Database successfully started");
  -			//log.info("database location: '" + first.getFirstChild().getNodeValue() + "'");
  +			log.fatal(e);
  +			throw new ServletException("Error while handling the configuration", e);
   		}
   	}
   
   	/**
  -	 * Loads the Xindice configuration file. The file is searched in the
  -	 * following locations:
  +	 * Loads the Xindice configuration file. The file is searched in the following locations:
   	 * <ul>
   	 * <li>the <tt>ServletConfig..getInitParameter(Xindice.PROP_XINDICE_CONFIGURATION)</tt> variable located in the servlet
   	 * configuration file</li>
   	 * <li>use the default configuration stored in the <tt>Xindice</tt> class</li>
   	 * </ul>
  -	 * TODO: we should probably try to load from the file system if we
  -	 * can't load it this way.
  +	 * TODO: we should probably try to load from the file system if we can't load it this way.
   	 */
  -	public Document loadConfiguration(ServletConfig config) throws XindiceException, IOException {
  -		Document result;
  +	public Configuration loadConfiguration(ServletConfig servletConfig) {
   
  -		String path = config.getInitParameter(Xindice.PROP_XINDICE_CONFIGURATION);
  -		if (path != null) {
  -			if (log.isDebugEnabled()) {
  +		try {
  +			Document configurationDocument;
  +
  +			String path = servletConfig.getInitParameter(Xindice.PROP_XINDICE_CONFIGURATION);
  +			if (path != null) {
   				log.debug("loading configuration from " + path);
  +				ServletContext context = servletConfig.getServletContext();
  +				InputStream inputStream = context.getResourceAsStream(path);
  +				configurationDocument = DOMParser.toDocument(inputStream);
  +				inputStream.close();
   			}
  -			ServletContext context = config.getServletContext();
  -			InputStream fis = context.getResourceAsStream(path);
  -			result = DOMParser.toDocument(fis);
  -			fis.close();
  -		}
  -		else {
  -			if (log.isDebugEnabled()) {
  +			else {
   				log.debug("loading the standard configuration");
  +				configurationDocument = DOMParser.toDocument(Xindice.DEFAULT_CONFIGURATION);
   			}
  -			result = DOMParser.toDocument(Xindice.DEFAULT_CONFIGURATION);
  +
  +			return new Configuration(configurationDocument, false);
   		}
  +		catch (Exception e) {
   
  -		return result;
  +			throw new ConfigurationException("Failed to load configuration.", e);
  +		}
   	}
  -
   }