/*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ 
package javax.servlet.jsp.tagext;

import java.io.Reader;
import java.io.Writer;
import java.io.IOException;
import javax.servlet.jsp.*;

/**
 * An encapsulation of the evaluation of the body of an action so it is
 * available to a tag handler.  BodyContent is a subclass of JspWriter.
 *
 * <p>
 * Note that the content of BodyContent is the result of evaluation, so
 * it will not contain actions and the like, but the result of their
 * invocation.
 * 
 * <p>
 * BodyContent has methods to convert its contents into
 * a String, to read its contents, and to clear the contents.
 *
 * <p>
 * The buffer size of a BodyContent object is unbounded.  A
 * BodyContent object cannot be in autoFlush mode.  It is not possible to
 * invoke flush on a BodyContent object, as there is no backing stream.
 *
 * <p>
 * Instances of BodyContent are created by invoking the pushBody and
 * popBody methods of the PageContext class.  A BodyContent is enclosed
 * within another JspWriter (maybe another BodyContent object) following
 * the structure of their associated actions.
 *
 * <p>
 * A BodyContent is made available to a BodyTag through a setBodyContent()
 * call.  The tag handler can use the object until after the call to
 * doEndTag().
 */

public abstract class BodyContent extends JspWriter {
    
    /**
     * Protected constructor.
     *
     * Unbounded buffer, no autoflushing.
     *
     * @param e the enclosing JspWriter
     */

    protected BodyContent(JspWriter e) {
	super(UNBOUNDED_BUFFER , false);
	this.enclosingWriter = e;
    }

    /**
     * Redefined flush() so it is not legal.
     *
     * <p>
     * It is not valid to flush a BodyContent because there is no backing
     * stream behind it.
     *
     * @throws IOException always thrown
     */

    public void flush() throws IOException {
	throw new IOException("Illegal to flush within a custom tag");
    }

    /**
     * Clear the body without throwing any exceptions.
     */
    
    public void clearBody() {
	try {
	    this.clear();
	} catch (IOException ex) {
	    // TODO -- clean this one up.
	    throw new Error("internal error!;");
	}
    }

    /**
     * Return the value of this BodyContent as a Reader.
     *
     * @return the value of this BodyContent as a Reader
     */
    public abstract Reader getReader();


    /**
     * Return the value of the BodyContent as a String.
     *
     * @return the value of the BodyContent as a String
     */
    public abstract String getString();
	

    /**
     * Write the contents of this BodyContent into a Writer.
     * Subclasses may optimize common invocation patterns.
     *
     * @param out The writer into which to place the contents of
     *     this body evaluation
     * @throws IOException if an I/O error occurred while writing the
     *     contents of this BodyContent to the given Writer
     */

    public abstract void writeOut(Writer out) throws IOException;


    /**
     * Get the enclosing JspWriter.
     *
     * @return the enclosing JspWriter passed at construction time
     */

    public JspWriter getEnclosingWriter() {
	return enclosingWriter;
    }


    // private fields

    private JspWriter enclosingWriter;
 }
