Uploaded image for project: 'Sling'
  1. Sling
  2. SLING-6458

JSP scripting does not support Java 8 features (lambdas, method references, etc)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Scripting JSP 2.0.28, Scripting JSP 2.1.0, Scripting JSP 2.1.4, Scripting JSP 2.1.6, Scripting JSP 2.1.8, Scripting JSP 2.2.0, Scripting JSP 2.2.2, Scripting JSP 2.2.4
    • Scripting JSP 2.2.6
    • Scripting
    • None

    Description

      When trying to use Java 8 functionality in a JSP file, the Jasper framework in the Sling Scripting bundle fails to compile the JSP file. It seems to get stuck on a Java 8 feature: Lambdas.

      <%@page session="false" %>
      <%@ page import="java.util.stream.IntStream" %>
      <%@ page import="java.io.IOException" %>
      <%
          out.println("Lambda test");
          IntStream leip = IntStream.of(1, 2, 3, 4, 5, 6);
          final JspWriter out2 = out;
          leip.forEach(x -> {
              try {
                  out2.println(x);
              } catch (IOException e) {
                  // Intentionally do nothing
              }
          });
      %>
      

      When we remove the complete "leip.forEach" statement, the code compiles and executes successfully.

      Upon further investigation, I found out that the Jasper compiler that is being used, does not have support for "tag 18", which seems to be the lambda feature in Java 8.
      I could find the constant pool tags over here: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4-140
      Clearly, there is no support for MethodHandle, MethodType, InvokeDynamic.

      I could find a bug report for Tomcat (where Jasper is developed) over here: https://bz.apache.org/bugzilla/show_bug.cgi?id=54475
      It seems that the issue was fixed in a newer version of Jasper, namely 6.0.40. We are currently using 6.0.14 (which is in Apache Sling Scripting JSP version bundle version 2.1.4).

      I tried looking at https://mvnrepository.com/artifact/org.apache.sling/org.apache.sling.scripting.jsp but for some reason all newer versions are also embedding Jasper 6.0.14 (which does not support Java 8) and in the custom code inside that bundle I also do not see any cases for 18 in the switch statement in SmapUtil$SDEInstaller.copyConstantPool. Nor do I see any traces that look like this fix: https://bz.apache.org/bugzilla/attachment.cgi?id=31416&action=diff

      See below a stacktrace of what's happening:

      12.01.2017 14:39:19.063 *ERROR* [144.119.190.210 [1484228359038] POST /content/page/sign-up.html HTTP/1.1] org.apache.sling.servlets.get.impl.DefaultGetServlet No renderer for extension html, cannot render resource ResourceWrapper, type=test/components/form/actions/register, path=/content/page/sign-up/jcr:content/par/start, resource=[JcrNodeResource, type=foundation/components/form/start, superType=null, path=/content/page/sign-up/jcr:content/par/start]
      12.01.2017 14:39:19.079 *ERROR* [144.119.190.210 [1484228359038] POST /content/page/sign-up.html HTTP/1.1] com.day.cq.wcm.tags.IncludeTag Error while executing script /apps/test/components/form/actions/register/post.POST.jsp org.apache.sling.api.scripting.ScriptEvaluationException: org.apache.sling.scripting.jsp.jasper.JasperException: Unable to compile class for JSP
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:388)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.eval(DefaultSlingScript.java:171)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:463)
              at com.day.cq.wcm.tags.IncludeTag.includeScript(IncludeTag.java:167)
              at com.day.cq.wcm.tags.IncludeTag.doEndTag(IncludeTag.java:87)
              at org.apache.sling.scripting.jsp.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:502)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:449)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory.callJsp(JspScriptEngineFactory.java:281)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory.access$100(JspScriptEngineFactory.java:102)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory$JspScriptEngine.eval(JspScriptEngineFactory.java:524)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:361)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.eval(DefaultSlingScript.java:171)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:463)
              at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:508)
              at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:45)
      		... filters ommitted for brevity ...
              at com.day.j2ee.servletengine.RequestDispatcherImpl.doFilter(RequestDispatcherImpl.java:321)
              at com.day.j2ee.servletengine.RequestDispatcherImpl.service(RequestDispatcherImpl.java:340)
              at com.day.j2ee.servletengine.RequestDispatcherImpl.service(RequestDispatcherImpl.java:383)
              at com.day.j2ee.servletengine.ServletHandlerImpl.process(ServletHandlerImpl.java:335)
              at com.day.j2ee.servletengine.HttpListener$Worker.run(HttpListener.java:644)
              at java.lang.Thread.run(Thread.java:745)
      Caused by: org.apache.sling.api.SlingException: org.apache.sling.scripting.jsp.jasper.JasperException: Unable to compile class for JSP
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspExceptionInternal(JspServletWrapper.java:691)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:608)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:525)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:449)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory.callJsp(JspScriptEngineFactory.java:281)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory.access$100(JspScriptEngineFactory.java:102)
              at org.apache.sling.scripting.jsp.JspScriptEngineFactory$JspScriptEngine.eval(JspScriptEngineFactory.java:524)
              at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:361)
              ... 121 more
      Caused by: java.io.IOException: unexpected tag: 18
              at org.apache.sling.scripting.jsp.jasper.compiler.SmapUtil$SDEInstaller.copyConstantPool(SmapUtil.java:491)
              at org.apache.sling.scripting.jsp.jasper.compiler.SmapUtil$SDEInstaller.addSDE(SmapUtil.java:308)
              at org.apache.sling.scripting.jsp.jasper.compiler.SmapUtil$SDEInstaller.<init>(SmapUtil.java:264)
              at org.apache.sling.scripting.jsp.jasper.compiler.SmapUtil$SDEInstaller.install(SmapUtil.java:243)
              at org.apache.sling.scripting.jsp.jasper.compiler.SmapUtil.installSmap(SmapUtil.java:167)
              at org.apache.sling.scripting.jsp.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:151)
              at org.apache.sling.scripting.jsp.jasper.compiler.Compiler.compile(Compiler.java:312)
              at org.apache.sling.scripting.jsp.jasper.compiler.Compiler.compile(Compiler.java:290)
              at org.apache.sling.scripting.jsp.jasper.compiler.Compiler.compile(Compiler.java:277)
              at org.apache.sling.scripting.jsp.jasper.JspCompilationContext.compile(JspCompilationContext.java:501)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.prepareServlet(JspServletWrapper.java:427)
              at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:486)
              ... 126 more
      

      Attachments

        Activity

          People

            cziegeler Carsten Ziegeler
            Henry Kuijpers Henry Kuijpers
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: