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;
-    }
-}

Reply via email to