This is an automated email from the ASF dual-hosted git repository.
ddekany pushed a commit to branch 3
in repository https://gitbox.apache.org/repos/asf/freemarker.git
The following commit(s) were added to refs/heads/3 by this push:
new e78dac12 Forward ported from 2.3-gae: Cleanups coming from "Dropped
support for very old Servlet and JSP versions"
e78dac12 is described below
commit e78dac1288a536d2cef1e9de2ffe703505a303ac
Author: ddekany <[email protected]>
AuthorDate: Mon Dec 25 19:34:50 2023 +0100
Forward ported from 2.3-gae: Cleanups coming from "Dropped support for very
old Servlet and JSP versions"
---
freemarker-servlet/build.gradle.kts | 4 +-
.../servlet/jsp/FreeMarkerJspFactory.java | 27 +++-
.../servlet/jsp/FreeMarkerJspFactory21.java | 51 --------
.../servlet/jsp/FreeMarkerPageContext.java | 138 +++++++++++++++------
.../freemarker/servlet/jsp/PageContextFactory.java | 34 +----
.../servlet/jsp/_FreeMarkerPageContext21.java | 122 ------------------
6 files changed, 130 insertions(+), 246 deletions(-)
diff --git a/freemarker-servlet/build.gradle.kts
b/freemarker-servlet/build.gradle.kts
index b3e51e38..496faf3b 100644
--- a/freemarker-servlet/build.gradle.kts
+++ b/freemarker-servlet/build.gradle.kts
@@ -36,7 +36,7 @@ dependencies {
// Servlet, JSP, and EL related classes
compileOnly("javax.servlet:javax.servlet-api:3.1.0")
compileOnly("javax.servlet.jsp:javax.servlet.jsp-api:2.3.3")
- compileOnly("javax.el:javax.el-api:3.0.0") // EL is not included in
jsp-api anymore (was there in jsp-api 2.1)
+ compileOnly("javax.el:javax.el-api:3.0.0")
// Chose the Jetty version very carefully, as it should implement the same
Servlet API, JSP API, and EL API
// than what we declare above, because the same classes will come from
Jetty as well. For example, Jetty depends
@@ -49,7 +49,7 @@ dependencies {
testImplementation("org.eclipse.jetty:jetty-webapp:$jettyVersion")
testImplementation("org.eclipse.jetty:jetty-util:$jettyVersion")
testImplementation("org.eclipse.jetty:apache-jsp:$jettyVersion")
- // Jetty also contains the servlet-api and jsp-api classes
+ // Jetty also contains the servlet-api and jsp-api and el-api classes
// JSP JSTL (not included in Jetty):
val apacheStandardTaglibsVersion = "1.2.5"
diff --git
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
index 4c6d363b..1aa566af 100644
---
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
+++
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
@@ -20,16 +20,23 @@
package org.apache.freemarker.servlet.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 JSPCTX_KEY =
+ FreeMarkerJspFactory.class.getName() + "#jspAppContext";
+
+ protected String getSpecificationVersion() {
+ return "2.1";
+ }
@Override
public JspEngineInfo getEngineInfo() {
@@ -41,6 +48,22 @@ abstract class FreeMarkerJspFactory extends JspFactory {
};
}
+ @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;
+ }
+
@Override
public PageContext getPageContext(Servlet servlet, ServletRequest request,
ServletResponse response, String errorPageURL,
diff --git
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory21.java
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory21.java
deleted file mode 100644
index d48b86b8..00000000
---
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/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 org.apache.freemarker.servlet.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-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
index b2a22ff8..f7a5d882 100644
---
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
+++
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
@@ -20,50 +20,38 @@
package org.apache.freemarker.servlet.jsp;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import javax.servlet.http.HttpSession;
-import javax.servlet.jsp.JspWriter;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.tagext.BodyContent;
-
import org.apache.freemarker.core.Environment;
import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.ObjectWrappingException;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelIterator;
-import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.core.model.*;
import org.apache.freemarker.core.util.UndeclaredThrowableException;
+import org.apache.freemarker.core.util._ClassUtils;
import org.apache.freemarker.servlet.FreemarkerServlet;
import org.apache.freemarker.servlet.HttpRequestHashModel;
import org.apache.freemarker.servlet.ServletContextHashModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.el.ELContext;
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.*;
+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 java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.*;
+
+class FreeMarkerPageContext extends PageContext implements TemplateModel {
+ private static final Logger LOG =
LoggerFactory.getLogger(FreeMarkerPageContext.class);
-/**
- */
-abstract class FreeMarkerPageContext extends PageContext implements
TemplateModel {
- private static final Class OBJECT_CLASS = Object.class;
-
private final Environment environment;
private List tags = new ArrayList();
private List outs = new ArrayList();
@@ -73,7 +61,15 @@ abstract class FreeMarkerPageContext extends PageContext
implements TemplateMode
private final HttpServletResponse response;
private final ObjectWrapperAndUnwrapper wrapper;
private JspWriter jspOut;
-
+
+ static {
+ if (JspFactory.getDefaultFactory() == null) {
+ JspFactory.setDefaultFactory(new FreeMarkerJspFactory());
+ }
+ LOG.debug("Using JspFactory implementation class {}",
+ JspFactory.getDefaultFactory().getClass().getName());
+ }
+
protected FreeMarkerPageContext() throws TemplateException {
environment = Environment.getCurrentEnvironment();
@@ -431,8 +427,70 @@ public JspWriter pushBody(Writer w) {
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);
+ }
+ };
+ }
+
+ 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 invoke an ELContext using a foreign
JspApplicationContext (of class "
+ +
_ClassUtils.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;
diff --git
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
index 67e867e4..9cfb0df2 100644
---
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
+++
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
@@ -19,48 +19,24 @@
package org.apache.freemarker.servlet.jsp;
-import javax.servlet.jsp.PageContext;
-
import org.apache.freemarker.core.Environment;
import org.apache.freemarker.core.TemplateException;
import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.util.UndeclaredThrowableException;
+
+import javax.servlet.jsp.PageContext;
/**
*/
class PageContextFactory {
- private static final Class pageContextImpl = getPageContextImpl();
-
- private static Class getPageContextImpl() {
- try {
- try {
- PageContext.class.getMethod("getELContext", (Class[]) null);
- return
Class.forName("org.apache.freemarker.servlet.jsp._FreeMarkerPageContext21");
- } catch (NoSuchMethodException e1) {
- throw new IllegalStateException(
- "Since FreeMarker 3.0.0, JSP support requires at least
JSP 2.1.");
- }
- } catch (ClassNotFoundException e) {
- throw new NoClassDefFoundError(e.getMessage());
- }
- }
-
static FreeMarkerPageContext getCurrentPageContext() throws
TemplateException {
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);
- }
+ FreeMarkerPageContext pageContext = new FreeMarkerPageContext();
+ env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext);
+ return pageContext;
}
}
diff --git
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
deleted file mode 100644
index 674fa56a..00000000
---
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
+++ /dev/null
@@ -1,122 +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.servlet.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 org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.util._ClassUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 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 all JSP 2.1 methods.
- */
-public class _FreeMarkerPageContext21 extends FreeMarkerPageContext {
-
- private static final Logger LOG =
LoggerFactory.getLogger(_FreeMarkerPageContext21.class);
-
- static {
- if (JspFactory.getDefaultFactory() == null) {
- JspFactory.setDefaultFactory(new FreeMarkerJspFactory21());
- }
- LOG.debug("Using JspFactory implementation class {}",
- JspFactory.getDefaultFactory().getClass().getName());
- }
-
- public _FreeMarkerPageContext21() throws TemplateException {
- 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 invoke an ELContext using a foreign
JspApplicationContext (of class "
- + _ClassUtils.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;
- }
-}