/*
 * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Resin Open Source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *   Free SoftwareFoundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.jsp;

import java.util.logging.Logger;

import com.caucho.util.L10N;

import com.caucho.log.Log;

/**
 * Stores analyzed information about a tag.
 */
public class AnalyzedTag {
  private static final Logger log = Log.open(AnalyzedTag.class);
  static final L10N L = new L10N(AnalyzedTag.class);

  private boolean _isBodyTag;
  
  private boolean _doStart;
  private boolean _startReturnsSkip;
  private boolean _startReturnsInclude;
  private boolean _startReturnsBuffered;
  
  private boolean _doEnd;
  private boolean _endReturnsSkip;
  private boolean _endReturnsEval;

  private boolean _doAfter;
  private boolean _afterReturnsAgain;
  
  private boolean _doInit;

  private boolean _doCatch;
  private boolean _doFinally;

  /**
   * Set true for a body tag.
   */
  public void setBodyTag(boolean isBodyTag)
  {
    _isBodyTag = isBodyTag;
  }

  /**
   * Set true for a body tag.
   */
  public boolean isBodyTag()
  {
    return _isBodyTag;
  }

  /**
   * Set true if the tag implements doStart.
   */
  public boolean getDoStart()
  {
    return _doStart;
  }

  /**
   * Set true if the tag implements doStart.
   */
  public void setDoStart(boolean doStart)
  {
    _doStart = doStart;
  }

  /**
   * Set true if the doStart can return SKIP_BODY
   */
  public boolean getStartReturnsSkip()
  {
    return _startReturnsSkip;
  }

  /**
   * Set true if the doStart can return SKIP_BODY
   */
  public void setStartReturnsSkip(boolean skip)
  {
    _startReturnsSkip = skip;
  }

  /**
   * Set true if the doStart can return INCLUDE_BODY
   */
  public boolean getStartReturnsInclude()
  {
    return _startReturnsInclude;
  }

  /**
   * Set true if the doStart can return INCLUDE_BODY
   */
  public void setStartReturnsInclude(boolean include)
  {
    _startReturnsInclude = include;
  }

  /**
   * Set true if the doStart can return INCLUDE_BODY_BUFFERED
   */
  public boolean getStartReturnsBuffered()
  {
    return _isBodyTag && _startReturnsBuffered;
  }

  /**
   * Set true if the doStart can return INCLUDE_BODY_BUFFERED
   */
  public boolean getStartReturnsBufferedAsParent()
  {
    return _startReturnsBuffered;
  }

  /**
   * Set true if the doStart can return INCLUDE_BODY_BUFFERED
   */
  public void setStartReturnsBuffered(boolean buffered)
  {
    _startReturnsBuffered = buffered;
  }

  /**
   * Set true if the tag implements doEndTag.
   */
  public boolean getDoEnd()
  {
    return _doEnd;
  }

  /**
   * Set true if the tag implements doEndTag.
   */
  public void setDoEnd(boolean doEnd)
  {
    _doEnd = doEnd;
  }

  /**
   * Set true if the doEndTag can return SKIP_PAGE
   */
  public boolean getEndReturnsSkip()
  {
    return _endReturnsSkip;
  }

  /**
   * Set true if the doEndTag can return SKIP_PAGE
   */
  public void setEndReturnsSkip(boolean skip)
  {
    _endReturnsSkip = skip;
  }

  /**
   * Set true if the doEndTag can return EVAL_PAGE
   */
  public boolean getEndReturnsEval()
  {
    return _endReturnsEval;
  }

  /**
   * Set true if the doEndTag can return EVAL_PAGE
   */
  public void setEndReturnsEval(boolean eval)
  {
    _endReturnsEval = eval;
  }

  /**
   * Set true if the tag implements doAfterBody
   */
  public boolean getDoAfter()
  {
    return _doAfter;
  }

  /**
   * Set true if the tag implements doAfterBody
   */
  public void setDoAfter(boolean doAfter)
  {
    _doAfter = doAfter;
  }

  /**
   * Set true if the doAfterBody can return EVAL_BODY_AGAIN
   */
  public boolean getAfterReturnsAgain()
  {
    return _afterReturnsAgain;
  }

  /**
   * Set true if the doAfterBody can return EVAL_BODY_AGAIN
   */
  public void setAfterReturnsAgain(boolean again)
  {
    _afterReturnsAgain = again;
  }

  /**
   * Set true if the tag implements doInitBody.
   */
  public boolean getDoInit()
  {
    return _doInit;
  }

  /**
   * Set true if the tag implements doInitBody.
   */
  public void setDoInit(boolean doInit)
  {
    _doInit = doInit;
  }

  /**
   * Set true if the tag implements doCatch
   */
  public boolean getDoCatch()
  {
    return _doCatch;
  }

  /**
   * Set true if the tag implements doCatch
   */
  public void setDoCatch(boolean doCatch)
  {
    _doCatch = doCatch;
  }

  /**
   * Set true if the tag implements doFinally
   */
  public boolean getDoFinally()
  {
    return _doFinally;
  }

  /**
   * Set true if the tag implements doFinally
   */
  public void setDoFinally(boolean doFinally)
  {
    _doFinally = doFinally;
  }
}
