Repository: freemarker
Updated Branches:
  refs/heads/3 e1feeb22e -> 9b58ed704


FREEMARKER-55: lazy loading on 'spring' and 'form' model. Load only when used 
in templates.


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

Branch: refs/heads/3
Commit: 9b58ed7048b9b48fe803b5c4b18e35f2e9b2f083
Parents: e1feeb2
Author: Woonsan Ko <woon...@apache.org>
Authored: Mon Jul 23 19:18:45 2018 -0400
Committer: Woonsan Ko <woon...@apache.org>
Committed: Mon Jul 23 19:18:45 2018 -0400

----------------------------------------------------------------------
 .../AbstractDelegatingTemplateHashModel.java    | 65 ++++++++++++++++++++
 .../AbstractSpringTemplateCallableModel.java    |  4 +-
 .../spring/web/view/FreeMarkerView.java         | 20 ++++--
 3 files changed, 83 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/freemarker/blob/9b58ed70/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractDelegatingTemplateHashModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractDelegatingTemplateHashModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractDelegatingTemplateHashModel.java
new file mode 100644
index 0000000..44ab88a
--- /dev/null
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractDelegatingTemplateHashModel.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.spring.model;
+
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.TemplateHashModel;
+import org.apache.freemarker.core.model.TemplateModel;
+
+/**
+ * Abstract delegating <code>TemplateHashModel</code>.
+ * <p>
+ * This can be useful when providing "spring" or "form" model on demand 
because this creates the delegated model
+ * in lazy loading by default.
+ */
+abstract public class AbstractDelegatingTemplateHashModel implements 
TemplateHashModel {
+
+    /**
+     * Delegated <code>TemplateHashModel</code> instance.
+     */
+    private TemplateHashModel delegated;
+
+    @Override
+    public TemplateModel get(String key) throws TemplateException {
+        return getDelegatedTemplateHashModel().get(key);
+    }
+
+    /**
+     * If the internal delegated <code>TemplateHashModel</code> instance is 
null, create one by invoking
+     * {@link #createDelegatedTemplateHashModel()} and return it. Once 
created, return the same the internal
+     * delegated <code>TemplateHashModel</code> instance afterward.
+     * @return the internal delegated <code>TemplateHashModel</code> instance
+     * @throws TemplateException if TemplateException occurs
+     */
+    protected TemplateHashModel getDelegatedTemplateHashModel() throws 
TemplateException {
+        if (delegated == null) {
+            delegated = createDelegatedTemplateHashModel();
+        }
+
+        return delegated;
+    }
+
+    /**
+     * Create an internal delegated <code>TemplateHashModel</code> instance.
+     * @return internal delegated <code>TemplateHashModel</code> instance
+     * @throws TemplateException if TemplateException occurs
+     */
+    abstract protected TemplateHashModel createDelegatedTemplateHashModel() 
throws TemplateException;
+}

http://git-wip-us.apache.org/repos/asf/freemarker/blob/9b58ed70/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 4866557..d7a8381 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
@@ -164,7 +164,9 @@ public abstract class AbstractSpringTemplateCallableModel 
implements TemplateCal
      */
     protected SpringTemplateCallableHashModel 
getSpringTemplateCallableHashModel(final Environment env)
             throws TemplateException {
-        return (SpringTemplateCallableHashModel) 
env.getVariable(SpringTemplateCallableHashModel.NAME);
+        final AbstractDelegatingTemplateHashModel delegate = 
(AbstractDelegatingTemplateHashModel) env
+                .getVariable(SpringTemplateCallableHashModel.NAME);
+        return (SpringTemplateCallableHashModel) 
delegate.getDelegatedTemplateHashModel();
     }
 
     private String resolveNestedPath(final Environment env, 
ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper,

http://git-wip-us.apache.org/repos/asf/freemarker/blob/9b58ed70/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
----------------------------------------------------------------------
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
index 8689522..ddb63fe 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.servlet.AllHttpScopesHashModel;
@@ -35,6 +36,7 @@ import org.apache.freemarker.servlet.HttpSessionHashModel;
 import org.apache.freemarker.servlet.IncludePage;
 import org.apache.freemarker.servlet.ServletContextHashModel;
 import org.apache.freemarker.servlet.jsp.TaglibFactory;
+import org.apache.freemarker.spring.model.AbstractDelegatingTemplateHashModel;
 import org.apache.freemarker.spring.model.SpringTemplateCallableHashModel;
 import 
org.apache.freemarker.spring.model.form.SpringFormTemplateCallableHashModel;
 
@@ -112,7 +114,7 @@ public class FreeMarkerView extends AbstractFreeMarkerView {
 
     @Override
     protected TemplateHashModel createModel(Map<String, Object> map, 
ObjectWrapperAndUnwrapper objectWrapper,
-            HttpServletRequest request, HttpServletResponse response) {
+            final HttpServletRequest request, final HttpServletResponse 
response) {
 
         AllHttpScopesHashModel model = new 
AllHttpScopesHashModel(objectWrapper, getServletContext(), request);
 
@@ -139,11 +141,19 @@ public class FreeMarkerView extends 
AbstractFreeMarkerView {
 
         model.putUnlistedModel(FreemarkerServlet.KEY_INCLUDE, new 
IncludePage(request, response));
 
-        model.putUnlistedModel(SpringTemplateCallableHashModel.NAME,
-                new SpringTemplateCallableHashModel(request, response));
+        model.putUnlistedModel(SpringTemplateCallableHashModel.NAME, new 
AbstractDelegatingTemplateHashModel() {
+            @Override
+            public TemplateHashModel createDelegatedTemplateHashModel() throws 
TemplateException {
+                return new SpringTemplateCallableHashModel(request, response);
+            }
+        });
 
-        model.putUnlistedModel(SpringFormTemplateCallableHashModel.NAME,
-                new SpringFormTemplateCallableHashModel(request, response));
+        model.putUnlistedModel(SpringFormTemplateCallableHashModel.NAME, new 
AbstractDelegatingTemplateHashModel() {
+            @Override
+            public TemplateHashModel createDelegatedTemplateHashModel() throws 
TemplateException {
+                return new SpringFormTemplateCallableHashModel(request, 
response);
+            }
+        });
 
         model.putAll(map);
 

Reply via email to