You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/09/13 09:49:21 UTC

[20/36] incubator-freemarker git commit: FREEMARKER-55: code cleanups

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 <wo...@apache.org>
Authored: Mon Sep 11 16:50:45 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
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);
     }
 
 }