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/07/04 07:44:14 UTC
[03/16] incubator-freemarker git commit: FREEMARKER-55: adding model
building code.
FREEMARKER-55: adding model building code.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/334d9cde
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/334d9cde
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/334d9cde
Branch: refs/heads/3
Commit: 334d9cde950f06e480027d3064e53b6c1cfa54e2
Parents: ec2d37c
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jun 28 23:36:49 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jun 28 23:36:49 2017 -0400
----------------------------------------------------------------------
freemarker-spring/build.gradle | 2 +
.../spring/web/view/AbstractFreemarkerView.java | 67 ++++++++++++++++++--
.../spring/web/view/FreemarkerView.java | 60 ++++++++++++++++++
.../spring/web/view/FreemarkerViewTest.java | 2 +-
4 files changed, 123 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/334d9cde/freemarker-spring/build.gradle
----------------------------------------------------------------------
diff --git a/freemarker-spring/build.gradle b/freemarker-spring/build.gradle
index 60e03b2..1865cc2 100644
--- a/freemarker-spring/build.gradle
+++ b/freemarker-spring/build.gradle
@@ -25,7 +25,9 @@ published = true
inAggregateJavadoc = true
dependencies {
+
compile project(":freemarker-core")
+ compile project(":freemarker-servlet")
// TODO: what's difference between compileOnly and compile??
compile "org.apache.geronimo.specs:geronimo-servlet_3.0_spec:1.0"
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/334d9cde/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java
index a2a2e8b..595ada2 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java
@@ -19,6 +19,8 @@
package org.apache.freemarker.spring.web.view;
import java.io.IOException;
+import java.io.Serializable;
+import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -28,39 +30,90 @@ import org.apache.freemarker.core.Configuration;
import org.apache.freemarker.core.ParseException;
import org.apache.freemarker.core.Template;
import org.apache.freemarker.core.TemplateNotFoundException;
+import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
+import org.apache.freemarker.core.model.TemplateHashModel;
+import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
import org.apache.freemarker.core.templateresolver.MalformedTemplateNameException;
import org.springframework.web.servlet.view.AbstractView;
public abstract class AbstractFreemarkerView extends AbstractView {
private Configuration configuration;
- private String templateName;
+ private String name;
+ private Locale locale;
+ private Serializable customLookupCondition;
+ private boolean ignoreMissing;
public Configuration getConfiguration() {
return configuration;
}
public void setConfiguration(Configuration configuration) {
+ if (!(configuration.getObjectWrapper() instanceof ObjectWrapperAndUnwrapper)) {
+ throw new RuntimeException(AbstractFreemarkerView.class.getSimpleName() + " requires an ObjectWrapper that "
+ + "implements " + ObjectWrapperAndUnwrapper.class.getName() + ", but this class doesn't do that: "
+ + configuration.getObjectWrapper().getClass().getName());
+ }
+
this.configuration = configuration;
}
- public String getTemplateName() {
- return templateName;
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
+ public Serializable getCustomLookupCondition() {
+ return customLookupCondition;
}
- public void setTemplateName(String templateName) {
- this.templateName = templateName;
+ public void setCustomLookupCondition(Serializable customLookupCondition) {
+ this.customLookupCondition = customLookupCondition;
+ }
+
+ public boolean isIgnoreMissing() {
+ return ignoreMissing;
+ }
+
+ public void setIgnoreMissing(boolean ignoreMissing) {
+ this.ignoreMissing = ignoreMissing;
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
- getTemplate().process(model, response.getWriter());
+ getTemplate().process(createModel(model, getObjectWrapperForModel(), request, response), response.getWriter());
}
protected Template getTemplate()
throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException {
- return getConfiguration().getTemplate(getTemplateName());
+ return getConfiguration().getTemplate(getName(), getLocale(), getCustomLookupCondition(), isIgnoreMissing());
+ }
+
+ protected ObjectWrapperAndUnwrapper getObjectWrapperForModel() {
+ ObjectWrapperAndUnwrapper wrapper;
+
+ if (configuration.isObjectWrapperSet()) {
+ wrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper();
+ } else {
+ // TODO: need to cache this?
+ wrapper = new DefaultObjectWrapper.Builder(configuration.getIncompatibleImprovements()).build();
+ }
+
+ return wrapper;
}
+ protected abstract TemplateHashModel createModel(Map<String, Object> map,
+ ObjectWrapperAndUnwrapper objectWrapperForModel, HttpServletRequest request, HttpServletResponse response);
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/334d9cde/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 da3ad09..c13a49f 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
@@ -18,6 +18,66 @@
*/
package org.apache.freemarker.spring.web.view;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
+import org.apache.freemarker.core.model.TemplateHashModel;
+import org.apache.freemarker.servlet.AllHttpScopesHashModel;
+import org.apache.freemarker.servlet.FreemarkerServlet;
+import org.apache.freemarker.servlet.HttpRequestHashModel;
+import org.apache.freemarker.servlet.HttpRequestParametersHashModel;
+import org.apache.freemarker.servlet.HttpSessionHashModel;
+import org.apache.freemarker.servlet.ServletContextHashModel;
+import org.apache.freemarker.servlet.jsp.TaglibFactory;
+
public class FreemarkerView extends AbstractFreemarkerView {
+ private ServletContextHashModel servletContextModel;
+
+ private TaglibFactory taglibFactory;
+
+ public ServletContextHashModel getServletContextModel() {
+ return servletContextModel;
+ }
+
+ public void setServletContextModel(ServletContextHashModel servletContextModel) {
+ this.servletContextModel = servletContextModel;
+ }
+
+ public TaglibFactory getTaglibFactory() {
+ // TODO
+ return taglibFactory;
+ }
+
+ public void setTaglibFactory(TaglibFactory taglibFactory) {
+ this.taglibFactory = taglibFactory;
+ }
+
+ @Override
+ protected TemplateHashModel createModel(Map<String, Object> map, ObjectWrapperAndUnwrapper objectWrapperForModel,
+ HttpServletRequest request, HttpServletResponse response) {
+ AllHttpScopesHashModel model = new AllHttpScopesHashModel(objectWrapperForModel, getServletContext(), request);
+ model.putUnlistedModel(FreemarkerServlet.KEY_APPLICATION, getServletContextModel());
+ HttpSession session = request.getSession(false);
+ if (session != null) {
+ model.putUnlistedModel(FreemarkerServlet.KEY_SESSION, getHttpSessionModel(objectWrapperForModel, request, response));
+ }
+ model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST, new HttpRequestHashModel(request, response, objectWrapperForModel));
+ model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST_PARAMETERS,
+ new HttpRequestParametersHashModel(request, objectWrapperForModel));
+ model.putUnlistedModel(FreemarkerServlet.KEY_JSP_TAGLIBS, getTaglibFactory());
+ model.putAll(map);
+ return model;
+ }
+
+ protected HttpSessionHashModel getHttpSessionModel(ObjectWrapperAndUnwrapper objectWrapperForModel,
+ HttpServletRequest request, HttpServletResponse response) {
+ // TODO
+ HttpSessionHashModel sessionModel = new HttpSessionHashModel(null, request, response, objectWrapperForModel);
+ return sessionModel;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/334d9cde/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
index 64f50e0..4d24632 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
@@ -60,7 +60,7 @@ public class FreemarkerViewTest {
FreemarkerView view = new FreemarkerView();
view.setServletContext(servletContext);
view.setConfiguration(configuration);
- view.setTemplateName("hello.ftl");
+ view.setName("hello.ftl");
int visitCount = 0;
Map<String, Object> model = new HashMap<String, Object>();