You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/09/03 17:19:41 UTC

svn commit: r691632 - /jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/

Author: jukka
Date: Wed Sep  3 08:19:40 2008
New Revision: 691632

URL: http://svn.apache.org/viewvc?rev=691632&view=rev
Log:
JCR-1598: Problematic exception handling in Jackrabbit WebApp 

Added a ServletExceptionWithCause utility class and used it to properly capture chained exceptions.

Minor improvements in exception and log messages.

Added:
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/AbstractConfig.java
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/JcrApiNotFoundException.java
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/LoggingServlet.java
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java
    jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/AbstractConfig.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/AbstractConfig.java?rev=691632&r1=691631&r2=691632&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/AbstractConfig.java (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/AbstractConfig.java Wed Sep  3 08:19:40 2008
@@ -43,8 +43,8 @@
     private BeanMap map = new BeanMap(this);
 
     /**
-     * Initializes the config with values from the given properties
-     * @param props the config properties
+     * Initializes the configuration with values from the given properties
+     * @param props the configuration properties
      */
     public void init(Properties props) throws ServletException {
         Iterator iter = props.keySet().iterator();
@@ -56,8 +56,8 @@
                     map.put(mapName, props.getProperty(name));
                 }
             } catch (Exception e) {
-                log.error("Error in configuration: {}", e.toString());
-                throw new ServletException("Error in configuration: " + e.toString());
+                throw new ServletExceptionWithCause(
+                        "Invalid configuration property: " + name, e);
             }
         }
     }
@@ -72,8 +72,8 @@
                     map.put(mapName, ctx.getInitParameter(name));
                 }
             } catch (Exception e) {
-                log.error("Error in configuration: {}", e.toString());
-                throw new ServletException("Error in configuration: " + e.toString());
+                throw new ServletExceptionWithCause(
+                        "Invalid servlet configuration option: " + name, e);
             }
         }
     }

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/JcrApiNotFoundException.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/JcrApiNotFoundException.java?rev=691632&r1=691631&r2=691632&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/JcrApiNotFoundException.java (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/JcrApiNotFoundException.java Wed Sep  3 08:19:40 2008
@@ -16,15 +16,23 @@
  */
 package org.apache.jackrabbit.j2ee;
 
-import javax.servlet.ServletException;
-
 /**
  * Exception for signaling that the JCR API is not available.
  */
-public class JcrApiNotFoundException extends ServletException {
+public class JcrApiNotFoundException extends ServletExceptionWithCause {
+
+    /**
+     * Serial version UID
+     */
+    private static final long serialVersionUID = -6439777923943394980L;
 
+    /**
+     * Creates an exception to signal that the JCR API is not available.
+     *
+     * @param e the specific exception that indicates the lack of the JCR API
+     */
     public JcrApiNotFoundException(ClassNotFoundException e) {
-        super(e);
+        super("JCR API (jcr-1.0.jar) not available in the classpath", e);
     }
 
 }

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/LoggingServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/LoggingServlet.java?rev=691632&r1=691631&r2=691632&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/LoggingServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/LoggingServlet.java Wed Sep  3 08:19:40 2008
@@ -102,7 +102,8 @@
             try {
                 in = new FileInputStream(log4jConfig);
             } catch (FileNotFoundException e) {
-                throw new ServletException("Unable to initialize log4j: " + e.toString());
+                throw new ServletExceptionWithCause(
+                        "Log4j configuration not found: " + log4jConfig, e);
             }
         } else {
             // hack for entity resolver
@@ -117,7 +118,8 @@
                 configureProperties(in);
             }
         } catch (IOException e) {
-            throw new ServletException("Unable to initialize log4j: " + e.toString());
+            throw new ServletExceptionWithCause(
+                    "Log4j configuration failure: " + log4jConfig, e);
         } finally {
             try {
                 in.close();
@@ -147,11 +149,11 @@
             Element root =  document.getDocumentElement();
             DOMConfigurator.configure(root);
         } catch (ParserConfigurationException e) {
-            throw new ServletException(
-                    "Unable to create configuration XML parser", e);
+            throw new ServletExceptionWithCause(
+                    "Unable to create XML parser for the configuration", e);
         } catch (SAXException e) {
-            throw new ServletException(
-                    "Configuration file syntax error.", e);
+            throw new ServletExceptionWithCause(
+                    "Configuration file syntax error:" + in.getSystemId(), e);
         }
     }
 

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java?rev=691632&r1=691631&r2=691632&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java Wed Sep  3 08:19:40 2008
@@ -133,8 +133,8 @@
                         try {
                             in = new FileInputStream(file);
                         } catch (FileNotFoundException e) {
-                            log.error("Error while opening bootstrap properties: {}", e.toString());
-                            throw new ServletException("Error while opening bootstrap properties: " + e.toString());
+                            throw new ServletExceptionWithCause(
+                                    "Bootstrap configuration not found: " + bstrp, e);
                         }
                     }
                 }
@@ -142,8 +142,8 @@
                     try {
                         bootstrapProps.load(in);
                     } catch (IOException e) {
-                        log.error("Error while loading bootstrap properties: {}", e.toString());
-                        throw new ServletException("Error while loading bootstrap properties: " + e.toString());
+                        throw new ServletExceptionWithCause(
+                                "Bootstrap configuration failure: " + bstrp, e);
                     } finally {
                         try {
                             in.close();
@@ -160,8 +160,8 @@
             tmpConfig.init(bootstrapProps);
             tmpConfig.validate();
             if (!tmpConfig.isValid()) {
-                log.error("Repository acesss configuration is not valid.");
-                throw new ServletException("Repository access configuration is not valid.");
+                throw new ServletException(
+                        "Repository access configuration is not valid.");
             }
             tmpConfig.logInfos();
             config = tmpConfig;
@@ -207,7 +207,7 @@
             log.info("Acquired repository via JNDI.");
             return r;
         } catch (NamingException e) {
-            log.error("Error while retrieving repository using JNDI (name=" + repositoryName + "): " + e);
+            log.error("Error while retrieving repository using JNDI (name={})", repositoryName, e);
             return null;
         }
     }
@@ -228,16 +228,13 @@
         if (rmiURI == null) {
             return null;
         }
-        log.info("  trying to retrieve repository using rmi. uri=" + rmiURI);
+        log.info("  trying to retrieve repository using rmi. uri={}", rmiURI);
         ClientFactoryDelegater cfd;
         try {
             Class clazz = Class.forName(getServerFactoryDelegaterClass());
             cfd = (ClientFactoryDelegater) clazz.newInstance();
-        } catch (NoClassDefFoundError e) {
-            log.error("Unable to locate RMI ClientRepositoryFactory. jcr-rmi.jar missing? " + e.toString());
-            return null;
-        } catch (Exception e) {
-            log.error("Unable to locate RMI ClientRepositoryFactory. jcr-rmi.jar missing?" + e.toString());
+        } catch (Throwable e) {
+            log.error("Unable to locate RMI ClientRepositoryFactory. Is jcr-rmi.jar missing?", e);
             return null;
         }
 
@@ -246,7 +243,7 @@
             log.info("Acquired repository via RMI.");
             return r;
         } catch (Exception e) {
-            log.error("Error while retrieving repository using RMI: " + e);
+            log.error("Error while retrieving repository using RMI: {}", rmiURI, e);
             return null;
         }
     }
@@ -261,9 +258,9 @@
 
             if(log.isDebugEnabled()) {
                 if(result!=null) {
-                    log.debug("Got Repository from ServletContext attribute '" + repositoryContextAttributeName + "'");
+                    log.debug("Got Repository from ServletContext attribute '{}'", repositoryContextAttributeName);
                 } else {
-                    log.debug("ServletContext attribute '" + repositoryContextAttributeName + "' does not provide a Repository");
+                    log.debug("ServletContext attribute '{}' does not provide a Repository", repositoryContextAttributeName);
                 }
             }
         }

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java?rev=691632&r1=691631&r2=691632&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java Wed Sep  3 08:19:40 2008
@@ -330,8 +330,8 @@
                     try {
                         in = new FileInputStream(bootstrapConfigFile);
                     } catch (FileNotFoundException e) {
-                        log.error("Error while opening bootstrap properties: {}", e.toString());
-                        throw new ServletException("Error while opening bootstrap properties: " + e.toString());
+                        throw new ServletExceptionWithCause(
+                                "Bootstrap configuration not found: " + bstrp, e);
                     }
                 }
             }
@@ -339,8 +339,8 @@
                 try {
                     bootstrapProps.load(in);
                 } catch (IOException e) {
-                    log.error("Error while loading bootstrap properties: {}", e.toString());
-                    throw new ServletException("Error while loading bootstrap properties: " + e.toString());
+                    throw new ServletException(
+                            "Bootstrap configuration failure: " + bstrp, e);
                 } finally {
                     try {
                         in.close();
@@ -384,8 +384,8 @@
         try {
             repHome = new File(config.getRepositoryHome()).getCanonicalFile();
         } catch (IOException e) {
-            log.error("Repository startup configuration invalid: " + e.toString());
-            throw new ServletException("Repository startup configuration invalid: " + e.toString());
+            throw new ServletExceptionWithCause(
+                    "Repository configuration failure: " + config.getRepositoryHome(), e);
         }
         String repConfig = config.getRepositoryConfig();
         InputStream in = getServletContext().getResourceAsStream(repConfig);
@@ -397,8 +397,8 @@
                 try {
                     in = new FileInputStream(new File(repHome, repConfig));
                 } catch (FileNotFoundException e1) {
-                    log.error("Repository startup configuration invalid: " + e1.toString());
-                    throw new ServletException("Repository startup configuration invalid: " + e.toString());
+                    throw new ServletExceptionWithCause(
+                            "Repository configuration not found: " + repConfig, e);
                 }
             }
         }
@@ -406,7 +406,7 @@
         try {
             repository = createRepository(new InputSource(in), repHome);
         } catch (RepositoryException e) {
-            throw new ServletException("Error while creating repository", e);
+            throw new ServletExceptionWithCause("Error while creating repository", e);
         }
     }
 
@@ -451,7 +451,8 @@
                 jndiContext.bind(jc.getJndiName(), repository);
                 log.info("Repository bound to JNDI with name: " + jc.getJndiName());
             } catch (NamingException e) {
-                throw new ServletException("Unable to bind repository using JNDI.", e);
+                throw new ServletExceptionWithCause(
+                        "Unable to bind repository using JNDI: " + jc.getJndiName(), e);
             }
         }
     }
@@ -490,12 +491,11 @@
             remote = rmf.createRemoteRepository(repository);
         } catch (RemoteException e) {
             log.error("Unable to create RMI repository.", e);
-            throw new ServletException("Unable to create remote repository.", e);
-        } catch (NoClassDefFoundError e) {
-            throw new ServletException("Unable to create RMI repository. jcr-rmi.jar might be missing.", e);
-        } catch (Exception e) {
-            log.error("Unable to create RMI repository.", e);
-            throw new ServletException("Unable to create RMI repository. jcr-rmi.jar might be missing.");
+            throw new ServletExceptionWithCause("Unable to create remote repository.", e);
+        } catch (Throwable t) {
+            log.error("Unable to create RMI repository.", t);
+            throw new ServletExceptionWithCause(
+                    "Unable to create RMI repository. jcr-rmi.jar might be missing.", t);
         }
 
         try {
@@ -565,9 +565,11 @@
             }
 
         } catch (RemoteException e) {
-            throw new ServletException("Unable to bind repository via RMI.", e);
+            throw new ServletExceptionWithCause(
+                    "Unable to bind repository via RMI: " + rc.getRmiUri(), e);
         } catch (AlreadyBoundException e) {
-            throw new ServletException("Unable to bind repository via RMI.", e);
+            throw new ServletExceptionWithCause(
+                    "Unable to bind repository via RMI: " + rc.getRmiUri(), e);
         }
     }
 

Added: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java?rev=691632&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java (added)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java Wed Sep  3 08:19:40 2008
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * 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.
+ */
+package org.apache.jackrabbit.j2ee;
+
+import javax.servlet.ServletException;
+
+/**
+ * Utility class that links {@link ServletException} with support for
+ * the exception chaining mechanism in {@link Throwable}.
+ *
+ * @see https://issues.apache.org/jira/browse/JCR-1598
+ */
+public class ServletExceptionWithCause extends ServletException {
+
+    /**
+     * Serial version UID
+     */
+    private static final long serialVersionUID = -7201954529718775444L;
+
+    /**
+     * Creates a servlet exception with the given message and cause.
+     *
+     * @param message exception message
+     * @param cause cause of the exception
+     */
+    public ServletExceptionWithCause(String message, Throwable cause) {
+        super(message, cause);
+        if (getCause() == null) {
+            initCause(cause);
+        }
+    }
+
+}

Propchange: jackrabbit/trunk/jackrabbit-webapp/src/main/java/org/apache/jackrabbit/j2ee/ServletExceptionWithCause.java
------------------------------------------------------------------------------
    svn:eol-style = native