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);
  +             }
        }
  -
   }
  
  
  

Reply via email to