Index: magnolia-core/src/main/java/info/magnolia/freemarker/ModeDependentTemplateExceptionHandler.java =================================================================== --- magnolia-core/src/main/java/info/magnolia/freemarker/ModeDependentTemplateExceptionHandler.java (revision ) +++ magnolia-core/src/main/java/info/magnolia/freemarker/ModeDependentTemplateExceptionHandler.java (revision ) @@ -0,0 +1,35 @@ +package info.magnolia.freemarker; + +import freemarker.core.Environment; +import freemarker.template.TemplateException; +import freemarker.template.TemplateExceptionHandler; +import info.magnolia.cms.beans.config.ServerConfiguration; +import info.magnolia.context.MgnlContext; + +import java.io.Writer; + +/** + * + * @author gjoseph + * @version $Revision: $ ($Author: $) + */ +public class ModeDependentTemplateExceptionHandler implements TemplateExceptionHandler { + public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException { + final boolean isAuthorInstance = ServerConfiguration.getInstance().isAdmin(); + final boolean isPreviewMode = MgnlContext.getAggregationState().isPreviewMode(); + if (isAuthorInstance && !isPreviewMode) { + inEditMode(te, env, out); + } else { + inPublicMode(te, env, out); + } + + } + + protected void inPublicMode(TemplateException te, Environment env, Writer out) throws TemplateException { + TemplateExceptionHandler.IGNORE_HANDLER.handleTemplateException(te, env, out); + } + + protected void inEditMode(TemplateException te, Environment env, Writer out) throws TemplateException { + TemplateExceptionHandler.HTML_DEBUG_HANDLER.handleTemplateException(te, env, out); + } +} Index: magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerHelper.java =================================================================== --- magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerHelper.java (revision 32667) +++ magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerHelper.java (revision ) @@ -105,6 +105,7 @@ return value; } }; + cfg.setTemplateExceptionHandler(freemarkerConfig.getTemplateExceptionHandler()); // ... and here we essentially do the same by instantiate delegator implementations of FreeMarker components, which delegate to our observed FreemarkerConfig // these setters do more than their equivalent getters, so we can't just override the getter instead. @@ -112,11 +113,8 @@ cfg.setTemplateLoader(new ConfigDelegatingTemplateLoader(freemarkerConfig)); cfg.setObjectWrapper(new ConfigDelegatingObjectWrapper(freemarkerConfig)); - cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); cfg.setDefaultEncoding("UTF8"); - // TODO : configure this (maybe based on the dev-mode system property) - cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER); //cfg.setTemplateUpdateDelay(10); } Index: magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerConfig.java =================================================================== --- magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerConfig.java (revision 34144) +++ magnolia-core/src/main/java/info/magnolia/freemarker/FreemarkerConfig.java (revision ) @@ -37,6 +37,7 @@ import freemarker.cache.MultiTemplateLoader; import freemarker.cache.TemplateLoader; import freemarker.template.ObjectWrapper; +import freemarker.template.TemplateExceptionHandler; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import info.magnolia.freemarker.models.MagnoliaModelFactory; @@ -73,6 +74,7 @@ private final List registeredModelFactories; private final List templateLoaders; private final Map sharedVariables; + private TemplateExceptionHandler templateExceptionHandler = new ModeDependentTemplateExceptionHandler(); private ObjectWrapper objectWrapper; private TemplateLoader multiTL; @@ -134,4 +136,12 @@ public void addSharedVariable(String name, TemplateModel value) { sharedVariables.put(name, value); } + + public TemplateExceptionHandler getTemplateExceptionHandler() { + return templateExceptionHandler; -} + } + + public void setTemplateExceptionHandler(TemplateExceptionHandler templateExceptionHandler) { + this.templateExceptionHandler = templateExceptionHandler; + } +}