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


Reply via email to