Repository: incubator-freemarker Updated Branches: refs/heads/3 aaa100c0c -> 5b856d3a5
FREEMARKER-55: Renaming Freemarker to FreeMarker This closes #28 Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/5b856d3a Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/5b856d3a Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/5b856d3a Branch: refs/heads/3 Commit: 5b856d3a5f4e437e2f83055ea1c06c8fb49f4a00 Parents: aaa100c Author: Woonsan Ko <[email protected]> Authored: Fri Jul 14 11:27:17 2017 -0400 Committer: Woonsan Ko <[email protected]> Committed: Fri Jul 14 11:49:22 2017 -0400 ---------------------------------------------------------------------- .../spring/web/view/AbstractFreeMarkerView.java | 170 ++++++++++++++++++ .../spring/web/view/AbstractFreemarkerView.java | 170 ------------------ .../spring/web/view/FreeMarkerView.java | 168 ++++++++++++++++++ .../spring/web/view/FreeMarkerViewResolver.java | 149 ++++++++++++++++ .../spring/web/view/FreemarkerView.java | 168 ------------------ .../spring/web/view/FreemarkerViewResolver.java | 149 ---------------- .../SpringResourceTemplateLoaderTest.java | 84 +++++++++ .../SpringResourceTemplateLoaderTest.java | 84 --------- .../web/view/FreeMarkerViewResolverTest.java | 98 +++++++++++ .../spring/web/view/FreeMarkerViewTest.java | 176 +++++++++++++++++++ .../web/view/FreemarkerViewResolverTest.java | 98 ----------- .../spring/web/view/FreemarkerViewTest.java | 176 ------------------- 12 files changed, 845 insertions(+), 845 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 new file mode 100644 index 0000000..6d3c2ae --- /dev/null +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreeMarkerView.java @@ -0,0 +1,170 @@ +/* + * 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.web.view; + +import java.io.IOException; +import java.util.Locale; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +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.templateresolver.MalformedTemplateNameException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContextException; +import org.springframework.web.servlet.view.AbstractTemplateView; + +/** + * Adapter base class for FreeMarker template-based views, with the ability to access {@link Configuration} + * and {@link ObjectWrapperAndUnwrapper}. + */ +public abstract class AbstractFreeMarkerView extends AbstractTemplateView { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractFreeMarkerView.class); + + /** + * FreeMarker {@link Configuration} instance. + */ + private Configuration configuration; + + /** + * {@link ObjectWrapperAndUnwrapper} instance to use in model building. + */ + private ObjectWrapperAndUnwrapper objectWrapper; + + /** + * Template {@link Locale}. + */ + private Locale locale; + + /** + * Get FreeMarker {@link Configuration} instance. + * @return {@link Configuration} instance + */ + public Configuration getConfiguration() { + return configuration; + } + + /** + * Set FreeMarker {@link Configuration} instance. + * @param configuration {@link Configuration} instance + */ + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + } + + /** + * Get {@link ObjectWrapperAndUnwrapper} that is used in model building. + * @return {@link ObjectWrapperAndUnwrapper} that is used in model building + */ + public ObjectWrapperAndUnwrapper getObjectWrapper() { + return objectWrapper; + } + + /** + * Set {@link ObjectWrapperAndUnwrapper} that is used in model building. + * @param objectWrapper {@link ObjectWrapperAndUnwrapper} that is used in model building + */ + public void setObjectWrapper(ObjectWrapperAndUnwrapper objectWrapper) { + this.objectWrapper = objectWrapper; + } + + /** + * Get template locale. + * @return template locale + */ + public Locale getLocale() { + return locale; + } + + /** + * Set template locale. + * @param locale template locale + */ + public void setLocale(Locale locale) { + this.locale = locale; + } + + @Override + public boolean checkResource(Locale locale) throws Exception { + if (this.locale == null) { + this.locale = locale; + } + + try { + // Check whether the underlying resource exists by trying to get the template. + getTemplate(); + return true; + } catch (TemplateNotFoundException e) { + LOG.debug("No view found for URL: {}", getUrl()); + } catch (MalformedTemplateNameException e) { + throw new ApplicationContextException("Malformed template name: " + getUrl(), e); + } catch (ParseException e) { + throw new ApplicationContextException("Template parsing exception: " + getUrl(), e); + } catch (IOException e) { + throw new ApplicationContextException("Template IO exception: " + getUrl(), e); + } + + return false; + } + + @Override + protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, + HttpServletResponse response) throws Exception { + getTemplate().process(createModel(model, getObjectWrapper(), request, response), response.getWriter()); + } + + /** + * Get template from the FreeMarker {@link Configuration} instance. + * @return template from the FreeMarker {@link Configuration} instance + * @throws TemplateNotFoundException if template is not found + * @throws MalformedTemplateNameException if template name is malformed + * @throws ParseException if the template is syntactically bad + * @throws IOException if template cannot be read due to IO error + */ + protected Template getTemplate() + throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException { + return getConfiguration().getTemplate(normalizeTemplateName(getUrl()), getLocale()); + } + + /** + * Create model for the template. + * @param map map as initial source for the template model + * @param objectWrapperForModel ObjectWrapper to be used in model building + * @param request request + * @param response response + * @return model for the template + */ + protected abstract TemplateHashModel createModel(Map<String, Object> map, + ObjectWrapperAndUnwrapper objectWrapperForModel, HttpServletRequest request, HttpServletResponse response); + + private String normalizeTemplateName(String name) { + if (name != null) { + return (name.startsWith("/")) ? name.substring(1) : name; + } + return null; + } +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 deleted file mode 100644 index abd5e32..0000000 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreemarkerView.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * 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.web.view; - -import java.io.IOException; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -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.templateresolver.MalformedTemplateNameException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContextException; -import org.springframework.web.servlet.view.AbstractTemplateView; - -/** - * Adapter base class for FreeMarker template-based views, with the ability to access {@link Configuration} - * and {@link ObjectWrapperAndUnwrapper}. - */ -public abstract class AbstractFreemarkerView extends AbstractTemplateView { - - private static final Logger LOG = LoggerFactory.getLogger(AbstractFreemarkerView.class); - - /** - * FreeMarker {@link Configuration} instance. - */ - private Configuration configuration; - - /** - * {@link ObjectWrapperAndUnwrapper} instance to use in model building. - */ - private ObjectWrapperAndUnwrapper objectWrapper; - - /** - * Template {@link Locale}. - */ - private Locale locale; - - /** - * Get FreeMarker {@link Configuration} instance. - * @return {@link Configuration} instance - */ - public Configuration getConfiguration() { - return configuration; - } - - /** - * Set FreeMarker {@link Configuration} instance. - * @param configuration {@link Configuration} instance - */ - public void setConfiguration(Configuration configuration) { - this.configuration = configuration; - } - - /** - * Get {@link ObjectWrapperAndUnwrapper} that is used in model building. - * @return {@link ObjectWrapperAndUnwrapper} that is used in model building - */ - public ObjectWrapperAndUnwrapper getObjectWrapper() { - return objectWrapper; - } - - /** - * Set {@link ObjectWrapperAndUnwrapper} that is used in model building. - * @param objectWrapper {@link ObjectWrapperAndUnwrapper} that is used in model building - */ - public void setObjectWrapper(ObjectWrapperAndUnwrapper objectWrapper) { - this.objectWrapper = objectWrapper; - } - - /** - * Get template locale. - * @return template locale - */ - public Locale getLocale() { - return locale; - } - - /** - * Set template locale. - * @param locale template locale - */ - public void setLocale(Locale locale) { - this.locale = locale; - } - - @Override - public boolean checkResource(Locale locale) throws Exception { - if (this.locale == null) { - this.locale = locale; - } - - try { - // Check whether the underlying resource exists by trying to get the template. - getTemplate(); - return true; - } catch (TemplateNotFoundException e) { - LOG.debug("No view found for URL: {}", getUrl()); - } catch (MalformedTemplateNameException e) { - throw new ApplicationContextException("Malformed template name: " + getUrl(), e); - } catch (ParseException e) { - throw new ApplicationContextException("Template parsing exception: " + getUrl(), e); - } catch (IOException e) { - throw new ApplicationContextException("Template IO exception: " + getUrl(), e); - } - - return false; - } - - @Override - protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, - HttpServletResponse response) throws Exception { - getTemplate().process(createModel(model, getObjectWrapper(), request, response), response.getWriter()); - } - - /** - * Get template from the FreeMarker {@link Configuration} instance. - * @return template from the FreeMarker {@link Configuration} instance - * @throws TemplateNotFoundException if template is not found - * @throws MalformedTemplateNameException if template name is malformed - * @throws ParseException if the template is syntactically bad - * @throws IOException if template cannot be read due to IO error - */ - protected Template getTemplate() - throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException { - return getConfiguration().getTemplate(normalizeTemplateName(getUrl()), getLocale()); - } - - /** - * Create model for the template. - * @param map map as initial source for the template model - * @param objectWrapperForModel ObjectWrapper to be used in model building - * @param request request - * @param response response - * @return model for the template - */ - protected abstract TemplateHashModel createModel(Map<String, Object> map, - ObjectWrapperAndUnwrapper objectWrapperForModel, HttpServletRequest request, HttpServletResponse response); - - private String normalizeTemplateName(String name) { - if (name != null) { - return (name.startsWith("/")) ? name.substring(1) : name; - } - return null; - } -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 new file mode 100644 index 0000000..e827db5 --- /dev/null +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java @@ -0,0 +1,168 @@ +/* + * 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.web.view; + +import java.util.Map; + +import javax.servlet.GenericServlet; +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; + +/** + * FreeMarker template based view implementation, with being able to provide a {@link ServletContextHashModel} + * and {@link TaglibFactory} models to the templates. + */ +public class FreeMarkerView extends AbstractFreeMarkerView { + + /** + * Internal servlet instance to provide a page object in JSP tag library usages. + * @see {@link javax.servlet.jsp.PageContext#getPage()} + */ + private GenericServlet pageContextServlet; + + /** + * {@link ServletContextHashModel} instance for templates to access servlet context attributes. + */ + private ServletContextHashModel servletContextModel; + + /** + * {@link TaglibFactory} instance for templates to be able to use JSP tag libraries. + */ + private TaglibFactory taglibFactory; + + /** + * Get {@link GenericServlet} instance which is a page object in JSP tag library usages. + * @return {@link GenericServlet} instance which is a page object in JSP tag library usages + */ + public GenericServlet getPageContextServlet() { + return pageContextServlet; + } + + /** + * Set {@link GenericServlet} instance which is a page object in JSP tag library usages. + * @param pageContextServlet {@link GenericServlet} instance which is a page object in JSP tag library + * usages + */ + public void setPageContextServlet(GenericServlet pageContextServlet) { + this.pageContextServlet = pageContextServlet; + } + + /** + * Get {@link ServletContextHashModel} instance by which templates can access servlet context attributes. + * @return {@link ServletContextHashModel} instance by which templates can access servlet context attributes + */ + public ServletContextHashModel getServletContextModel() { + return servletContextModel; + } + + /** + * Set {@link ServletContextHashModel} instance by which templates can access servlet context attributes. + * @param servletContextModel {@link ServletContextHashModel} instance by which templates can access servlet + * context attributes + */ + public void setServletContextModel(ServletContextHashModel servletContextModel) { + this.servletContextModel = servletContextModel; + } + + /** + * Get {@link TaglibFactory} instance by which templates can use JSP tag libraries. + * @return {@link TaglibFactory} instance by which templates can use JSP tag libraries. + */ + public TaglibFactory getTaglibFactory() { + return taglibFactory; + } + + /** + * Set {@link TaglibFactory} instance by which templates can use JSP tag libraries. + * @param taglibFactory {@link TaglibFactory} instance by which templates can use JSP tag libraries. + */ + public void setTaglibFactory(TaglibFactory taglibFactory) { + this.taglibFactory = taglibFactory; + } + + @Override + protected TemplateHashModel createModel(Map<String, Object> map, ObjectWrapperAndUnwrapper objectWrapper, + HttpServletRequest request, HttpServletResponse response) { + + AllHttpScopesHashModel model = new AllHttpScopesHashModel(objectWrapper, getServletContext(), request); + + model.putUnlistedModel(FreemarkerServlet.KEY_APPLICATION, getServletContextModel()); + + model.putUnlistedModel(FreemarkerServlet.KEY_SESSION, + getHttpSessionModel(objectWrapper, request, response)); + + HttpRequestHashModel requestModel = (HttpRequestHashModel) request + .getAttribute(FreemarkerServlet.ATTR_REQUEST_MODEL); + HttpRequestParametersHashModel requestParametersModel = (HttpRequestParametersHashModel) request + .getAttribute(FreemarkerServlet.ATTR_REQUEST_PARAMETERS_MODEL); + + if (requestModel == null || requestModel.getRequest() != request) { + requestModel = new HttpRequestHashModel(request, response, objectWrapper); + request.setAttribute(FreemarkerServlet.ATTR_REQUEST_MODEL, requestModel); + requestParametersModel = new HttpRequestParametersHashModel(request, objectWrapper); + } + + model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST, requestModel); + model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST_PARAMETERS, requestParametersModel); + + model.putUnlistedModel(FreemarkerServlet.KEY_JSP_TAGLIBS, getTaglibFactory()); + + model.putAll(map); + + return model; + } + + /** + * Get {@link HttpSessionHashModel} instance by which templates can access session attributes. + * @param objectWrapperForModel ObjectWrapper to be used in model building + * @param request request + * @param response response + * @return {@link HttpSessionHashModel} instance by which templates can access session attributes + */ + protected HttpSessionHashModel getHttpSessionModel(ObjectWrapperAndUnwrapper objectWrapperForModel, + HttpServletRequest request, HttpServletResponse response) { + HttpSessionHashModel sessionModel; + HttpSession session = request.getSession(false); + + if (session != null) { + sessionModel = (HttpSessionHashModel) session.getAttribute(FreemarkerServlet.ATTR_SESSION_MODEL); + + if (sessionModel == null || sessionModel.isOrphaned(session)) { + sessionModel = new HttpSessionHashModel(session, objectWrapperForModel); + session.setAttribute(FreemarkerServlet.ATTR_SESSION_MODEL, sessionModel); + } + } else { + sessionModel = new HttpSessionHashModel(getPageContextServlet(), request, response, objectWrapperForModel); + } + + return sessionModel; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java new file mode 100644 index 0000000..101f5be --- /dev/null +++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java @@ -0,0 +1,149 @@ +/* + * 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.web.view; + +import javax.servlet.GenericServlet; +import javax.servlet.ServletException; + +import org.apache.freemarker.core.Configuration; +import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; +import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; +import org.apache.freemarker.servlet.ServletContextHashModel; +import org.apache.freemarker.servlet.jsp.TaglibFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.servlet.view.AbstractTemplateViewResolver; +import org.springframework.web.servlet.view.AbstractUrlBasedView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; + +/** + * FreeMarker template view resolver implementation, extending {@link AbstractTemplateViewResolver} that extends + * {@link UrlBasedViewResolver}. + * <p> + * The FreeMarker {@link Configuration} property must be set at least. Otherwise this throws {@link IllegalStateException} + * during initialization. In the bean initialization phase, this retrieves {@link ObjectWrapperAndUnwrapper} from + * the {@link Configuration} and instantiate the internal page object ({@link PageContextServlet}) for JSP tag + * library usages, {@link ServletContextHashModel} property for servlet context attribute accesses and {@link TaglibFactory} + * property for JSP tag library usages. + * </p> + */ +public class FreeMarkerViewResolver extends AbstractTemplateViewResolver implements InitializingBean { + + /** + * FreeMarker {@link Configuration} instance. + */ + private Configuration configuration; + + /** + * {@link ObjectWrapperAndUnwrapper} instance to be used in model building. + */ + private ObjectWrapperAndUnwrapper objectWrapper; + + /** + * Internal servlet instance to provide a page object in JSP tag library usages. + * @see {@link javax.servlet.jsp.PageContext#getPage()} + */ + private GenericServlet pageContextServlet; + + /** + * {@link ServletContextHashModel} instance for templates to access servlet context attributes. + */ + private ServletContextHashModel servletContextModel; + + /** + * {@link TaglibFactory} instance for templates to be able to use JSP tag libraries. + */ + private TaglibFactory taglibFactory; + + /** + * Constructs view resolver. + */ + public FreeMarkerViewResolver() { + super(); + setViewClass(FreeMarkerView.class); + } + + /** + * Get FreeMarker {@link Configuration} instance. + * @return FreeMarker {@link Configuration} instance + */ + public Configuration getConfiguration() { + return configuration; + } + + /** + * Set FreeMarker {@link Configuration} instance. + * @param configuration FreeMarker {@link Configuration} instance + */ + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + } + + @Override + public void afterPropertiesSet() throws Exception { + if (configuration == null) { + throw new IllegalStateException("Configuration is not set."); + } + + if (objectWrapper == null) { + if (configuration.isObjectWrapperSet()) { + if (!(configuration.getObjectWrapper() instanceof ObjectWrapperAndUnwrapper)) { + throw new RuntimeException( + FreeMarkerViewResolver.class.getSimpleName() + " requires an ObjectWrapper that " + + "implements " + ObjectWrapperAndUnwrapper.class.getName() + + ", but the Configuration's ObjectWrapper doesn't do that: " + + configuration.getObjectWrapper().getClass().getName()); + } + + objectWrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper(); + } else { + objectWrapper = new DefaultObjectWrapper.Builder(configuration.getIncompatibleImprovements()).build(); + } + } + + pageContextServlet = new PageContextServlet(); + + try { + pageContextServlet + .init(new PageContextServletConfig(getServletContext(), PageContextServlet.class.getSimpleName())); + } catch (ServletException e) { + // never happens... + } + + servletContextModel = new ServletContextHashModel(pageContextServlet, objectWrapper); + + taglibFactory = new TaglibFactory.Builder(getServletContext(), objectWrapper).build(); + } + + @Override + protected Class<?> requiredViewClass() { + return FreeMarkerView.class; + } + + @Override + protected AbstractUrlBasedView buildView(String viewName) throws Exception { + FreeMarkerView view = (FreeMarkerView) super.buildView(viewName); + view.setConfiguration(configuration); + view.setObjectWrapper(objectWrapper); + view.setPageContextServlet(pageContextServlet); + view.setServletContextModel(servletContextModel); + view.setTaglibFactory(taglibFactory); + return view; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 deleted file mode 100644 index f3ac63b..0000000 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerView.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * 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.web.view; - -import java.util.Map; - -import javax.servlet.GenericServlet; -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; - -/** - * FreeMarker template based view implementation, with being able to provide a {@link ServletContextHashModel} - * and {@link TaglibFactory} models to the templates. - */ -public class FreemarkerView extends AbstractFreemarkerView { - - /** - * Internal servlet instance to provide a page object in JSP tag library usages. - * @see {@link javax.servlet.jsp.PageContext#getPage()} - */ - private GenericServlet pageContextServlet; - - /** - * {@link ServletContextHashModel} instance for templates to access servlet context attributes. - */ - private ServletContextHashModel servletContextModel; - - /** - * {@link TaglibFactory} instance for templates to be able to use JSP tag libraries. - */ - private TaglibFactory taglibFactory; - - /** - * Get {@link GenericServlet} instance which is a page object in JSP tag library usages. - * @return {@link GenericServlet} instance which is a page object in JSP tag library usages - */ - public GenericServlet getPageContextServlet() { - return pageContextServlet; - } - - /** - * Set {@link GenericServlet} instance which is a page object in JSP tag library usages. - * @param pageContextServlet {@link GenericServlet} instance which is a page object in JSP tag library - * usages - */ - public void setPageContextServlet(GenericServlet pageContextServlet) { - this.pageContextServlet = pageContextServlet; - } - - /** - * Get {@link ServletContextHashModel} instance by which templates can access servlet context attributes. - * @return {@link ServletContextHashModel} instance by which templates can access servlet context attributes - */ - public ServletContextHashModel getServletContextModel() { - return servletContextModel; - } - - /** - * Set {@link ServletContextHashModel} instance by which templates can access servlet context attributes. - * @param servletContextModel {@link ServletContextHashModel} instance by which templates can access servlet - * context attributes - */ - public void setServletContextModel(ServletContextHashModel servletContextModel) { - this.servletContextModel = servletContextModel; - } - - /** - * Get {@link TaglibFactory} instance by which templates can use JSP tag libraries. - * @return {@link TaglibFactory} instance by which templates can use JSP tag libraries. - */ - public TaglibFactory getTaglibFactory() { - return taglibFactory; - } - - /** - * Set {@link TaglibFactory} instance by which templates can use JSP tag libraries. - * @param taglibFactory {@link TaglibFactory} instance by which templates can use JSP tag libraries. - */ - public void setTaglibFactory(TaglibFactory taglibFactory) { - this.taglibFactory = taglibFactory; - } - - @Override - protected TemplateHashModel createModel(Map<String, Object> map, ObjectWrapperAndUnwrapper objectWrapper, - HttpServletRequest request, HttpServletResponse response) { - - AllHttpScopesHashModel model = new AllHttpScopesHashModel(objectWrapper, getServletContext(), request); - - model.putUnlistedModel(FreemarkerServlet.KEY_APPLICATION, getServletContextModel()); - - model.putUnlistedModel(FreemarkerServlet.KEY_SESSION, - getHttpSessionModel(objectWrapper, request, response)); - - HttpRequestHashModel requestModel = (HttpRequestHashModel) request - .getAttribute(FreemarkerServlet.ATTR_REQUEST_MODEL); - HttpRequestParametersHashModel requestParametersModel = (HttpRequestParametersHashModel) request - .getAttribute(FreemarkerServlet.ATTR_REQUEST_PARAMETERS_MODEL); - - if (requestModel == null || requestModel.getRequest() != request) { - requestModel = new HttpRequestHashModel(request, response, objectWrapper); - request.setAttribute(FreemarkerServlet.ATTR_REQUEST_MODEL, requestModel); - requestParametersModel = new HttpRequestParametersHashModel(request, objectWrapper); - } - - model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST, requestModel); - model.putUnlistedModel(FreemarkerServlet.KEY_REQUEST_PARAMETERS, requestParametersModel); - - model.putUnlistedModel(FreemarkerServlet.KEY_JSP_TAGLIBS, getTaglibFactory()); - - model.putAll(map); - - return model; - } - - /** - * Get {@link HttpSessionHashModel} instance by which templates can access session attributes. - * @param objectWrapperForModel ObjectWrapper to be used in model building - * @param request request - * @param response response - * @return {@link HttpSessionHashModel} instance by which templates can access session attributes - */ - protected HttpSessionHashModel getHttpSessionModel(ObjectWrapperAndUnwrapper objectWrapperForModel, - HttpServletRequest request, HttpServletResponse response) { - HttpSessionHashModel sessionModel; - HttpSession session = request.getSession(false); - - if (session != null) { - sessionModel = (HttpSessionHashModel) session.getAttribute(FreemarkerServlet.ATTR_SESSION_MODEL); - - if (sessionModel == null || sessionModel.isOrphaned(session)) { - sessionModel = new HttpSessionHashModel(session, objectWrapperForModel); - session.setAttribute(FreemarkerServlet.ATTR_SESSION_MODEL, sessionModel); - } - } else { - sessionModel = new HttpSessionHashModel(getPageContextServlet(), request, response, objectWrapperForModel); - } - - return sessionModel; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java deleted file mode 100644 index 7969b56..0000000 --- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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.web.view; - -import javax.servlet.GenericServlet; -import javax.servlet.ServletException; - -import org.apache.freemarker.core.Configuration; -import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; -import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; -import org.apache.freemarker.servlet.ServletContextHashModel; -import org.apache.freemarker.servlet.jsp.TaglibFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.web.servlet.view.AbstractTemplateViewResolver; -import org.springframework.web.servlet.view.AbstractUrlBasedView; -import org.springframework.web.servlet.view.UrlBasedViewResolver; - -/** - * FreeMarker template view resolver implementation, extending {@link AbstractTemplateViewResolver} that extends - * {@link UrlBasedViewResolver}. - * <p> - * The FreeMarker {@link Configuration} property must be set at least. Otherwise this throws {@link IllegalStateException} - * during initialization. In the bean initialization phase, this retrieves {@link ObjectWrapperAndUnwrapper} from - * the {@link Configuration} and instantiate the internal page object ({@link PageContextServlet}) for JSP tag - * library usages, {@link ServletContextHashModel} property for servlet context attribute accesses and {@link TaglibFactory} - * property for JSP tag library usages. - * </p> - */ -public class FreemarkerViewResolver extends AbstractTemplateViewResolver implements InitializingBean { - - /** - * FreeMarker {@link Configuration} instance. - */ - private Configuration configuration; - - /** - * {@link ObjectWrapperAndUnwrapper} instance to be used in model building. - */ - private ObjectWrapperAndUnwrapper objectWrapper; - - /** - * Internal servlet instance to provide a page object in JSP tag library usages. - * @see {@link javax.servlet.jsp.PageContext#getPage()} - */ - private GenericServlet pageContextServlet; - - /** - * {@link ServletContextHashModel} instance for templates to access servlet context attributes. - */ - private ServletContextHashModel servletContextModel; - - /** - * {@link TaglibFactory} instance for templates to be able to use JSP tag libraries. - */ - private TaglibFactory taglibFactory; - - /** - * Constructs view resolver. - */ - public FreemarkerViewResolver() { - super(); - setViewClass(FreemarkerView.class); - } - - /** - * Get FreeMarker {@link Configuration} instance. - * @return FreeMarker {@link Configuration} instance - */ - public Configuration getConfiguration() { - return configuration; - } - - /** - * Set FreeMarker {@link Configuration} instance. - * @param configuration FreeMarker {@link Configuration} instance - */ - public void setConfiguration(Configuration configuration) { - this.configuration = configuration; - } - - @Override - public void afterPropertiesSet() throws Exception { - if (configuration == null) { - throw new IllegalStateException("Configuration is not set."); - } - - if (objectWrapper == null) { - if (configuration.isObjectWrapperSet()) { - if (!(configuration.getObjectWrapper() instanceof ObjectWrapperAndUnwrapper)) { - throw new RuntimeException( - FreemarkerViewResolver.class.getSimpleName() + " requires an ObjectWrapper that " - + "implements " + ObjectWrapperAndUnwrapper.class.getName() - + ", but the Configuration's ObjectWrapper doesn't do that: " - + configuration.getObjectWrapper().getClass().getName()); - } - - objectWrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper(); - } else { - objectWrapper = new DefaultObjectWrapper.Builder(configuration.getIncompatibleImprovements()).build(); - } - } - - pageContextServlet = new PageContextServlet(); - - try { - pageContextServlet - .init(new PageContextServletConfig(getServletContext(), PageContextServlet.class.getSimpleName())); - } catch (ServletException e) { - // never happens... - } - - servletContextModel = new ServletContextHashModel(pageContextServlet, objectWrapper); - - taglibFactory = new TaglibFactory.Builder(getServletContext(), objectWrapper).build(); - } - - @Override - protected Class<?> requiredViewClass() { - return FreemarkerView.class; - } - - @Override - protected AbstractUrlBasedView buildView(String viewName) throws Exception { - FreemarkerView view = (FreemarkerView) super.buildView(viewName); - view.setConfiguration(configuration); - view.setObjectWrapper(objectWrapper); - view.setPageContextServlet(pageContextServlet); - view.setServletContextModel(servletContextModel); - view.setTaglibFactory(taglibFactory); - return view; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/test/java/org/apache/freemarker/spring/SpringResourceTemplateLoaderTest.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/SpringResourceTemplateLoaderTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/SpringResourceTemplateLoaderTest.java new file mode 100644 index 0000000..4fc59ee --- /dev/null +++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/SpringResourceTemplateLoaderTest.java @@ -0,0 +1,84 @@ +/* + * 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; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; + +import java.io.IOException; + +import org.apache.freemarker.core.Configuration; +import org.apache.freemarker.core.TemplateNotFoundException; +import org.apache.freemarker.spring.SpringResourceTemplateLoader; +import org.apache.freemarker.test.TestConfigurationBuilder; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.GenericApplicationContext; + +public class SpringResourceTemplateLoaderTest { + + private static final String TEMPLATE_BASE_PATH = "classpath:META-INF/templates/"; + + private GenericApplicationContext appContext; + private SpringResourceTemplateLoader templateLoader; + private Configuration cfg; + + @Before + public void setUp() throws IOException { + appContext = new GenericApplicationContext(); + templateLoader = new SpringResourceTemplateLoader(); + templateLoader.setBaseLocation(TEMPLATE_BASE_PATH); + templateLoader.setResourceLoader(appContext); + cfg = new TestConfigurationBuilder().templateLoader(templateLoader).build(); + } + + @After + public void tearDown() throws Exception { + if (appContext.isActive()) { + appContext.stop(); + appContext.destroy(); + appContext.close(); + } + } + + @Test + public void testSuccessful() throws Exception { + for (int i = 0; i < 2; i++) { + assertEquals("foo", cfg.getTemplate("sub1/sub2/t.ftl").toString()); + } + } + + @Test + public void testNotFound() throws Exception { + for (int i = 0; i < 2; i++) { + try { + cfg.getTemplate("sub1X/sub2/t.ftl"); + fail(); + } catch (TemplateNotFoundException e) { + assertThat(e.getMessage(), containsString("sub1X")); + assertNull(e.getCause()); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java deleted file mode 100644 index 30c7ed7..0000000 --- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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.templateresolver; - -import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.io.IOException; - -import org.apache.freemarker.core.Configuration; -import org.apache.freemarker.core.TemplateNotFoundException; -import org.apache.freemarker.spring.SpringResourceTemplateLoader; -import org.apache.freemarker.test.TestConfigurationBuilder; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.support.GenericApplicationContext; - -public class SpringResourceTemplateLoaderTest { - - private static final String TEMPLATE_BASE_PATH = "classpath:META-INF/templates/"; - - private GenericApplicationContext appContext; - private SpringResourceTemplateLoader templateLoader; - private Configuration cfg; - - @Before - public void setUp() throws IOException { - appContext = new GenericApplicationContext(); - templateLoader = new SpringResourceTemplateLoader(); - templateLoader.setBaseLocation(TEMPLATE_BASE_PATH); - templateLoader.setResourceLoader(appContext); - cfg = new TestConfigurationBuilder().templateLoader(templateLoader).build(); - } - - @After - public void tearDown() throws Exception { - if (appContext.isActive()) { - appContext.stop(); - appContext.destroy(); - appContext.close(); - } - } - - @Test - public void testSuccessful() throws Exception { - for (int i = 0; i < 2; i++) { - assertEquals("foo", cfg.getTemplate("sub1/sub2/t.ftl").toString()); - } - } - - @Test - public void testNotFound() throws Exception { - for (int i = 0; i < 2; i++) { - try { - cfg.getTemplate("sub1X/sub2/t.ftl"); - fail(); - } catch (TemplateNotFoundException e) { - assertThat(e.getMessage(), containsString("sub1X")); - assertNull(e.getCause()); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java new file mode 100644 index 0000000..e75155e --- /dev/null +++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java @@ -0,0 +1,98 @@ +/* + * 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.web.view; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import javax.servlet.ServletContext; + +import org.apache.freemarker.core.Configuration; +import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.GenericWebApplicationContext; + +public class FreeMarkerViewResolverTest { + + private ServletContext servletContext; + private GenericWebApplicationContext applicationContext; + + private StringTemplateLoader templateLoader; + private Configuration configuration; + + private FreeMarkerViewResolver viewResolver; + + private String prefix = "/WEB-INF/freemarker/"; + private String normalizedPrefix = "WEB-INF/freemarker/"; + private String suffix = ".ftl"; + + @Before + public void setUp() throws Exception { + servletContext = new MockServletContext(); + + applicationContext = new GenericWebApplicationContext(servletContext); + applicationContext.refresh(); + servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); + + templateLoader = new StringTemplateLoader(); + templateLoader.putTemplate(normalizedPrefix + "hello" + suffix, "Hello, World!"); + + configuration = new Configuration.Builder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) + .templateLoader(templateLoader).build(); + + viewResolver = new FreeMarkerViewResolver(); + viewResolver.setServletContext(servletContext); + viewResolver.setApplicationContext(applicationContext); + viewResolver.setConfiguration(configuration); + viewResolver.setPrefix(prefix); + viewResolver.setSuffix(suffix); + viewResolver.afterPropertiesSet(); + } + + @Test + public void testViewResolver() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); + request.setContextPath("/mycontext"); + request.setServletPath("/myservlet"); + + MockHttpServletResponse response = new MockHttpServletResponse(); + + FreeMarkerView view = resolveFreemarkerView("hello", null);//Locale.ENGLISH); + Map<String, Object> model = new HashMap<String, Object>(); + view.render(model, request, response); + + assertEquals("Hello, World!", response.getContentAsString()); + } + + private FreeMarkerView resolveFreemarkerView(final String name, final Locale locale) throws Exception { + FreeMarkerView view = (FreeMarkerView) viewResolver.resolveViewName(name, locale); + view.setServletContext(servletContext); + view.setApplicationContext(applicationContext); + return view; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 new file mode 100644 index 0000000..078bfa0 --- /dev/null +++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewTest.java @@ -0,0 +1,176 @@ +/* + * 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.web.view; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; + +import javax.servlet.GenericServlet; +import javax.servlet.ServletContext; + +import org.apache.freemarker.core.Configuration; +import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; +import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader; +import org.apache.freemarker.servlet.ServletContextHashModel; +import org.apache.freemarker.servlet.jsp.TaglibFactory; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.GenericWebApplicationContext; + +public class FreeMarkerViewTest { + + private ServletContext servletContext; + private GenericWebApplicationContext applicationContext; + + private StringTemplateLoader templateLoader; + private Configuration configuration; + private ObjectWrapperAndUnwrapper objectWrapper; + + private GenericServlet pageContextServlet; + private TaglibFactory taglibFactory; + + private FreeMarkerViewResolver viewResolver; + + private AtomicLong visitorCount; + + @Before + public void setUp() throws Exception { + servletContext = new MockServletContext(); + + applicationContext = new GenericWebApplicationContext(servletContext); + applicationContext.refresh(); + servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); + + templateLoader = new StringTemplateLoader(); + configuration = new Configuration.Builder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) + .templateLoader(templateLoader).build(); + objectWrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper(); + + pageContextServlet = new PageContextServlet(); + pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName())); + taglibFactory = new TaglibFactory.Builder(servletContext, objectWrapper).build(); + + viewResolver = new FreeMarkerViewResolver(); + viewResolver.setServletContext(servletContext); + viewResolver.setApplicationContext(applicationContext); + viewResolver.setConfiguration(configuration); + viewResolver.afterPropertiesSet(); + + visitorCount = new AtomicLong(); + servletContext.setAttribute("visitorCount", visitorCount); + } + + @Test + public void testViewWithBasicModel() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); + request.setContextPath("/mycontext"); + request.setServletPath("/myservlet"); + + templateLoader.putTemplate("hello.ftl", "Hello, ${name!\"World\"}! Visit count: ${visitCount!0}"); + + FreeMarkerView view = createFreemarkerView("hello.ftl"); + + int visitCount = 0; + Map<String, Object> model = new HashMap<String, Object>(); + + MockHttpServletResponse response = new MockHttpServletResponse(); + view.render(model, request, response); + assertEquals("Hello, World! Visit count: 0", response.getContentAsString()); + + response = new MockHttpServletResponse(); + model.put("name", "Dan"); + model.put("visitCount", ++visitCount); + view.render(model, request, response); + assertEquals("Hello, Dan! Visit count: 1", response.getContentAsString()); + } + + @Test + public void testViewWithDefaultServletModel() throws Exception { + MockHttpSession session = new MockHttpSession(servletContext); + session.setAttribute("itemCountInCart", 3); + + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); + request.setContextPath("/mycontext"); + request.setServletPath("/myservlet"); + request.setPathInfo(";mypathinfo"); + request.addParameter("token1", "value1"); + request.setSession(session); + request.setAttribute("promotion", "Fresh blue berries"); + + templateLoader.putTemplate("default-model.ftl", + "${name!}, you have ${Session.itemCountInCart!0} items in cart. " + "Hot deal: ${Request.promotion}. " + + "BTW, you're ${Application.visitorCount}th visitor. " + + "(token1: ${RequestParameters['token1']!})"); + + FreeMarkerView view = createFreemarkerView("default-model.ftl"); + + Map<String, Object> model = new HashMap<String, Object>(); + model.put("name", "Dan"); + + final long count = visitorCount.incrementAndGet(); + MockHttpServletResponse response = new MockHttpServletResponse(); + view.render(model, request, response); + assertEquals("Dan, you have 3 items in cart. Hot deal: Fresh blue berries. BTW, you're " + count + + "th visitor. (token1: value1)", response.getContentAsString()); + } + + @Test + public void testViewWithTaglibs() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); + request.setContextPath("/mycontext"); + request.setServletPath("/myservlet"); + + templateLoader.putTemplate("taglibs.ftl", + "<#assign e=JspTaglibs ['http://freemarker.org/jsp/example/echo'] >" + + "<#assign msg=\"Hello!\" />" + + "<@e.echo message=msg />"); + + FreeMarkerView view = createFreemarkerView("taglibs.ftl"); + + Map<String, Object> model = new HashMap<String, Object>(); + MockHttpServletResponse response = new MockHttpServletResponse(); + view.render(model, request, response); + assertEquals("Hello!", response.getContentAsString()); + } + + private FreeMarkerView createFreemarkerView(final String name) throws Exception { + FreeMarkerView view = new FreeMarkerView(); + + view.setServletContext(servletContext); + view.setApplicationContext(applicationContext); + view.setConfiguration(configuration); + view.setObjectWrapper(objectWrapper); + + view.setPageContextServlet(pageContextServlet); + view.setServletContextModel(new ServletContextHashModel(pageContextServlet, objectWrapper)); + view.setTaglibFactory(taglibFactory); + + view.setUrl(name); + + return view; + } +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolverTest.java ---------------------------------------------------------------------- diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolverTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolverTest.java deleted file mode 100644 index 7baf7f2..0000000 --- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolverTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.web.view; - -import static org.junit.Assert.assertEquals; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.apache.freemarker.core.Configuration; -import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader; -import org.junit.Before; -import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.mock.web.MockServletContext; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.GenericWebApplicationContext; - -public class FreemarkerViewResolverTest { - - private ServletContext servletContext; - private GenericWebApplicationContext applicationContext; - - private StringTemplateLoader templateLoader; - private Configuration configuration; - - private FreemarkerViewResolver viewResolver; - - private String prefix = "/WEB-INF/freemarker/"; - private String normalizedPrefix = "WEB-INF/freemarker/"; - private String suffix = ".ftl"; - - @Before - public void setUp() throws Exception { - servletContext = new MockServletContext(); - - applicationContext = new GenericWebApplicationContext(servletContext); - applicationContext.refresh(); - servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); - - templateLoader = new StringTemplateLoader(); - templateLoader.putTemplate(normalizedPrefix + "hello" + suffix, "Hello, World!"); - - configuration = new Configuration.Builder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) - .templateLoader(templateLoader).build(); - - viewResolver = new FreemarkerViewResolver(); - viewResolver.setServletContext(servletContext); - viewResolver.setApplicationContext(applicationContext); - viewResolver.setConfiguration(configuration); - viewResolver.setPrefix(prefix); - viewResolver.setSuffix(suffix); - viewResolver.afterPropertiesSet(); - } - - @Test - public void testViewResolver() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); - request.setContextPath("/mycontext"); - request.setServletPath("/myservlet"); - - MockHttpServletResponse response = new MockHttpServletResponse(); - - FreemarkerView view = resolveFreemarkerView("hello", null);//Locale.ENGLISH); - Map<String, Object> model = new HashMap<String, Object>(); - view.render(model, request, response); - - assertEquals("Hello, World!", response.getContentAsString()); - } - - private FreemarkerView resolveFreemarkerView(final String name, final Locale locale) throws Exception { - FreemarkerView view = (FreemarkerView) viewResolver.resolveViewName(name, locale); - view.setServletContext(servletContext); - view.setApplicationContext(applicationContext); - return view; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/5b856d3a/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 deleted file mode 100644 index 1ed2831..0000000 --- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * 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.web.view; - -import static org.junit.Assert.assertEquals; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - -import javax.servlet.GenericServlet; -import javax.servlet.ServletContext; - -import org.apache.freemarker.core.Configuration; -import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper; -import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader; -import org.apache.freemarker.servlet.ServletContextHashModel; -import org.apache.freemarker.servlet.jsp.TaglibFactory; -import org.junit.Before; -import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.mock.web.MockHttpSession; -import org.springframework.mock.web.MockServletContext; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.GenericWebApplicationContext; - -public class FreemarkerViewTest { - - private ServletContext servletContext; - private GenericWebApplicationContext applicationContext; - - private StringTemplateLoader templateLoader; - private Configuration configuration; - private ObjectWrapperAndUnwrapper objectWrapper; - - private GenericServlet pageContextServlet; - private TaglibFactory taglibFactory; - - private FreemarkerViewResolver viewResolver; - - private AtomicLong visitorCount; - - @Before - public void setUp() throws Exception { - servletContext = new MockServletContext(); - - applicationContext = new GenericWebApplicationContext(servletContext); - applicationContext.refresh(); - servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); - - templateLoader = new StringTemplateLoader(); - configuration = new Configuration.Builder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) - .templateLoader(templateLoader).build(); - objectWrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper(); - - pageContextServlet = new PageContextServlet(); - pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName())); - taglibFactory = new TaglibFactory.Builder(servletContext, objectWrapper).build(); - - viewResolver = new FreemarkerViewResolver(); - viewResolver.setServletContext(servletContext); - viewResolver.setApplicationContext(applicationContext); - viewResolver.setConfiguration(configuration); - viewResolver.afterPropertiesSet(); - - visitorCount = new AtomicLong(); - servletContext.setAttribute("visitorCount", visitorCount); - } - - @Test - public void testViewWithBasicModel() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); - request.setContextPath("/mycontext"); - request.setServletPath("/myservlet"); - - templateLoader.putTemplate("hello.ftl", "Hello, ${name!\"World\"}! Visit count: ${visitCount!0}"); - - FreemarkerView view = createFreemarkerView("hello.ftl"); - - int visitCount = 0; - Map<String, Object> model = new HashMap<String, Object>(); - - MockHttpServletResponse response = new MockHttpServletResponse(); - view.render(model, request, response); - assertEquals("Hello, World! Visit count: 0", response.getContentAsString()); - - response = new MockHttpServletResponse(); - model.put("name", "Dan"); - model.put("visitCount", ++visitCount); - view.render(model, request, response); - assertEquals("Hello, Dan! Visit count: 1", response.getContentAsString()); - } - - @Test - public void testViewWithDefaultServletModel() throws Exception { - MockHttpSession session = new MockHttpSession(servletContext); - session.setAttribute("itemCountInCart", 3); - - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); - request.setContextPath("/mycontext"); - request.setServletPath("/myservlet"); - request.setPathInfo(";mypathinfo"); - request.addParameter("token1", "value1"); - request.setSession(session); - request.setAttribute("promotion", "Fresh blue berries"); - - templateLoader.putTemplate("default-model.ftl", - "${name!}, you have ${Session.itemCountInCart!0} items in cart. " + "Hot deal: ${Request.promotion}. " - + "BTW, you're ${Application.visitorCount}th visitor. " - + "(token1: ${RequestParameters['token1']!})"); - - FreemarkerView view = createFreemarkerView("default-model.ftl"); - - Map<String, Object> model = new HashMap<String, Object>(); - model.put("name", "Dan"); - - final long count = visitorCount.incrementAndGet(); - MockHttpServletResponse response = new MockHttpServletResponse(); - view.render(model, request, response); - assertEquals("Dan, you have 3 items in cart. Hot deal: Fresh blue berries. BTW, you're " + count - + "th visitor. (token1: value1)", response.getContentAsString()); - } - - @Test - public void testViewWithTaglibs() throws Exception { - MockHttpServletRequest request = new MockHttpServletRequest("GET", "/mytest.do"); - request.setContextPath("/mycontext"); - request.setServletPath("/myservlet"); - - templateLoader.putTemplate("taglibs.ftl", - "<#assign e=JspTaglibs ['http://freemarker.org/jsp/example/echo'] >" - + "<#assign msg=\"Hello!\" />" - + "<@e.echo message=msg />"); - - FreemarkerView view = createFreemarkerView("taglibs.ftl"); - - Map<String, Object> model = new HashMap<String, Object>(); - MockHttpServletResponse response = new MockHttpServletResponse(); - view.render(model, request, response); - assertEquals("Hello!", response.getContentAsString()); - } - - private FreemarkerView createFreemarkerView(final String name) throws Exception { - FreemarkerView view = new FreemarkerView(); - - view.setServletContext(servletContext); - view.setApplicationContext(applicationContext); - view.setConfiguration(configuration); - view.setObjectWrapper(objectWrapper); - - view.setPageContextServlet(pageContextServlet); - view.setServletContextModel(new ServletContextHashModel(pageContextServlet, objectWrapper)); - view.setTaglibFactory(taglibFactory); - - view.setUrl(name); - - return view; - } -}
