Hello,

Have an issue on Tomcat 7.0.55 on Windows XP, where Tomcat refuses to
compile a JSP if a primitive variable of type "long" or "double" references
a session attribute, but the variable is never used. Below are three
scenarios for type "long". The issue can be regenerated on a fresh extract
of Tomcat 7.0.55 archive.

Tomcat version: 7.0.55

Java version: jdk1.7.0_67

OS: WinXP


Note-1: The issue applies for "long" and "double"; but NOT for "int" and
"float".

Note-2: The issue does not persist if the variables, though primitive and
never used, are assigned to literals, as in (long v1 = 1L;)


First Scenario (works):

- Both variables are of "primitive" type long

- Both variables are used

- Tomcat generates both JAVA and CLASS files of JSP

- No exceptions are raised on requests.

session.setAttribute("v1", 1L);

session.setAttribute("v2", 2L);

long v1 = (Long) session.getAttribute("v1");

long v2 = (Long) session.getAttribute("v2");          //<-- Primitive

out.write(String.valueOf(v1));

out.write(String.valueOf(v2));


Second Scenario (does not work):

- Both variables are of "primitive" type long

- One variable is used, "the other is not used"

- Tomcat generates JAVA file, "but not the CLASS file"

- An exception is raised (see at the end)

session.setAttribute("v1", 1L);

session.setAttribute("v2", 2L);

long v1 = (Long) session.getAttribute("v1");

long v2 = (Long) session.getAttribute("v2");          //<-- Primitive

out.write(String.valueOf(v1));

*//*out.write(String.valueOf(v2)); //<-- commented


Third Scenario (works):

- Both variables are of type long, "using Wrapper class"

- Don't care if any of the variables is used or not

- Tomcat generates both JAVA and CLASS files of JSP

- No exceptions are raised

session.setAttribute("v1", 1L);

session.setAttribute("v2", 2L);

Long v1 = (Long) session.getAttribute("v1");

Long v2 = (Long) session.getAttribute("v2"); //<-- Wrapper

out.write(String.valueOf(v1));

//out.write(String.valueOf(v2)); //<-- commented


To try the above tests, just extract tomcat's archive (*as-is*) and add a
simple webapp with one JSP file containing one of the scenarios listed
below, and try to access the JSP page.


As for the raised exception:

Oct 21, 2014 4:57:48 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/test]
threw exception [org.apache.jasper.JasperException: Unable to compile class
for JSP] with root cause
java.lang.ArrayIndexOutOfBoundsException: -1
at
org.eclipse.jdt.internal.compiler.codegen.StackMapFrame.addStackItem(StackMapFrame.java:92)
at org.eclipse.jdt.internal.compiler.ClassFile.traverse(ClassFile.java:5544)
at
org.eclipse.jdt.internal.compiler.ClassFile.generateStackMapTableAttribute(ClassFile.java:4303)
at
org.eclipse.jdt.internal.compiler.ClassFile.completeCodeAttribute(ClassFile.java:1378)
at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:338)
at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:270)
at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:566)
at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:635)
at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.generateCode(CompilationUnitDeclaration.java:368)
at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:781)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:470)
at
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:466)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2440)
at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2429)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Best Regards,

Nasry Al-Haddad

Reply via email to