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]

Reply via email to