[Yanel-commits] rev 56546 - public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet

michi at wyona.com michi at wyona.com
Sat Feb 5 22:37:21 CET 2011


Author: michi
Date: 2011-02-05 22:37:20 +0100 (Sat, 05 Feb 2011)
New Revision: 56546

Modified:
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
Log:
use generic exception handler resource to process generic exceptions

Modified: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2011-02-05 21:31:00 UTC (rev 56545)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2011-02-05 21:37:20 UTC (rev 56546)
@@ -68,6 +68,8 @@
 import org.wyona.yanel.core.map.Realm;
 import org.wyona.yanel.core.util.ResourceAttributeHelper;
 
+import org.wyona.yanel.impl.resources.BasicGenericExceptionHandlerResource;
+
 import org.wyona.yanel.servlet.IdentityMap;
 import org.wyona.yanel.servlet.communication.HttpRequest;
 import org.wyona.yanel.servlet.communication.HttpResponse;
@@ -634,13 +636,9 @@
             do404(request, response, doc, message);
             return;
         } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            String message = e.toString() + "\n\n" + getStackTrace(e);
-            //String message = e.toString();
-            Element exceptionElement = (Element) rootElement.appendChild(doc.createElementNS(NAMESPACE, "exception"));
-            exceptionElement.appendChild(doc.createTextNode(message));
+            log.error(e, e);
             response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            setYanelOutput(request, response, doc);
+            handleException(request, response, e);
             return;
         }
         // END first try
@@ -1674,7 +1672,7 @@
         if (log.isDebugEnabled()) log.debug("No identity attached to session, hence check request authorization header: " + authorizationHeader);
         if (authorizationHeader != null) {
             if (authorizationHeader.toUpperCase().startsWith("BASIC")) {
-                log.warn("Using BASIC authorization ...");
+                log.warn("Using BASIC authorization ..."); // TODO: Reformulate text ...
                 // Get encoded user and password, comes after "BASIC "
                 String userpassEncoded = authorizationHeader.substring(6);
                 // Decode it, using any base 64 decoder
@@ -1737,23 +1735,32 @@
     /**
      * Generate response using a resource configuration
      * @param rc Resource configuration
+     * @return true if generation of response was successful or return false otherwise
      */
     private boolean generateResponseFromRTview(HttpServletRequest request, HttpServletResponse response, ResourceConfiguration rc, String path) throws ServletException {
+        try {
+            Resource resource = yanelInstance.getResourceManager().getResource(getEnvironment(request, response), getRealm(request), path, rc);
+            return generateResponseFromResourceView(request, response, resource);
+        } catch (Exception e) {
+            throw new ServletException(e);
+        }
+    }
+
+    /**
+     * Generate response using a resource configuration
+     * @param resource Resource
+     * @return true if generation of response was successful or return false otherwise
+     */
+    private boolean generateResponseFromResourceView(HttpServletRequest request, HttpServletResponse response, Resource resource) throws Exception {
         String viewId = request.getParameter(VIEW_ID_PARAM_NAME);
 
         if (request.getParameter("yanel.format") != null) { // backwards compatible
             viewId = request.getParameter("yanel.format");
+            log.warn("For backwards compatibility reasons also consider parameter 'yanel.format', but which is deprecated. Please use '" + VIEW_ID_PARAM_NAME + "' instead.");
         }
-
-        try {
-            Realm realm = getRealm(request);
-            Resource resource = yanelInstance.getResourceManager().getResource(getEnvironment(request, response), realm, path, rc);
-            View view = ((ViewableV2) resource).getView(viewId);
-            if (view != null) {
-                if (generateResponse(view, resource, request, response, getDocument(NAMESPACE, "yanel"), -1, -1) != null) return true;
-            }
-        } catch (Exception e) {
-            throw new ServletException(e);
+        View view = ((ViewableV2) resource).getView(viewId);
+        if (view != null) {
+            if (generateResponse(view, resource, request, response, getDocument(NAMESPACE, "yanel"), -1, -1) != null) return true;
         }
         return false;
     }
@@ -2257,12 +2264,34 @@
     }
 
     /**
-     *
+     * Handle a generic exception.
+     * @param request The request object.
+     * @param response The response object.
+     * @param ex The exception to handle.
      */
-    private String getStackTrace(Exception e) {
-        java.io.StringWriter sw = new java.io.StringWriter();
-        e.printStackTrace(new java.io.PrintWriter(sw));
-        return sw.toString();
+    private void handleException(HttpServletRequest request, HttpServletResponse response, Exception ex) {
+        try {
+            Realm realm = yanelInstance.getMap().getRealm(request.getServletPath());
+            String path = getResource(request, response).getPath();
+            ResourceConfiguration rc = getGlobalResourceConfiguration("generic-exception-handler_yanel-rc.xml", realm);
+
+            BasicGenericExceptionHandlerResource resource = (BasicGenericExceptionHandlerResource) yanelInstance.getResourceManager().getResource(getEnvironment(request, response), getRealm(request), path, rc);
+            resource.setException(ex);
+
+            boolean hasBeenHandled = generateResponseFromResourceView(request, response, resource);
+
+            if(!hasBeenHandled) {
+                log.error("Generic exception handler is broken!");
+                log.error("Unable to output/handle the following exception:");
+                log.error(ex, ex);
+            }
+        } catch (Exception e) {
+            log.error("Generic exception handler is broken!");
+            log.error("Unable to handle the following exception:");
+            log.error(ex, ex);
+            log.error("Caught exception while handling the above exception:");
+            log.error(e, e);
+        }
     }
 
     /**



More information about the Yanel-commits mailing list