Author: nmalin
Date: Fri Mar 29 08:28:15 2019 New Revision: 1856524 URL: http://svn.apache.org/viewvc?rev=1856524&view=rev Log: Improved: Configure stackTrace displaying on ftl rendering (OFBIZ-10817) When freemarker failed to execute a template, you have on end screen rendered all java stack trace generated. I improve this to display the stack trace only when widget is on verbose, no regression during development and when you switch to production site, in general your widget verbose is off so end user haven't stack trace and replace it by ∎ (that totally unused for them but help to detect a problem). I also introduce two new properties on widget.properties: widget.freemarker.template.verbose : if your widget verbose is off and you want display the freemarker stacktrace when your template generate an exception set it to true widget.freemarker.template.exception.message : when you don't displaying freemarker stacktrace, you can replace it by an other message by default it use ∎ but you can set what you want, like 'ERROR', '##' or ' ' Thanks to Deepak Dixit, Jacques Le Roux, Michael Brohl and Mathieu Lirzin for their suggest Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java ofbiz/ofbiz-framework/trunk/framework/widget/config/widget.properties Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java?rev=1856524&r1=1856523&r2=1856524&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java (original) +++ ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/template/FreeMarkerWorker.java Fri Mar 29 08:28:15 2019 @@ -62,6 +62,7 @@ import freemarker.template.TemplateHashM import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import freemarker.template.Version; +import org.apache.ofbiz.widget.model.ModelWidget; /** * FreeMarkerWorker - Freemarker Template Engine Utilities. @@ -108,7 +109,11 @@ public final class FreeMarkerWorker { newConfig.setAutoImports(freemarkerImports); } newConfig.setLogTemplateExceptions(false); - newConfig.setTemplateExceptionHandler(new FreeMarkerWorker.OFBizTemplateExceptionHandler()); + boolean verboseTemplate = ModelWidget.widgetBoundaryCommentsEnabled(null) + || UtilProperties.getPropertyAsBoolean("widget", "widget.freemarker.template.verbose", false); + newConfig.setTemplateExceptionHandler(verboseTemplate + ? OFBizTemplateExceptionHandler.OFBIZ_DEBUG_HANDLER + : OFBizTemplateExceptionHandler.OFBIZ_DEFAULT_HANDLER); try { newConfig.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss.SSS"); newConfig.setSetting("number_format", "0.##########"); @@ -491,16 +496,33 @@ public final class FreeMarkerWorker { } /** - * OFBiz specific TemplateExceptionHandler. + * OFBiz specific {@link TemplateExceptionHandler} interface. */ - static class OFBizTemplateExceptionHandler implements TemplateExceptionHandler { - public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException { + interface OFBizTemplateExceptionHandler { + + /** + * {@link TemplateExceptionHandler} that suppresses the exception and keep the rendering going on. + * It sanitizes any messages present in the stack trace prior to printing to the output writer. + */ + TemplateExceptionHandler OFBIZ_DEBUG_HANDLER = (te, env, out) -> { try { out.write(te.getMessage()); Debug.logError(te, module); } catch (IOException e) { Debug.logError(e, module); } - } + }; + + /** + * {@link TemplateExceptionHandler} that suppresses the exception and replace by a generic char for quiet alert. + * As mentioned in the doc, the stack trace is still logged {@link TemplateExceptionHandler#IGNORE_HANDLER} + */ + TemplateExceptionHandler OFBIZ_DEFAULT_HANDLER = (te, env, out) -> { + try { + out.write(UtilProperties.getPropertyValue("widget", "widget.freemarker.template.exception.message","â")); + } catch (IOException e) { + Debug.logError(e, module); + } + }; } } Modified: ofbiz/ofbiz-framework/trunk/framework/widget/config/widget.properties URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/widget/config/widget.properties?rev=1856524&r1=1856523&r2=1856524&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/widget/config/widget.properties (original) +++ ofbiz/ofbiz-framework/trunk/framework/widget/config/widget.properties Fri Mar 29 08:28:15 2019 @@ -42,3 +42,10 @@ widget.form.displayhelpText=Y # first appears. widget.defaultNoConditionFind=N +# If your widget.verbose is set to false and you want display the freemarker stacktrace +# when your template generate an exception set it to true +#widget.freemarker.template.verbose=false + +# When you don't displaying freemarker stacktrace, you can replace it by an other message +# by default it use â but you can set what you want, like 'ERROR', '##' or ' ' +#widget.freemarker.template.exception.message= \ No newline at end of file |
Free forum by Nabble | Edit this page |