Hi, It should be available in the next Tomcat release (in fact it was included in a not-released Tomcat 6.0.15) No idea when the next GA release be available.
Regards, Lucas On Jan 8, 2008 12:18 PM, Jair da Silva Ferreira Jr <[EMAIL PROTECTED]> wrote: > Hi, > Thank you very much for your reply. > Is this fix going to be available in the next Tomcat version? Do you > know when the next version will be released? > Thank you very much. > > Sincerely, > Jair Jr > > Lucas Galfaso escreveu: > > > Hi, > > This is a known issue is Tomcat 6.0.14, it was reported using > > http://issues.apache.org/bugzilla/show_bug.cgi?id=42693 and it is > > fixed in the trunk. > > > > Regards, > > lg > > > > On Jan 6, 2008 1:50 PM, Jair da Silva Ferreira Jr <[EMAIL PROTECTED]> wrote: > > > >> Hi, > >> I am experiencing a problem with recursivity in tag files in tomcat > >> 6.0.14. I developed a simple tag file to show you the problem. > >> Here is my tag file: > >> > >> <%@ tag body-content="empty" %> > >> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> > >> <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %> > >> > >> <%@ attribute name="number" required="true" type="java.lang.Integer" %> > >> <c:choose> > >> <c:when test="${number==0 || number==1}">1</c:when> > >> <c:otherwise>${number}*<t:factorial > >> number="${number-1}"/></c:otherwise> > >> </c:choose> > >> > >> The tag file is pretty simple. When called from a jsp file, the tag > >> outputs how the factorial of any given number is calculated, but it > >> doen't actually calculate the factorial result. For example: if the > >> "number" paramenter is 5, the tag will output 5*4*3*2*1. > >> Here is the portion of the jsp file that calls the tag: > >> <c:if test="${! empty param.number}"> > >> Result: <t:factorial number="${param.number}"/> > >> </c:if> > >> > >> The problem is that nothing is displayed when the tag is called form > >> a jsp file. It happens as if the tag is not being called at all or as if > >> it is an empty tag file. > >> After some work I found out the problem. Jasper is not correctly > >> converting my recursive tag file to java code. The resulting java file > >> found in tomcat's work directory has an empty doTag method. Here is the > >> doTag method: > >> public void doTag() throws JspException, java.io.IOException { > >> } > >> > >> I've checked all tomcat logs and couldn't find any jasper error > >> message. > >> I've run the same web application in two different systems and the > >> problem only happens in system 2. Here is the configuration: > >> > >> System 1 (development machine) (problem does not happen): > >> - OS: Windows XP sp2 > >> - Hardware: AMD Athlon XP 2400+ (2.03 GHz) (1,5 GB RAM) > >> - Java (as stated by "java -version" command): > >> java version "1.6.0_03" > >> Java(TM) SE Runtime Environment (build 1.6.0_03-b05) > >> Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, > >> sharing) > >> - Tomcat version: 6.0.14 (.zip download package) > >> System 2 (production machine) (problem happens): > >> - OS: Ubuntu linux 7.10 (codename gutsy) > >> - Hardware: HP Tower Computer ProLiant ML350 G5, Intel(R) > >> Xeon(R) CPU 5120 @ 1.86GHz, 4 GB RAM > >> - Java (as stated by "java -version" command): > >> java version "1.6.0_03" > >> Java(TM) SE Runtime Environment (build 1.6.0_03-b05) > >> Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode) > >> - Tomcat version: 6.0.14 (.tar.gz download package) > >> > >> I am sending you my factorial example web application. The file is > >> recursive-tag.war. The application only has 2 files: index.jsp and > >> factorial.tag. > >> I am also sending you 2 jasper generated .java files extracted from > >> the tomcat work directory. "system1_factorial_tag.java" is generated in > >> the system 1 configuration and "system2_factorial_tag.java" is generated > >> in the system 2 configuration. Please, notice that the "doTag" method is > >> empty in "system2_factorial_tag.java". > >> Please, can anyone help me with this problem? Am I doing something > >> wrong? > >> Thank you very much. > >> > >> Sincerely, > >> Jair Jr > >> > >> package org.apache.jsp.tag.web; > >> > >> import javax.servlet.*; > >> import javax.servlet.http.*; > >> import javax.servlet.jsp.*; > >> > >> public final class factorial_tag > >> extends javax.servlet.jsp.tagext.SimpleTagSupport > >> implements org.apache.jasper.runtime.JspSourceDependent { > >> > >> > >> private static final JspFactory _jspxFactory = > >> JspFactory.getDefaultFactory(); > >> > >> private static java.util.List _jspx_dependants; > >> > >> private JspContext jspContext; > >> private java.io.Writer _jspx_sout; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fchoose; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fotherwise; > >> > >> private javax.el.ExpressionFactory _el_expressionfactory; > >> private org.apache.AnnotationProcessor _jsp_annotationprocessor; > >> > >> public void setJspContext(JspContext ctx) { > >> super.setJspContext(ctx); > >> java.util.ArrayList _jspx_nested = null; > >> java.util.ArrayList _jspx_at_begin = null; > >> java.util.ArrayList _jspx_at_end = null; > >> this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, > >> _jspx_nested, _jspx_at_begin, _jspx_at_end, null); > >> } > >> > >> public JspContext getJspContext() { > >> return this.jspContext; > >> } > >> private java.lang.Integer number; > >> > >> public java.lang.Integer getNumber() { > >> return this.number; > >> } > >> > >> public void setNumber(java.lang.Integer number) { > >> this.number = number; > >> jspContext.setAttribute("number", number); > >> } > >> > >> public Object getDependants() { > >> return _jspx_dependants; > >> } > >> > >> private void _jspInit(ServletConfig config) { > >> _005fjspx_005ftagPool_005fc_005fchoose = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _005fjspx_005ftagPool_005fc_005fotherwise = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _el_expressionfactory = > >> _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory(); > >> _jsp_annotationprocessor = (org.apache.AnnotationProcessor) > >> config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); > >> } > >> > >> public void _jspDestroy() { > >> _005fjspx_005ftagPool_005fc_005fchoose.release(); > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest.release(); > >> _005fjspx_005ftagPool_005fc_005fotherwise.release(); > >> } > >> > >> public void doTag() throws JspException, java.io.IOException { > >> PageContext _jspx_page_context = (PageContext)jspContext; > >> HttpServletRequest request = (HttpServletRequest) > >> _jspx_page_context.getRequest(); > >> HttpServletResponse response = (HttpServletResponse) > >> _jspx_page_context.getResponse(); > >> HttpSession session = _jspx_page_context.getSession(); > >> ServletContext application = _jspx_page_context.getServletContext(); > >> ServletConfig config = _jspx_page_context.getServletConfig(); > >> JspWriter out = jspContext.getOut(); > >> _jspInit(config); > >> jspContext.getELContext().putContext(JspContext.class,jspContext); > >> if( getNumber() != null ) > >> _jspx_page_context.setAttribute("number", getNumber()); > >> > >> try { > >> out.write("\r\n"); > >> out.write("\r\n"); > >> out.write("\r\n"); > >> out.write("\r\n"); > >> out.write("\r\n"); > >> if (_jspx_meth_c_005fchoose_005f0(_jspx_page_context)) > >> return; > >> } catch( Throwable t ) { > >> if( t instanceof SkipPageException ) > >> throw (SkipPageException) t; > >> if( t instanceof java.io.IOException ) > >> throw (java.io.IOException) t; > >> if( t instanceof IllegalStateException ) > >> throw (IllegalStateException) t; > >> if( t instanceof JspException ) > >> throw (JspException) t; > >> throw new JspException(t); > >> } finally { > >> > >> jspContext.getELContext().putContext(JspContext.class,super.getJspContext()); > >> ((org.apache.jasper.runtime.JspContextWrapper) > >> jspContext).syncEndTagFile(); > >> _jspDestroy(); > >> } > >> } > >> > >> private boolean _jspx_meth_c_005fchoose_005f0(PageContext > >> _jspx_page_context) > >> throws Throwable { > >> JspWriter out = _jspx_page_context.getOut(); > >> // c:choose > >> org.apache.taglibs.standard.tag.common.core.ChooseTag > >> _jspx_th_c_005fchoose_005f0 = > >> (org.apache.taglibs.standard.tag.common.core.ChooseTag) > >> _005fjspx_005ftagPool_005fc_005fchoose.get(org.apache.taglibs.standard.tag.common.core.ChooseTag.class); > >> _jspx_th_c_005fchoose_005f0.setPageContext(_jspx_page_context); > >> _jspx_th_c_005fchoose_005f0.setParent(new > >> javax.servlet.jsp.tagext.TagAdapter((javax.servlet.jsp.tagext.SimpleTag) > >> this )); int _jspx_eval_c_005fchoose_005f0 = > >> _jspx_th_c_005fchoose_005f0.doStartTag(); > >> if (_jspx_eval_c_005fchoose_005f0 != > >> javax.servlet.jsp.tagext.Tag.SKIP_BODY) { > >> do { > >> out.write('\r'); > >> out.write('\n'); > >> out.write(' '); > >> if (_jspx_meth_c_005fwhen_005f0(_jspx_th_c_005fchoose_005f0, > >> _jspx_page_context)) > >> return true; > >> out.write('\r'); > >> out.write('\n'); > >> out.write(' '); > >> if (_jspx_meth_c_005fotherwise_005f0(_jspx_th_c_005fchoose_005f0, > >> _jspx_page_context)) > >> return true; > >> out.write('\r'); > >> out.write('\n'); > >> int evalDoAfterBody = _jspx_th_c_005fchoose_005f0.doAfterBody(); > >> if (evalDoAfterBody != > >> javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) > >> break; > >> } while (true); > >> } > >> if (_jspx_th_c_005fchoose_005f0.doEndTag() == > >> javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { > >> > >> _005fjspx_005ftagPool_005fc_005fchoose.reuse(_jspx_th_c_005fchoose_005f0); > >> throw new SkipPageException(); > >> } > >> > >> _005fjspx_005ftagPool_005fc_005fchoose.reuse(_jspx_th_c_005fchoose_005f0); > >> return false; > >> } > >> > >> private boolean > >> _jspx_meth_c_005fwhen_005f0(javax.servlet.jsp.tagext.JspTag > >> _jspx_th_c_005fchoose_005f0, PageContext _jspx_page_context) > >> throws Throwable { > >> JspWriter out = _jspx_page_context.getOut(); > >> // c:when > >> org.apache.taglibs.standard.tag.rt.core.WhenTag > >> _jspx_th_c_005fwhen_005f0 = > >> (org.apache.taglibs.standard.tag.rt.core.WhenTag) > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest.get(org.apache.taglibs.standard.tag.rt.core.WhenTag.class); > >> _jspx_th_c_005fwhen_005f0.setPageContext(_jspx_page_context); > >> _jspx_th_c_005fwhen_005f0.setParent((javax.servlet.jsp.tagext.Tag) > >> _jspx_th_c_005fchoose_005f0); > >> // /WEB-INF/tags/factorial.tag(7,1) name = test type = boolean reqTime > >> = true required = true fragment = false deferredValue = false > >> expectedTypeName = null deferredMethod = false methodSignature = null > >> _jspx_th_c_005fwhen_005f0.setTest(((java.lang.Boolean) > >> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number==0 > >> || number==1}", java.lang.Boolean.class, > >> (PageContext)this.getJspContext(), null, false)).booleanValue()); > >> int _jspx_eval_c_005fwhen_005f0 = > >> _jspx_th_c_005fwhen_005f0.doStartTag(); > >> if (_jspx_eval_c_005fwhen_005f0 != > >> javax.servlet.jsp.tagext.Tag.SKIP_BODY) { > >> do { > >> out.write('1'); > >> int evalDoAfterBody = _jspx_th_c_005fwhen_005f0.doAfterBody(); > >> if (evalDoAfterBody != > >> javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) > >> break; > >> } while (true); > >> } > >> if (_jspx_th_c_005fwhen_005f0.doEndTag() == > >> javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { > >> > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest.reuse(_jspx_th_c_005fwhen_005f0); > >> throw new SkipPageException(); > >> } > >> > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest.reuse(_jspx_th_c_005fwhen_005f0); > >> return false; > >> } > >> > >> private boolean > >> _jspx_meth_c_005fotherwise_005f0(javax.servlet.jsp.tagext.JspTag > >> _jspx_th_c_005fchoose_005f0, PageContext _jspx_page_context) > >> throws Throwable { > >> JspWriter out = _jspx_page_context.getOut(); > >> // c:otherwise > >> org.apache.taglibs.standard.tag.common.core.OtherwiseTag > >> _jspx_th_c_005fotherwise_005f0 = > >> (org.apache.taglibs.standard.tag.common.core.OtherwiseTag) > >> _005fjspx_005ftagPool_005fc_005fotherwise.get(org.apache.taglibs.standard.tag.common.core.OtherwiseTag.class); > >> _jspx_th_c_005fotherwise_005f0.setPageContext(_jspx_page_context); > >> > >> _jspx_th_c_005fotherwise_005f0.setParent((javax.servlet.jsp.tagext.Tag) > >> _jspx_th_c_005fchoose_005f0); > >> int _jspx_eval_c_005fotherwise_005f0 = > >> _jspx_th_c_005fotherwise_005f0.doStartTag(); > >> if (_jspx_eval_c_005fotherwise_005f0 != > >> javax.servlet.jsp.tagext.Tag.SKIP_BODY) { > >> do { > >> out.write((java.lang.String) > >> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number}", > >> java.lang.String.class, (PageContext)this.getJspContext(), null, false)); > >> out.write('*'); > >> if > >> (_jspx_meth_t_005ffactorial_005f0(_jspx_th_c_005fotherwise_005f0, > >> _jspx_page_context)) > >> return true; > >> int evalDoAfterBody = _jspx_th_c_005fotherwise_005f0.doAfterBody(); > >> if (evalDoAfterBody != > >> javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN) > >> break; > >> } while (true); > >> } > >> if (_jspx_th_c_005fotherwise_005f0.doEndTag() == > >> javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { > >> > >> _005fjspx_005ftagPool_005fc_005fotherwise.reuse(_jspx_th_c_005fotherwise_005f0); > >> throw new SkipPageException(); > >> } > >> > >> _005fjspx_005ftagPool_005fc_005fotherwise.reuse(_jspx_th_c_005fotherwise_005f0); > >> return false; > >> } > >> > >> private boolean > >> _jspx_meth_t_005ffactorial_005f0(javax.servlet.jsp.tagext.JspTag > >> _jspx_th_c_005fotherwise_005f0, PageContext _jspx_page_context) > >> throws Throwable { > >> JspWriter out = _jspx_page_context.getOut(); > >> // t:factorial > >> org.apache.jsp.tag.web.factorial_tag _jspx_th_t_005ffactorial_005f0 = > >> new org.apache.jsp.tag.web.factorial_tag(); > >> > >> org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, > >> _jspx_th_t_005ffactorial_005f0); > >> _jspx_th_t_005ffactorial_005f0.setJspContext(_jspx_page_context); > >> > >> _jspx_th_t_005ffactorial_005f0.setParent(_jspx_th_c_005fotherwise_005f0); > >> // /WEB-INF/tags/factorial.tag(8,24) name = number type = > >> java.lang.Integer reqTime = true required = true fragment = false > >> deferredValue = false expectedTypeName = java.lang.String deferredMethod = > >> false methodSignature = null > >> _jspx_th_t_005ffactorial_005f0.setNumber((java.lang.Integer) > >> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${number-1}", > >> java.lang.Integer.class, (PageContext)this.getJspContext(), null, false)); > >> _jspx_th_t_005ffactorial_005f0.doTag(); > >> > >> org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, > >> _jspx_th_t_005ffactorial_005f0); > >> return false; > >> } > >> } > >> > >> package org.apache.jsp.tag.web; > >> > >> import javax.servlet.*; > >> import javax.servlet.http.*; > >> import javax.servlet.jsp.*; > >> > >> public final class factorial_tag > >> extends javax.servlet.jsp.tagext.SimpleTagSupport > >> implements org.apache.jasper.runtime.JspSourceDependent { > >> > >> > >> private static final JspFactory _jspxFactory = > >> JspFactory.getDefaultFactory(); > >> > >> private static java.util.List _jspx_dependants; > >> > >> private JspContext jspContext; > >> private java.io.Writer _jspx_sout; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fchoose; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest; > >> private org.apache.jasper.runtime.TagHandlerPool > >> _005fjspx_005ftagPool_005fc_005fotherwise; > >> > >> private javax.el.ExpressionFactory _el_expressionfactory; > >> private org.apache.AnnotationProcessor _jsp_annotationprocessor; > >> > >> public void setJspContext(JspContext ctx) { > >> super.setJspContext(ctx); > >> java.util.ArrayList _jspx_nested = null; > >> java.util.ArrayList _jspx_at_begin = null; > >> java.util.ArrayList _jspx_at_end = null; > >> this.jspContext = new org.apache.jasper.runtime.JspContextWrapper(ctx, > >> _jspx_nested, _jspx_at_begin, _jspx_at_end, null); > >> } > >> > >> public JspContext getJspContext() { > >> return this.jspContext; > >> } > >> private java.lang.Integer number; > >> > >> public java.lang.Integer getNumber() { > >> return this.number; > >> } > >> > >> public void setNumber(java.lang.Integer number) { > >> this.number = number; > >> jspContext.setAttribute("number", number); > >> } > >> > >> public Object getDependants() { > >> return _jspx_dependants; > >> } > >> > >> private void _jspInit(ServletConfig config) { > >> _005fjspx_005ftagPool_005fc_005fchoose = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _005fjspx_005ftagPool_005fc_005fotherwise = > >> org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(config); > >> _el_expressionfactory = > >> _jspxFactory.getJspApplicationContext(config.getServletContext()).getExpressionFactory(); > >> _jsp_annotationprocessor = (org.apache.AnnotationProcessor) > >> config.getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName()); > >> } > >> > >> public void _jspDestroy() { > >> _005fjspx_005ftagPool_005fc_005fchoose.release(); > >> _005fjspx_005ftagPool_005fc_005fwhen_005ftest.release(); > >> _005fjspx_005ftagPool_005fc_005fotherwise.release(); > >> } > >> > >> public void doTag() throws JspException, java.io.IOException { > >> } > >> } > >> > >> > >> --------------------------------------------------------------------- > >> To start a new topic, e-mail: users@tomcat.apache.org > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > --------------------------------------------------------------------- > > To start a new topic, e-mail: users@tomcat.apache.org > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > --------------------------------------------------------------------- > To start a new topic, e-mail: users@tomcat.apache.org > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]