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:18 UTC

[17/36] incubator-freemarker git commit: FREEMARKER-55: use Environment variables instead of pageContext in eval function.

FREEMARKER-55: use Environment variables instead of pageContext in eval function.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/6f025c79
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/6f025c79
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/6f025c79

Branch: refs/heads/3
Commit: 6f025c79534117a0f87eb17445e1a76cf06be418
Parents: 9eedd86
Author: Woonsan Ko <wo...@apache.org>
Authored: Mon Sep 11 14:13:56 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Mon Sep 11 14:13:56 2017 -0400

----------------------------------------------------------------------
 .../freemarker/spring/model/EvalFunction.java   | 34 +++++++++++++-------
 1 file changed, 22 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6f025c79/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 a380f19..01c3cc5 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
@@ -80,7 +80,7 @@ public class EvalFunction extends AbstractSpringTemplateFunctionModel {
         final Expression expression = expressionParser.parseExpression(expressionString);
 
         // TODO: cache evaluationContext somewhere in request level....
-        EvaluationContext evaluationContext = createEvaluationContext(env, requestContext);
+        EvaluationContext evaluationContext = createEvaluationContext(env, objectWrapperAndUnwrapper, requestContext);
 
         final Object result = expression.getValue(evaluationContext);
         return wrapObject(objectWrapperAndUnwrapper, result);
@@ -91,10 +91,11 @@ public class EvalFunction extends AbstractSpringTemplateFunctionModel {
         return ARGS_LAYOUT;
     }
 
-    private EvaluationContext createEvaluationContext(final Environment env, final RequestContext requestContext) {
+    private EvaluationContext createEvaluationContext(final Environment env,
+            final ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper, final RequestContext requestContext) {
         StandardEvaluationContext context = new StandardEvaluationContext();
 
-        context.addPropertyAccessor(new EnvironmentVariablesPropertyAccessor(env));
+        context.addPropertyAccessor(new EnvironmentVariablesPropertyAccessor(env, objectWrapperAndUnwrapper));
         context.addPropertyAccessor(new MapAccessor());
         context.addPropertyAccessor(new EnvironmentAccessor());
         context.setBeanResolver(new BeanFactoryResolver(requestContext.getWebApplicationContext()));
@@ -112,42 +113,51 @@ public class EvalFunction extends AbstractSpringTemplateFunctionModel {
         return (ConversionService) getRequest().getAttribute(ConversionService.class.getName());
     }
 
-    private static class EnvironmentVariablesPropertyAccessor implements PropertyAccessor {
+    private class EnvironmentVariablesPropertyAccessor implements PropertyAccessor {
 
         private final Environment env;
+        private final ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper;
 
-        public EnvironmentVariablesPropertyAccessor(final Environment env) {
+        public EnvironmentVariablesPropertyAccessor(final Environment env,
+                final ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper) {
             this.env = env;
+            this.objectWrapperAndUnwrapper = objectWrapperAndUnwrapper;
         }
 
         @Override
         public Class<?>[] getSpecificTargetClasses() {
-            // TODO Auto-generated method stub
             return null;
         }
 
         @Override
         public boolean canRead(EvaluationContext context, Object target, String name) throws AccessException {
-            // TODO Auto-generated method stub
-            return false;
+            try {
+                return (target == null && env.getVariable(name) != null);
+            } catch (TemplateException e) {
+                throw new AccessException("Can't get environment variable by name, '" + name + "'.", e);
+            }
         }
 
         @Override
         public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException {
-            // TODO Auto-generated method stub
-            return null;
+            try {
+                TemplateModel model = env.getVariable(name);
+                Object value = unwrapObject(objectWrapperAndUnwrapper, model);
+                return new TypedValue(value);
+            } catch (TemplateException e) {
+                throw new AccessException("Can't get environment variable by name, '" + name + "'.", e);
+            }
         }
 
         @Override
         public boolean canWrite(EvaluationContext context, Object target, String name) throws AccessException {
-            // TODO Auto-generated method stub
             return false;
         }
 
         @Override
         public void write(EvaluationContext context, Object target, String name, Object newValue)
                 throws AccessException {
-            // TODO Auto-generated method stub
+            throw new UnsupportedOperationException();
         }
     }
 }