public void release() {
   super.release();
   bean = null;
   name = null;
   method_prefix = null;
   startTag_xslt = null;
   endTag_xslt = null;
 }
  /**
   * Execute the tags within the given DCP content and return the resulting DCP content
   *
   * @param content String the DCP content to process
   * @return String the DCP content after tags execution
   */
  public String executeTags(String content) {
    StringBuffer result = null;
    StringBuffer buffer = new StringBuffer(content);

    for (TagSupport tag : tags) {
      result = new StringBuffer();
      Matcher matcher = tag.getPattern().matcher(buffer);
      while (matcher.find()) {
        log.debug("Found tag " + matcher.group());
        String tagBody = matcher.groupCount() > 0 ? matcher.group(1) : null;
        matcher.appendReplacement(result, tag.execute(tagBody));
      }
      matcher.appendTail(result);
      buffer = result;
    }

    return result == null ? content : result.toString();
  }
 public int doStartTag() throws JspException {
   IterateTag itag = (IterateTag) TagSupport.findAncestorWithClass(this, IterateTag.class);
   if (itag == null) {
     Debug.println("RowTag.doStartTag: no enclosing 'iterate' tag found.");
   } else if (itag.isEmpty()) {
     return Tag.SKIP_BODY;
   } else {
     current_row = itag.currentElement();
     if (current_row != null && itag.getBeanId() != null) {
       // This is so that if the current row is a bean, jsp:useBean will work
       // inside of iterations.
       pageContext.setAttribute(itag.getBeanId(), current_row);
       Debug.println("storing record in page scope: " + current_row);
     }
     return (current_row == null
         ? Tag.SKIP_BODY // no more elements. iteration complete.
         : Tag.EVAL_BODY_INCLUDE);
   }
   return Tag.SKIP_BODY;
 }
  @Override
  public void release() {
    bodyContent = null;

    super.release();
  }