This is an automated email from the ASF dual-hosted git repository. ddekany pushed a commit to branch 2.3-gae in repository https://gitbox.apache.org/repos/asf/freemarker.git
commit 651598673527586ab793664589ae83644451fa43 Author: ddekany <[email protected]> AuthorDate: Mon Dec 25 18:12:14 2023 +0100 Dropped support for very old Servlet and JSP versions, and now requiring at least Servlet 3.0 and JSP 2.2. This way, we only need to support a single javax Servlet/JSP version, and could remove the complications from supporting multiple old versions. Also, with this, the "jsp20" and "jsp21" Gradle configurations were unified as "javaxServlet" (because later we want to have "jakartaServlet" too). --- build.gradle.kts | 33 ++-- .../freemarker/cache/WebappTemplateLoader.java | 0 .../ext/jsp/CustomTagAndELFunctionCombiner.java | 0 .../java/freemarker/ext/jsp/EventForwarding.java | 0 .../ext/jsp/FreeMarkerJspApplicationContext.java | 0 .../freemarker/ext/jsp/FreeMarkerJspFactory.java | 30 +++- .../freemarker/ext/jsp/FreeMarkerPageContext.java | 172 +++++++++++++++------ .../java/freemarker/ext/jsp/FreemarkerTag.java | 0 .../java/freemarker/ext/jsp/JspContextModel.java | 0 .../java/freemarker/ext/jsp/JspTagModelBase.java | 0 .../java/freemarker/ext/jsp/JspWriterAdapter.java | 0 .../freemarker/ext/jsp/PageContextFactory.java | 23 ++- .../ext/jsp/SimpleTagDirectiveModel.java | 0 .../java/freemarker/ext/jsp/TagTransformModel.java | 0 .../java/freemarker/ext/jsp/TaglibFactory.java | 0 .../java/freemarker/ext/jsp/TaglibMethodUtil.java | 0 .../src/main/java/freemarker/ext/jsp/package.html | 0 .../ext/servlet/AllHttpScopesHashModel.java | 0 .../freemarker/ext/servlet/FreemarkerServlet.java | 0 .../ext/servlet/HttpRequestHashModel.java | 0 .../servlet/HttpRequestParametersHashModel.java | 0 .../ext/servlet/HttpSessionHashModel.java | 0 .../java/freemarker/ext/servlet/IncludePage.java | 0 .../freemarker/ext/servlet/InitParamParser.java | 0 .../ext/servlet/ServletContextHashModel.java | 0 .../freemarker/ext/servlet/SuppressFBWarnings.java | 0 .../main/java/freemarker/ext/servlet/package.html | 0 .../ext/jsp/JspTestFreemarkerServlet.java | 0 ...spTestFreemarkerServletWithDefaultOverride.java | 0 .../ext/jsp/RealServletContainertTest.java | 0 .../java/freemarker/ext/jsp/TLDParsingTest.java | 0 .../freemarker/ext/jsp/TaglibMethodUtilTest.java | 0 .../jsp/taglibmembers/AttributeAccessorTag.java | 0 .../ext/jsp/taglibmembers/AttributeInfoTag.java | 0 .../ext/jsp/taglibmembers/EnclosingClass.java | 0 .../ext/jsp/taglibmembers/GetAndSetTag.java | 0 .../ext/jsp/taglibmembers/TestFunctions.java | 0 .../ext/jsp/taglibmembers/TestSimpleTag.java | 0 .../ext/jsp/taglibmembers/TestSimpleTag2.java | 0 .../ext/jsp/taglibmembers/TestSimpleTag3.java | 0 .../freemarker/ext/jsp/taglibmembers/TestTag.java | 0 .../freemarker/ext/jsp/taglibmembers/TestTag2.java | 0 .../freemarker/ext/jsp/taglibmembers/TestTag3.java | 0 .../config/WebappLocalFreemarkerServlet.java | 0 .../ext/servlet/FreemarkerServletTest.java | 0 .../ext/servlet/InitParamParserTest.java | 0 .../freemarker/template/MockServletContext.java | 0 .../template/TemplateNotFoundMessageTest.java | 0 .../test/servlet/DefaultModel2TesterAction.java | 0 .../java/freemarker/test/servlet/Model2Action.java | 0 .../test/servlet/Model2TesterServlet.java | 0 .../freemarker/test/servlet/WebAppTestCase.java | 0 .../META-INF/tldDiscovery MetaInfTldSources-1.tld | 0 .../freemarker/ext/jsp/TLDParsingTest.tld | 0 .../ext/jsp/templates/classpath-test.ftl | 0 .../ext/jsp/tldDiscovery-ClassPathTlds-1.tld | 0 .../ext/jsp/tldDiscovery-ClassPathTlds-2.tld | 0 .../freemarker/ext/jsp/webapps/basic/CONTENTS.txt | 0 .../basic/WEB-INF/el-function-tag-name-clash.tld | 0 .../ext/jsp/webapps/basic/WEB-INF/el-functions.tld | 0 .../basic/WEB-INF/expected/attributes-2.3.0.txt | 0 .../WEB-INF/expected/attributes-2.3.22-future.txt | 0 .../webapps/basic/WEB-INF/expected/attributes.txt | 0 .../webapps/basic/WEB-INF/expected/customTags1.txt | 0 .../ext/jsp/webapps/basic/WEB-INF/test.tld | 0 .../ext/jsp/webapps/basic/WEB-INF/web.xml | 0 .../ext/jsp/webapps/basic/attributes.ftl | 0 .../ext/jsp/webapps/basic/customELFunctions1.ftl | 0 .../ext/jsp/webapps/basic/customELFunctions1.jsp | 0 .../ext/jsp/webapps/basic/customTags1.ftl | 0 .../jsp/webapps/basic/elFunctionsTagNameClash.ftl | 0 .../jsp/webapps/basic/elFunctionsTagNameClash.jsp | 0 .../ext/jsp/webapps/basic/[email protected] | 0 .../freemarker/ext/jsp/webapps/basic/trivial.ftl | 0 .../freemarker/ext/jsp/webapps/basic/trivial.jsp | 0 .../freemarker/ext/jsp/webapps/config/CONTENTS.txt | 0 .../webapps/config/WEB-INF/classes/sub/test.ftl | 0 .../jsp/webapps/config/WEB-INF/classes/test.ftl | 0 .../config/WEB-INF/lib/templates.jar/sub/test2.ftl | 0 .../jsp/webapps/config/WEB-INF/templates/test.ftl | 0 .../ext/jsp/webapps/config/WEB-INF/web.xml | 0 .../freemarker/ext/jsp/webapps/config/test.ftl | 0 .../freemarker/ext/jsp/webapps/errors/CONTENTS.txt | 0 .../ext/jsp/webapps/errors/WEB-INF/web.xml | 0 .../ext/jsp/webapps/errors/failing-parsetime.ftlnv | 0 .../ext/jsp/webapps/errors/failing-parsetime.jsp | 0 .../ext/jsp/webapps/errors/failing-runtime.ftl | 0 .../ext/jsp/webapps/errors/failing-runtime.jsp | 0 .../ext/jsp/webapps/errors/not-failing.ftl | 0 .../ext/jsp/webapps/multipleLoaders/CONTENTS.txt | 0 .../multipleLoaders/WEB-INF/templates/test.ftl | 0 .../jsp/webapps/multipleLoaders/WEB-INF/web.xml | 0 .../ext/jsp/webapps/tldDiscovery/CONTENTS.txt | 0 .../WEB-INF/expected/subdir/test-rel.txt | 0 .../WEB-INF/expected/test-noClasspath.txt | 0 .../tldDiscovery/WEB-INF/expected/test1.txt | 0 .../webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld | 0 .../webapps/tldDiscovery/WEB-INF/fmtesttag4.tld | 0 .../lib/taglib-foo.jar/META-INF/foo bar.tld | 0 .../WEB-INF/subdir-with-tld/fmtesttag3.tld | 0 .../WEB-INF/taglib 2.jar/META-INF/taglib.tld | 0 .../ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml | 0 .../tldDiscovery/not-auto-scanned/fmtesttag.tld | 0 .../jsp/webapps/tldDiscovery/subdir/test-rel.ftl | 0 .../jsp/webapps/tldDiscovery/test-noClasspath.ftl | 0 .../ext/jsp/webapps/tldDiscovery/test1.ftl | 0 .../test/resources/freemarker/test/servlet/web.xml | 0 .../freemarker/ext/jsp/PageContextFactory.java | 71 --------- .../ext/jsp/_FreeMarkerPageContext2.java | 97 ------------ .../freemarker/ext/jsp/FreeMarkerJspFactory21.java | 51 ------ .../ext/jsp/_FreeMarkerPageContext21.java | 121 --------------- freemarker-manual/src/main/docgen/en_US/book.xml | 25 ++- 112 files changed, 206 insertions(+), 417 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e9a2750b..b023bee2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,8 +39,7 @@ tasks.withType<JavaCompile>().configureEach { freemarkerRoot { configureSourceSet(SourceSet.MAIN_SOURCE_SET_NAME) { enableTests() } - configureSourceSet("jsp20") - configureSourceSet("jsp21") { enableTests() } + configureSourceSet("javaxServlet") { enableTests() } configureSourceSet("jython20") configureSourceSet("jython22") configureSourceSet("jython25") { enableTests() } @@ -105,7 +104,7 @@ tasks.jar.configure { configurations { register("combinedClasspath") { extendsFrom(named("jython25CompileClasspath").get()) - extendsFrom(named("jsp21CompileClasspath").get()) + extendsFrom(named("javaxServletCompileClasspath").get()) } } @@ -494,7 +493,7 @@ eclipse { configurations["combinedClasspath"], configurations["core16CompileClasspath"], configurations["testUtilsCompileClasspath"], - configurations["jsp21TestCompileClasspath"] + configurations["javaxServletTestCompileClasspath"] ) } } @@ -515,7 +514,7 @@ configurations { exclude(group = "xml-apis", module = "xml-apis") } - "jsp21TestImplementation" { + "javaxServletTestImplementation" { extendsFrom(compileClasspath.get()) exclude(group = "javax.servlet.jsp") exclude(group = "javax.servlet", module = "servlet-api") @@ -544,27 +543,23 @@ dependencies { testImplementation(xalan) - "jsp20CompileOnly"("javax.servlet.jsp:jsp-api:2.0") - "jsp20CompileOnly"("javax.servlet:servlet-api:2.4") + "javaxServletCompileOnly"("javax.servlet.jsp:jsp-api:2.1") + "javaxServletCompileOnly"("javax.servlet:servlet-api:2.5") - "jsp21CompileOnly"(sourceSets["jsp20"].output) - "jsp21CompileOnly"("javax.servlet.jsp:jsp-api:2.1") - "jsp21CompileOnly"("javax.servlet:servlet-api:2.5") - - "jsp21TestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}") - "jsp21TestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}") - "jsp21TestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}") - "jsp21TestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}") + "javaxServletTestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}") + "javaxServletTestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}") + "javaxServletTestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}") + "javaxServletTestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}") // Jetty also contains the servlet-api and jsp-api classes // JSP JSTL (not included in Jetty): - "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}") - "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}") + "javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}") + "javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}") - "jsp21TestImplementation"("org.springframework:spring-core:${springVersion}") { + "javaxServletTestImplementation"("org.springframework:spring-core:${springVersion}") { exclude(group = "commons-logging", module = "commons-logging") } - "jsp21TestImplementation"("org.springframework:spring-test:${springVersion}") { + "javaxServletTestImplementation"("org.springframework:spring-test:${springVersion}") { exclude(group = "commons-logging", module = "commons-logging") } diff --git a/freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java b/freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java rename to freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java similarity index 100% rename from freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java similarity index 69% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java index 9f673357..0df7dfd8 100644 --- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java +++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java @@ -20,16 +20,21 @@ package freemarker.ext.jsp; import javax.servlet.Servlet; +import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.jsp.JspApplicationContext; import javax.servlet.jsp.JspEngineInfo; import javax.servlet.jsp.JspFactory; import javax.servlet.jsp.PageContext; -/** - */ -abstract class FreeMarkerJspFactory extends JspFactory { - protected abstract String getSpecificationVersion(); +class FreeMarkerJspFactory extends JspFactory { + private static final String SPECIFICATION_VERSION = "2.2"; + private static final String JSPCTX_KEY = "freemarker.ext.jsp.FreeMarkerJspFactory21#jspAppContext"; + + protected String getSpecificationVersion() { + return SPECIFICATION_VERSION; + } @Override public JspEngineInfo getEngineInfo() { @@ -60,4 +65,21 @@ abstract class FreeMarkerJspFactory extends JspFactory { // for this API. throw new UnsupportedOperationException(); } + + @Override + public JspApplicationContext getJspApplicationContext(ServletContext ctx) { + JspApplicationContext jspctx = (JspApplicationContext) ctx.getAttribute( + JSPCTX_KEY); + if (jspctx == null) { + synchronized (ctx) { + jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY); + if (jspctx == null) { + jspctx = new FreeMarkerJspApplicationContext(); + ctx.setAttribute(JSPCTX_KEY, jspctx); + } + } + } + return jspctx; + } + } \ No newline at end of file diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java similarity index 76% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java index 041f8926..b97d2c74 100644 --- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java +++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java @@ -23,12 +23,15 @@ package freemarker.ext.jsp; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.ListIterator; +import javax.el.ELContext; import javax.servlet.GenericServlet; import javax.servlet.Servlet; import javax.servlet.ServletConfig; @@ -41,8 +44,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import javax.servlet.http.HttpSession; +import javax.servlet.jsp.JspApplicationContext; +import javax.servlet.jsp.JspContext; +import javax.servlet.jsp.JspFactory; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; +import javax.servlet.jsp.el.ELException; +import javax.servlet.jsp.el.ExpressionEvaluator; +import javax.servlet.jsp.el.VariableResolver; import javax.servlet.jsp.tagext.BodyContent; import freemarker.core.Environment; @@ -50,6 +59,7 @@ import freemarker.ext.servlet.FreemarkerServlet; import freemarker.ext.servlet.HttpRequestHashModel; import freemarker.ext.servlet.ServletContextHashModel; import freemarker.ext.util.WrapperTemplateModel; +import freemarker.log.Logger; import freemarker.template.AdapterTemplateModel; import freemarker.template.ObjectWrapper; import freemarker.template.ObjectWrapperAndUnwrapper; @@ -62,13 +72,22 @@ import freemarker.template.TemplateModelIterator; import freemarker.template.TemplateNumberModel; import freemarker.template.TemplateScalarModel; import freemarker.template._VersionInts; +import freemarker.template.utility.ClassUtil; import freemarker.template.utility.UndeclaredThrowableException; -/** - */ -abstract class FreeMarkerPageContext extends PageContext implements TemplateModel { +class FreeMarkerPageContext extends PageContext implements TemplateModel { + private static final Logger LOG = Logger.getLogger("freemarker.jsp"); + + static { + if (JspFactory.getDefaultFactory() == null) { + JspFactory.setDefaultFactory(new FreeMarkerJspFactory()); + } + LOG.debug("Using JspFactory implementation class " + + JspFactory.getDefaultFactory().getClass().getName()); + } + private static final Class OBJECT_CLASS = Object.class; - + private final Environment environment; private final int incompatibleImprovements; private List tags = new ArrayList(); @@ -80,7 +99,8 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode private final ObjectWrapper wrapper; private final ObjectWrapperAndUnwrapper unwrapper; private JspWriter jspOut; - + private ELContext elContext; + protected FreeMarkerPageContext() throws TemplateModelException { environment = Environment.getCurrentEnvironment(); incompatibleImprovements = environment.getConfiguration().getIncompatibleImprovements().intValue(); @@ -94,15 +114,15 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode if (appModel instanceof ServletContextHashModel) { this.servlet = ((ServletContextHashModel) appModel).getServlet(); } else { - throw new TemplateModelException("Could not find an instance of " + - ServletContextHashModel.class.getName() + - " in the data model under either the name " + - FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " + + throw new TemplateModelException("Could not find an instance of " + + ServletContextHashModel.class.getName() + + " in the data model under either the name " + + FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " + FreemarkerServlet.KEY_APPLICATION); } - - TemplateModel requestModel = - environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE); + + TemplateModel requestModel = + environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE); if (!(requestModel instanceof HttpRequestHashModel)) { requestModel = environment.getGlobalVariable( FreemarkerServlet.KEY_REQUEST); @@ -116,10 +136,10 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode unwrapper = this.wrapper instanceof ObjectWrapperAndUnwrapper ? (ObjectWrapperAndUnwrapper) this.wrapper : null; } else { - throw new TemplateModelException("Could not find an instance of " + - HttpRequestHashModel.class.getName() + - " in the data model under either the name " + - FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " + + throw new TemplateModelException("Could not find an instance of " + + HttpRequestHashModel.class.getName() + + " in the data model under either the name " + + FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " + FreemarkerServlet.KEY_REQUEST); } @@ -132,17 +152,17 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode setAttribute(CONFIG, servlet.getServletConfig()); setAttribute(PAGECONTEXT, this); setAttribute(APPLICATION, servlet.getServletContext()); - } - + } + ObjectWrapper getObjectWrapper() { return wrapper; } - + @Override public void initialize( - Servlet servlet, ServletRequest request, ServletResponse response, - String errorPageURL, boolean needsSession, int bufferSize, - boolean autoFlush) { + Servlet servlet, ServletRequest request, ServletResponse response, + String errorPageURL, boolean needsSession, int bufferSize, + boolean autoFlush) { throw new UnsupportedOperationException(); } @@ -157,7 +177,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode @Override public void setAttribute(String name, Object value, int scope) { - switch(scope) { + switch (scope) { case PAGE_SCOPE: { try { environment.setGlobalVariable(name, wrapper.wrap(value)); @@ -263,7 +283,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode @Override public void removeAttribute(String name, int scope) { - switch(scope) { + switch (scope) { case PAGE_SCOPE: { environment.getGlobalNamespace().remove(name); break; @@ -300,11 +320,11 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode @Override public Enumeration getAttributeNamesInScope(int scope) { - switch(scope) { + switch (scope) { case PAGE_SCOPE: { try { - return - new TemplateHashModelExEnumeration(environment.getGlobalNamespace()); + return + new TemplateHashModelExEnumeration(environment.getGlobalNamespace()); } catch (TemplateModelException e) { throw new UndeclaredThrowableException(e); } @@ -347,7 +367,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode public HttpSession getSession() { return getSession(false); } - + @Override public Object getPage() { return servlet; @@ -401,7 +421,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode public PrintWriter getWriter() { return pw; } - + @Override public ServletOutputStream getOutputStream() { throw new UnsupportedOperationException("JSP-included resource must use getWriter()"); @@ -422,13 +442,13 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode @Override public BodyContent pushBody() { - return (BodyContent) pushWriter(new TagTransformModel.BodyContentImpl(getOut(), true)); - } + return (BodyContent) pushWriter(new TagTransformModel.BodyContentImpl(getOut(), true)); + } - @Override -public JspWriter pushBody(Writer w) { - return pushWriter(new JspWriterAdapter(w)); - } + @Override + public JspWriter pushBody(Writer w) { + return pushWriter(new JspWriterAdapter(w)); + } @Override public JspWriter popBody() { @@ -444,35 +464,95 @@ public JspWriter pushBody(Writer w) { } } return null; - } - + } + void popTopTag() { tags.remove(tags.size() - 1); - } + } void popWriter() { jspOut = (JspWriter) outs.remove(outs.size() - 1); setAttribute(OUT, jspOut); } - + void pushTopTag(Object tag) { tags.add(tag); - } - + } + JspWriter pushWriter(JspWriter out) { outs.add(jspOut); jspOut = out; setAttribute(OUT, jspOut); return out; - } - + } + + /** + * Attempts to locate and manufacture an expression evaulator instance. For this to work you <b>must</b> have the + * Apache Commons-EL package in the classpath. If Commons-EL is not available, this method will throw an + * UnsupportedOperationException. + */ + @Override + public ExpressionEvaluator getExpressionEvaluator() { + try { + Class type = ((ClassLoader) AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public Object run() { + return Thread.currentThread().getContextClassLoader(); + } + })).loadClass + ("org.apache.commons.el.ExpressionEvaluatorImpl"); + return (ExpressionEvaluator) type.newInstance(); + } catch (Exception e) { + throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " + + "method to work, you must have downloaded the apache commons-el jar and " + + "made it available in the classpath."); + } + } + + /** + * Returns a variable resolver that will resolve variables by searching through the page scope, request scope, + * session scope and application scope for an attribute with a matching name. + */ + @Override + public VariableResolver getVariableResolver() { + final PageContext ctx = this; + + return new VariableResolver() { + @Override + public Object resolveVariable(String name) throws ELException { + return ctx.findAttribute(name); + } + }; + } + + @Override + public ELContext getELContext() { + if (elContext == null) { + JspApplicationContext jspctx = JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext()); + if (jspctx instanceof FreeMarkerJspApplicationContext) { + elContext = ((FreeMarkerJspApplicationContext) jspctx).createNewELContext(this); + elContext.putContext(JspContext.class, this); + } else { + throw new UnsupportedOperationException( + "Can not create an ELContext using a foreign JspApplicationContext (of class " + + ClassUtil.getShortClassNameOfObject(jspctx) + ").\n" + + "Hint: The cause of this is often that you are trying to use JSTL tags/functions in " + + "FTL. " + + "In that case, know that that's not really suppored, and you are supposed to use FTL " + + "constrcuts instead, like #list instead of JSTL's forEach, etc."); + } + } + return elContext; + } + private static class TemplateHashModelExEnumeration implements Enumeration { private final TemplateModelIterator it; - + private TemplateHashModelExEnumeration(TemplateHashModelEx hashEx) throws TemplateModelException { it = hashEx.keys().iterator(); } - + @Override public boolean hasMoreElements() { try { @@ -481,7 +561,7 @@ public JspWriter pushBody(Writer w) { throw new UndeclaredThrowableException(tme); } } - + @Override public Object nextElement() { try { diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java similarity index 53% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java index 2eed561f..b7fedb97 100644 --- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java +++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java @@ -19,12 +19,21 @@ package freemarker.ext.jsp; +import javax.servlet.jsp.PageContext; -/** - */ -class FreeMarkerJspFactory2 extends FreeMarkerJspFactory { - @Override - protected String getSpecificationVersion() { - return "2.0"; +import freemarker.core.Environment; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; + +class PageContextFactory { + static FreeMarkerPageContext getCurrentPageContext() throws TemplateModelException { + Environment env = Environment.getCurrentEnvironment(); + TemplateModel pageContextModel = env.getGlobalVariable(PageContext.PAGECONTEXT); + if (pageContextModel instanceof FreeMarkerPageContext) { + return (FreeMarkerPageContext) pageContextModel; + } + FreeMarkerPageContext pageContext = new FreeMarkerPageContext(); + env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext); + return pageContext; } -} \ No newline at end of file +} diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html similarity index 100% rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java b/freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java rename to freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java diff --git a/freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java b/freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java rename to freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java similarity index 100% rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java diff --git a/freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld b/freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld rename to freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected] b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected] similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected] rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/[email protected] diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl diff --git a/freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml similarity index 100% rename from freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml rename to freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java deleted file mode 100644 index 51aad6d0..00000000 --- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java +++ /dev/null @@ -1,71 +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 freemarker.ext.jsp; - -import javax.servlet.jsp.PageContext; - -import freemarker.core.Environment; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.utility.UndeclaredThrowableException; - -/** - */ -class PageContextFactory { - private static final Class pageContextImpl = getPageContextImpl(); - - private static Class getPageContextImpl() { - try { - try { - PageContext.class.getMethod("getELContext", (Class[]) null); - return Class.forName("freemarker.ext.jsp._FreeMarkerPageContext21"); - } catch (NoSuchMethodException e1) { - try { - PageContext.class.getMethod("getExpressionEvaluator", (Class[]) null); - return Class.forName("freemarker.ext.jsp._FreeMarkerPageContext2"); - } catch (NoSuchMethodException e2) { - throw new IllegalStateException( - "Since FreeMarker 2.3.24, JSP support requires at least JSP 2.0."); - } - } - } catch (ClassNotFoundException e) { - throw new NoClassDefFoundError(e.getMessage()); - } - } - - static FreeMarkerPageContext getCurrentPageContext() throws TemplateModelException { - Environment env = Environment.getCurrentEnvironment(); - TemplateModel pageContextModel = env.getGlobalVariable(PageContext.PAGECONTEXT); - if (pageContextModel instanceof FreeMarkerPageContext) { - return (FreeMarkerPageContext) pageContextModel; - } - try { - FreeMarkerPageContext pageContext = - (FreeMarkerPageContext) pageContextImpl.newInstance(); - env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext); - return pageContext; - } catch (IllegalAccessException e) { - throw new IllegalAccessError(e.getMessage()); - } catch (InstantiationException e) { - throw new UndeclaredThrowableException(e); - } - } - -} diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java deleted file mode 100644 index d2fa19dc..00000000 --- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java +++ /dev/null @@ -1,97 +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 freemarker.ext.jsp; - -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.el.ELException; -import javax.servlet.jsp.el.ExpressionEvaluator; -import javax.servlet.jsp.el.VariableResolver; - -import freemarker.log.Logger; -import freemarker.template.TemplateModelException; - -/** - * Don't use this class; it's only public to work around Google App Engine Java - * compliance issues. FreeMarker developers only: treat this class as package-visible. - * - * Implementation of PageContext that contains JSP 2.0 specific methods. - */ -public class _FreeMarkerPageContext2 extends FreeMarkerPageContext { - private static final Logger LOG = Logger.getLogger("freemarker.jsp"); - - static { - if (JspFactory.getDefaultFactory() == null) { - JspFactory.setDefaultFactory(new FreeMarkerJspFactory2()); - } - LOG.debug("Using JspFactory implementation class " + - JspFactory.getDefaultFactory().getClass().getName()); - } - - public _FreeMarkerPageContext2() throws TemplateModelException { - super(); - } - - /** - * Attempts to locate and manufacture an expression evaulator instance. For this - * to work you <b>must</b> have the Apache Commons-EL package in the classpath. If - * Commons-EL is not available, this method will throw an UnsupportedOperationException. - */ - @Override - public ExpressionEvaluator getExpressionEvaluator() { - try { - Class type = Thread.currentThread().getContextClassLoader().loadClass - ("org.apache.commons.el.ExpressionEvaluatorImpl"); - return (ExpressionEvaluator) type.newInstance(); - } catch (Exception e) { - throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " + - "method to work, you must have downloaded the apache commons-el jar and " + - "made it available in the classpath."); - } - } - - /** - * Returns a variable resolver that will resolve variables by searching through - * the page scope, request scope, session scope and application scope for an - * attribute with a matching name. - */ - @Override - public VariableResolver getVariableResolver() { - final PageContext ctx = this; - - return new VariableResolver() { - @Override - public Object resolveVariable(String name) throws ELException { - return ctx.findAttribute(name); - } - }; - } - - /** - * Includes the specified path. The flush argument is ignored! - */ - @Override - public void include(String path, boolean flush) throws IOException, ServletException { - super.include(path); - } -} diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java deleted file mode 100644 index d7670c0f..00000000 --- a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java +++ /dev/null @@ -1,51 +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 freemarker.ext.jsp; - -import javax.servlet.ServletContext; -import javax.servlet.jsp.JspApplicationContext; - -/** - */ -class FreeMarkerJspFactory21 extends FreeMarkerJspFactory { - private static final String JSPCTX_KEY = - FreeMarkerJspFactory21.class.getName() + "#jspAppContext"; - - @Override - protected String getSpecificationVersion() { - return "2.1"; - } - - @Override - public JspApplicationContext getJspApplicationContext(ServletContext ctx) { - JspApplicationContext jspctx = (JspApplicationContext) ctx.getAttribute( - JSPCTX_KEY); - if (jspctx == null) { - synchronized (ctx) { - jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY); - if (jspctx == null) { - jspctx = new FreeMarkerJspApplicationContext(); - ctx.setAttribute(JSPCTX_KEY, jspctx); - } - } - } - return jspctx; - } -} \ No newline at end of file diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java deleted file mode 100644 index d99e22cc..00000000 --- a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java +++ /dev/null @@ -1,121 +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 freemarker.ext.jsp; - -import java.security.AccessController; -import java.security.PrivilegedAction; - -import javax.el.ELContext; -import javax.servlet.jsp.JspApplicationContext; -import javax.servlet.jsp.JspContext; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.el.ELException; -import javax.servlet.jsp.el.ExpressionEvaluator; -import javax.servlet.jsp.el.VariableResolver; - -import freemarker.log.Logger; -import freemarker.template.TemplateModelException; -import freemarker.template.utility.ClassUtil; - -/** - * Don't use this class; it's only public to work around Google App Engine Java - * compliance issues. FreeMarker developers only: treat this class as package-visible. - * - * Implementation of PageContext that contains JSP 2.0 and JSP 2.1 specific - * methods. - */ -public class _FreeMarkerPageContext21 extends FreeMarkerPageContext { - private static final Logger LOG = Logger.getLogger("freemarker.jsp"); - - static { - if (JspFactory.getDefaultFactory() == null) { - JspFactory.setDefaultFactory(new FreeMarkerJspFactory21()); - } - LOG.debug("Using JspFactory implementation class " + - JspFactory.getDefaultFactory().getClass().getName()); - } - - public _FreeMarkerPageContext21() throws TemplateModelException { - super(); - } - - /** - * Attempts to locate and manufacture an expression evaulator instance. For this - * to work you <b>must</b> have the Apache Commons-EL package in the classpath. If - * Commons-EL is not available, this method will throw an UnsupportedOperationException. - */ - @Override - public ExpressionEvaluator getExpressionEvaluator() { - try { - Class type = ((ClassLoader) AccessController.doPrivileged( - new PrivilegedAction() { - @Override - public Object run() { - return Thread.currentThread().getContextClassLoader(); - } - })).loadClass - ("org.apache.commons.el.ExpressionEvaluatorImpl"); - return (ExpressionEvaluator) type.newInstance(); - } catch (Exception e) { - throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " + - "method to work, you must have downloaded the apache commons-el jar and " + - "made it available in the classpath."); - } - } - - /** - * Returns a variable resolver that will resolve variables by searching through - * the page scope, request scope, session scope and application scope for an - * attribute with a matching name. - */ - @Override - public VariableResolver getVariableResolver() { - final PageContext ctx = this; - - return new VariableResolver() { - @Override - public Object resolveVariable(String name) throws ELException { - return ctx.findAttribute(name); - } - }; - } - - private ELContext elContext; - - @Override - public ELContext getELContext() { - if (elContext == null) { - JspApplicationContext jspctx = JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext()); - if (jspctx instanceof FreeMarkerJspApplicationContext) { - elContext = ((FreeMarkerJspApplicationContext) jspctx).createNewELContext(this); - elContext.putContext(JspContext.class, this); - } else { - throw new UnsupportedOperationException( - "Can not create an ELContext using a foreign JspApplicationContext (of class " - + ClassUtil.getShortClassNameOfObject(jspctx) + ").\n" + - "Hint: The cause of this is often that you are trying to use JSTL tags/functions in FTL. " - + "In that case, know that that's not really suppored, and you are supposed to use FTL " - + "constrcuts instead, like #list instead of JSTL's forEach, etc."); - } - } - return elContext; - } -} diff --git a/freemarker-manual/src/main/docgen/en_US/book.xml b/freemarker-manual/src/main/docgen/en_US/book.xml index fce81f36..9d184e00 100644 --- a/freemarker-manual/src/main/docgen/en_US/book.xml +++ b/freemarker-manual/src/main/docgen/en_US/book.xml @@ -30097,7 +30097,10 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> <para>Release date: [TODO]</para> <para>Please note that with this version the minimum required Java - version was increased from Java 7 to Java 8.</para> + version was increased from Java 7 to Java 8. Also for the few who + relly on Servlet and/or JSP support, the minimum is now increased to + Servlet 3.0, and JSP 2.2 (which are still very old versions from + 2011).</para> <section> <title>Changes on the FTL side</title> @@ -30301,6 +30304,26 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> </listitem> </itemizedlist> </listitem> + + <listitem> + <para>Minimum requirements were increased:</para> + + <itemizedlist> + <listitem> + <para>Java 8 (or higher)</para> + </listitem> + + <listitem> + <para>If Servlet-related features are used, Servlet 3.0 (or + higher)</para> + </listitem> + + <listitem> + <para>If JSP-related features are used, JSP 2.2 (or + higher)</para> + </listitem> + </itemizedlist> + </listitem> </itemizedlist> </section> </section>
