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