/*
 *  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.tomcat.util.log;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

/**
 * Per Thread System.err and System.out log capture data.
 *
 * @author Glenn L. Nielsen
 */

class CaptureLog {

    protected CaptureLog() {
        baos = new ByteArrayOutputStream();
        ps = new PrintStream(baos);
    }

    private ByteArrayOutputStream baos;
    private PrintStream ps;

    protected PrintStream getStream() {
        return ps;
    }

    protected void reset() {
        baos.reset();
    }

    protected String getCapture() {
        return baos.toString();
    }
}
