FREEMARKER-55: code cleanups
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/834abd7d Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/834abd7d Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/834abd7d Branch: refs/heads/3 Commit: 834abd7d6f338ee7fcc5bdaa060ce2d36495fc8b Parents: 075bd88 Author: Woonsan Ko <[email protected]> Authored: Mon Sep 11 16:50:45 2017 -0400 Committer: Woonsan Ko <[email protected]> Committed: Mon Sep 11 16:50:45 2017 -0400 ---------------------------------------------------------------------- .../AbstractSpringTemplateCallableModel.java | 17 +++---- .../freemarker/spring/model/EvalFunction.java | 15 +++++- .../spring/model/NestedPathDirective.java | 21 ++++----- .../model/SpringTemplateCallableHashModel.java | 49 +++++++++++--------- 4 files changed, 55 insertions(+), 47 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/834abd7d/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java index 0d5d6ed..384a47b 100644 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java @@ -27,6 +27,7 @@ import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; import org.apache.freemarker.core.model.TemplateCallableModel; import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; import org.apache.freemarker.core.util.CallableUtils; import org.springframework.web.servlet.support.BindStatus; @@ -95,21 +96,15 @@ public abstract class AbstractSpringTemplateCallableModel implements TemplateCal protected abstract boolean isFunction(); - protected String getCurrentNestedPath(final Environment env) throws TemplateException { - SpringTemplateCallableHashModel springHash = (SpringTemplateCallableHashModel) env - .getVariable(SpringTemplateCallableHashModel.NAME); - return springHash.getNestedPath(); - } - - protected void setCurrentNestedPath(final Environment env, final String nestedPath) throws TemplateException { - SpringTemplateCallableHashModel springHash = (SpringTemplateCallableHashModel) env - .getVariable(SpringTemplateCallableHashModel.NAME); - springHash.setNestedPath(nestedPath); + protected SpringTemplateCallableHashModel getSpringTemplateCallableHashModel(final Environment env) + throws TemplateException { + return (SpringTemplateCallableHashModel) env.getVariable(SpringTemplateCallableHashModel.NAME); } private String resolveNestedPath(final Environment env, ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper, final String path) throws TemplateException { - String curNestedPath = getCurrentNestedPath(env); + final TemplateStringModel curNestedPathModel = getSpringTemplateCallableHashModel(env).getNestedPathModel(); + final String curNestedPath = (curNestedPathModel != null) ? curNestedPathModel.getAsString() : null; if (curNestedPath != null && !path.startsWith(curNestedPath) && !path.equals(curNestedPath.substring(0, curNestedPath.length() - 1))) { http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/834abd7d/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java index 01c3cc5..6ae0bb5 100644 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java @@ -66,6 +66,8 @@ public class EvalFunction extends AbstractSpringTemplateFunctionModel { private static final ArgumentArrayLayout ARGS_LAYOUT = ArgumentArrayLayout.create(1, false, null, false); + private static final String EVALUATION_CONTEXT_VAR_NAME = "org.apache.freemarker.spring.model.EVALUATION_CONTEXT"; + private final ExpressionParser expressionParser = new SpelExpressionParser(); public EvalFunction(HttpServletRequest request, HttpServletResponse response) { @@ -79,8 +81,17 @@ public class EvalFunction extends AbstractSpringTemplateFunctionModel { final String expressionString = CallableUtils.getStringArgument(args, EXPRESSION_PARAM_IDX, this); final Expression expression = expressionParser.parseExpression(expressionString); - // TODO: cache evaluationContext somewhere in request level.... - EvaluationContext evaluationContext = createEvaluationContext(env, objectWrapperAndUnwrapper, requestContext); + EvaluationContext evaluationContext = null; + final SpringTemplateCallableHashModel springTemplateModel = getSpringTemplateCallableHashModel(env); + TemplateModel evaluationContextModel = springTemplateModel.get(EVALUATION_CONTEXT_VAR_NAME); + + if (evaluationContextModel != null) { + evaluationContext = (EvaluationContext) unwrapObject(objectWrapperAndUnwrapper, evaluationContextModel); + } else { + evaluationContext = createEvaluationContext(env, objectWrapperAndUnwrapper, requestContext); + evaluationContextModel = wrapObject(objectWrapperAndUnwrapper, evaluationContext); + springTemplateModel.setEvaluationContextModel(evaluationContextModel); + } final Object result = expression.getValue(evaluationContext); return wrapObject(objectWrapperAndUnwrapper, result); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/834abd7d/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java index 37d4370..9bd51ef 100644 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java @@ -31,6 +31,7 @@ import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.ArgumentArrayLayout; import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateStringModel; import org.apache.freemarker.core.util.CallableUtils; import org.springframework.beans.PropertyAccessor; import org.springframework.web.servlet.support.RequestContext; @@ -59,13 +60,7 @@ public class NestedPathDirective extends AbstractSpringTemplateDirectiveModel { private static final int PATH_PARAM_IDX = 0; - private static final ArgumentArrayLayout ARGS_LAYOUT = - ArgumentArrayLayout.create( - 1, - false, - null, - false - ); + private static final ArgumentArrayLayout ARGS_LAYOUT = ArgumentArrayLayout.create(1, false, null, false); public NestedPathDirective(HttpServletRequest request, HttpServletResponse response) { super(request, response); @@ -85,14 +80,18 @@ public class NestedPathDirective extends AbstractSpringTemplateDirectiveModel { path += PropertyAccessor.NESTED_PROPERTY_SEPARATOR; } - String prevNestedPath = getCurrentNestedPath(env); - String newNestedPath = (prevNestedPath != null) ? prevNestedPath + path : path; + final SpringTemplateCallableHashModel springTemplateModel = getSpringTemplateCallableHashModel(env); + final TemplateStringModel prevNestedPathModel = springTemplateModel.getNestedPathModel(); + final String prevNestedPath = (prevNestedPathModel != null) ? prevNestedPathModel.getAsString() : null; + final String newNestedPath = (prevNestedPath != null) ? prevNestedPath + path : path; + final TemplateStringModel newNestedPathModel = (TemplateStringModel) wrapObject(objectWrapperAndUnwrapper, + newNestedPath); try { - setCurrentNestedPath(env, newNestedPath); + springTemplateModel.setNestedPathModel(newNestedPathModel); callPlace.executeNestedContent(null, out, env); } finally { - setCurrentNestedPath(env, prevNestedPath); + springTemplateModel.setNestedPathModel(prevNestedPathModel); } } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/834abd7d/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java index e090cd9..7315947 100644 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java @@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.freemarker.core.TemplateException; import org.apache.freemarker.core.model.TemplateHashModel; import org.apache.freemarker.core.model.TemplateModel; -import org.apache.freemarker.core.model.impl.SimpleString; +import org.apache.freemarker.core.model.TemplateStringModel; /** * TemplateHashModel wrapper for templates using Spring directives and functions. @@ -40,31 +40,26 @@ public final class SpringTemplateCallableHashModel implements TemplateHashModel, public static final String NAME = "spring"; - public static final String NESTED_PATH = "nestedPath"; + public static final String NESTED_PATH_MODEL = "nestedPathModel"; - private Map<String, AbstractSpringTemplateCallableModel> callablesMap = new HashMap<>(); + public static final String EVALUATION_CONTEXT_MODEL = "evaluationContextModel"; - private String nestedPath; + private Map<String, TemplateModel> modelsMap = new HashMap<>(); public SpringTemplateCallableHashModel(final HttpServletRequest request, final HttpServletResponse response) { - callablesMap.put(MessageFunction.NAME, new MessageFunction(request, response)); - callablesMap.put(ThemeFunction.NAME, new ThemeFunction(request, response)); - callablesMap.put(BindErrorsDirective.NAME, new BindErrorsDirective(request, response)); - callablesMap.put(NestedPathDirective.NAME, new NestedPathDirective(request, response)); - callablesMap.put(BindDirective.NAME, new BindDirective(request, response)); - - callablesMap.put(TransformFunction.NAME, new TransformFunction(request, response)); - callablesMap.put(UrlFunction.NAME, new UrlFunction(request, response)); - callablesMap.put(EvalFunction.NAME, new EvalFunction(request, response)); - callablesMap.put(MvcUrlFunction.NAME, new MvcUrlFunction(request, response)); + modelsMap.put(MessageFunction.NAME, new MessageFunction(request, response)); + modelsMap.put(ThemeFunction.NAME, new ThemeFunction(request, response)); + modelsMap.put(BindErrorsDirective.NAME, new BindErrorsDirective(request, response)); + modelsMap.put(NestedPathDirective.NAME, new NestedPathDirective(request, response)); + modelsMap.put(BindDirective.NAME, new BindDirective(request, response)); + modelsMap.put(TransformFunction.NAME, new TransformFunction(request, response)); + modelsMap.put(UrlFunction.NAME, new UrlFunction(request, response)); + modelsMap.put(EvalFunction.NAME, new EvalFunction(request, response)); + modelsMap.put(MvcUrlFunction.NAME, new MvcUrlFunction(request, response)); } public TemplateModel get(String key) throws TemplateException { - if (NESTED_PATH.equals(key)) { - return (nestedPath != null) ? new SimpleString(nestedPath) : null; - } - - return callablesMap.get(key); + return modelsMap.get(key); } @Override @@ -72,12 +67,20 @@ public final class SpringTemplateCallableHashModel implements TemplateHashModel, return false; } - public String getNestedPath() { - return nestedPath; + public TemplateStringModel getNestedPathModel() throws TemplateException { + return (TemplateStringModel) get(NESTED_PATH_MODEL); + } + + public void setNestedPathModel(TemplateStringModel nestedPathModel) { + modelsMap.put(NESTED_PATH_MODEL, nestedPathModel); + } + + public TemplateModel getEvaluationContextModel() throws TemplateException { + return (TemplateModel) get(EVALUATION_CONTEXT_MODEL); } - public void setNestedPath(String nestedPath) { - this.nestedPath = nestedPath; + public void setEvaluationContextModel(TemplateModel evaluationContextModel) { + modelsMap.put(EVALUATION_CONTEXT_MODEL, evaluationContextModel); } }
