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);