/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.struts2.views.jsp.ui;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;


/**
 * StrutsBodyContent
 */
public class StrutsBodyContent extends BodyContent {
    private StringBuilder buffer = new StringBuilder();

    public StrutsBodyContent(JspWriter jspWriter) {
        super(jspWriter);
    }

    public Reader getReader() {
        return new StringReader(buffer.toString());
    }

    public int getRemaining() {
        return 0;
    }

    public String getString() {
        return buffer.toString();
    }

    public void clear() throws IOException {
        buffer = new StringBuilder();
    }

    public void clearBuffer() throws IOException {
        clear();
    }

    public void close() throws IOException {
        buffer = null;
    }

    public void newLine() throws IOException {
        buffer.append("\n");
    }

    public void print(boolean b) throws IOException {
        buffer.append(b);
    }

    public void print(char c) throws IOException {
        buffer.append(c);
    }

    public void print(int i) throws IOException {
        buffer.append(i);
    }

    public void print(long l) throws IOException {
        buffer.append(l);
    }

    public void print(float v) throws IOException {
        buffer.append(v);
    }

    public void print(double v) throws IOException {
        buffer.append(v);
    }

    public void print(char[] chars) throws IOException {
        buffer.append(chars);
    }

    public void print(String s) throws IOException {
        buffer.append(s);
    }

    public void print(Object o) throws IOException {
        buffer.append(o);
    }

    public void println() throws IOException {
        newLine();
    }

    public void println(boolean b) throws IOException {
        print(b);
        newLine();
    }

    public void println(char c) throws IOException {
        print(c);
        newLine();
    }

    public void println(int i) throws IOException {
        print(i);
        newLine();
    }

    public void println(long l) throws IOException {
        print(l);
        newLine();
    }

    public void println(float v) throws IOException {
        print(v);
        newLine();
    }

    public void println(double v) throws IOException {
        print(v);
        newLine();
    }

    public void println(char[] chars) throws IOException {
        print(chars);
        newLine();
    }

    public void println(String s) throws IOException {
        print(s);
        newLine();
    }

    public void println(Object o) throws IOException {
        print(o);
        newLine();
    }

    /**
     * Write a portion of an array of characters.
     *
     * @param cbuf Array of characters
     * @param off  Offset from which to start writing characters
     * @param len  Number of characters to write
     * @throws IOException If an I/O error occurs
     */
    public void write(char[] cbuf, int off, int len) throws IOException {
        buffer.append(cbuf, off, len);
    }

    public void writeOut(Writer writer) throws IOException {
        writer.write(buffer.toString());
    }
}
