diff --git a/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java b/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java index d88297507..b9fba3579 100644 --- a/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java +++ b/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java @@ -27,13 +27,21 @@ import com.opensymphony.xwork2.util.FileManager; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; -import freemarker.cache.*; +import freemarker.cache.ClassTemplateLoader; +import freemarker.cache.FileTemplateLoader; +import freemarker.cache.MultiTemplateLoader; +import freemarker.cache.TemplateLoader; +import freemarker.cache.WebappTemplateLoader; import freemarker.ext.jsp.TaglibFactory; import freemarker.ext.servlet.HttpRequestHashModel; import freemarker.ext.servlet.HttpRequestParametersHashModel; import freemarker.ext.servlet.HttpSessionHashModel; import freemarker.ext.servlet.ServletContextHashModel; -import freemarker.template.*; +import freemarker.template.Configuration; +import freemarker.template.ObjectWrapper; +import freemarker.template.TemplateException; +import freemarker.template.TemplateExceptionHandler; +import freemarker.template.TemplateModel; import freemarker.template.utility.StringUtil; import org.apache.struts2.StrutsConstants; import org.apache.struts2.views.JspSupportServlet; @@ -49,7 +57,13 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Calendar; +import java.util.Collections; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; /** @@ -382,7 +396,7 @@ public class FreemarkerManager { // substring(7) is intentional as we "reuse" the last slash templatePathLoader = new ClassTemplateLoader(getClass(), templatePath.substring(7)); } else if (templatePath.startsWith("file://")) { - templatePathLoader = new FileTemplateLoader(new File(templatePath)); + templatePathLoader = new FileTemplateLoader(new File(templatePath.substring(7))); } } } catch (IOException e) { diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerManagerTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerManagerTest.java index c48c7f601..0e1059010 100644 --- a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerManagerTest.java +++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerManagerTest.java @@ -21,12 +21,12 @@ package org.apache.struts2.views.freemarker; +import org.apache.commons.io.FileUtils; import org.apache.struts2.StrutsTestCase; import org.apache.struts2.views.jsp.StrutsMockServletContext; /** * Test case for FreemarkerManager - * */ public class FreemarkerManagerTest extends StrutsTestCase { @@ -38,4 +38,27 @@ public class FreemarkerManagerTest extends StrutsTestCase { freemarker.template.Configuration conf = mgr.getConfiguration(servletContext); assertEquals(conf.getDefaultEncoding(), "UTF-8"); } + + public void testTemplateLoaderBaseOnFile() throws Exception { + // given + DummyFreemarkerManager manager = new DummyFreemarkerManager(); + StrutsMockServletContext servletContext = new StrutsMockServletContext(); + servletContext.setAttribute(FreemarkerManager.CONFIG_SERVLET_CONTEXT_KEY, null); + + String tmpPath = "file://" + FileUtils.getTempDirectoryPath(); + + // when + manager.load(servletContext, tmpPath); + + // then + assertTrue(true); // should pass + } +} + +class DummyFreemarkerManager extends FreemarkerManager { + + public void load(StrutsMockServletContext servletContext, String path) { + createTemplateLoader(servletContext, path); + } + }