You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2007/12/12 19:51:54 UTC

svn commit: r603703 - in /ofbiz/trunk/framework: common/widget/CommonScreens.xml widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java

Author: adrianc
Date: Wed Dec 12 10:51:53 2007
New Revision: 603703

URL: http://svn.apache.org/viewvc?rev=603703&view=rev
Log:
Improved error handling in ScreenFopViewHandler.java. Original error handling was:

Try to render screen using fop
  If that fails, try to render error message using fop
    If that fails, throw an exception (results in blank screen)

The new error handling is:

Try to render screen using fop
  If that fails, try to render error message using HTML screen widget
    If that fails, log a debug message

Modified:
    ofbiz/trunk/framework/common/widget/CommonScreens.xml
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java

Modified: ofbiz/trunk/framework/common/widget/CommonScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/widget/CommonScreens.xml?rev=603703&r1=603702&r2=603703&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/widget/CommonScreens.xml (original)
+++ ofbiz/trunk/framework/common/widget/CommonScreens.xml Wed Dec 12 10:51:53 2007
@@ -258,10 +258,13 @@
             <actions>
                 <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
                 <set field="logoImageUrl" value="/images/ofbiz_logo.jpg"/>
-                <!--<set field="defaultFontFamily" value="Arial"/>-->
             </actions>
             <widgets>
-                <platform-specific><html><html-template location="component://common/webcommon/error.fo.ftl"/></html></platform-specific>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+<!--                <platform-specific><html><html-template location="component://common/webcommon/error.fo.ftl"/></html></platform-specific> -->
+                    </decorator-section>
+                </decorator-screen>
             </widgets>
         </section>
     </screen>

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java?rev=603703&r1=603702&r2=603703&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenFopViewHandler.java Wed Dec 12 10:51:53 2007
@@ -33,6 +33,7 @@
 import org.ofbiz.webapp.view.ViewHandlerException;
 import org.ofbiz.widget.fo.FoFormRenderer;
 import org.ofbiz.widget.fo.FoScreenRenderer;
+import org.ofbiz.widget.html.HtmlScreenRenderer;;
 
 /**
  * Uses XSL-FO formatted templates to generate PDF, PCL, POSTSCRIPT etc.  views
@@ -40,6 +41,7 @@
  */
 public class ScreenFopViewHandler implements ViewHandler {
     public static final String module = ScreenFopViewHandler.class.getName();
+    protected static final String DEFAULT_ERROR_TEMPLATE = "component://common/widget/CommonScreens.xml#FoError";
 
     protected ServletContext servletContext = null;
     protected FoScreenRenderer foScreenRenderer = new FoScreenRenderer();
@@ -65,8 +67,8 @@
             // this is the object used to render forms from their definitions
             screens.getContext().put("formStringRenderer", new FoFormRenderer(request, response));
             screens.render(page);
-        } catch (Throwable t) {
-            throw new ViewHandlerException("Problems with the response writer/output stream", t);
+        } catch (Exception e) {
+            throw createException("Problems with the response writer/output stream", e, request, response);
         }
 
         // set the input source (XSL-FO) and generate the output stream of contentType
@@ -82,7 +84,7 @@
             Fop fop = ApacheFopWorker.createFopInstance(out, contentType);
             ApacheFopWorker.transform(src, null, fop);
         } catch (Exception e) {
-            throw createException("Unable to transform FO file", e, response);
+            throw createException("Unable to transform FO file", e, request, response);
         }
         // set the content type and length
         response.setContentType(contentType);
@@ -93,18 +95,22 @@
             out.writeTo(response.getOutputStream());
             response.getOutputStream().flush();
         } catch (IOException e) {
-            throw createException("Unable write to browser OutputStream", e, response);
+            throw createException("Unable write to browser OutputStream", e, request, response);
         }
     }
 
-    protected ViewHandlerException createException(String msg, Exception e, HttpServletResponse response) {
+    protected ViewHandlerException createException(String msg, Exception e, HttpServletRequest request, HttpServletResponse response) {
         Debug.logError(msg + ": " + e, module);
-        String htmlString = "<html><head><title>FOP Rendering Error</title></head><body>" + msg + ": " + e.getMessage() + "</body></html>";
-        response.setContentType("text/html");
-        response.setContentLength(htmlString.length());
         try {
-            response.getOutputStream().write(htmlString.getBytes());
-        } catch (IOException i) {
+            Writer writer = new StringWriter();
+            ScreenRenderer screens = new ScreenRenderer(writer, null, new HtmlScreenRenderer());
+            screens.populateContextForRequest(request, response, servletContext);
+            screens.getContext().put("errorMessage", e.toString());
+            screens.render(DEFAULT_ERROR_TEMPLATE);
+            response.setContentType("text/html");
+            response.getOutputStream().write(writer.toString().getBytes());
+            writer.close();
+        } catch (Exception x) {
             Debug.logError("Multiple errors rendering FOP", module);
         }
         return new ViewHandlerException(msg, e);