14ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/*
24ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Licensed to the Apache Software Foundation (ASF) under one or more
34ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * contributor license agreements.  See the NOTICE file distributed with
44ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * this work for additional information regarding copyright ownership.
54ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * The ASF licenses this file to You under the Apache License, Version 2.0
64ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * (the "License"); you may not use this file except in compliance with
74ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * the License.  You may obtain a copy of the License at
84ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
94ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Unless required by applicable law or agreed to in writing, software
124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * See the License for the specific language governing permissions and
154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * limitations under the License.
164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */
174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapackage org.apache.commons.io.output;
184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.IOException;
204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.OutputStream;
214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/**
244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * An output stream which triggers an event when a specified number of bytes of
254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * data have been written to it. The event can be used, for example, to throw
264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * an exception if a maximum has been reached, or to switch the underlying
274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * stream type when the threshold is exceeded.
284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p>
294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * This class overrides all <code>OutputStream</code> methods. However, these
304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * overrides ultimately call the corresponding methods in the underlying output
314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * stream implementation.
324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * <p>
334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * NOTE: This implementation may trigger the event <em>before</em> the threshold
344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * is actually reached, since it triggers when a pending write operation would
354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * cause the threshold to be exceeded.
364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira *
394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * @version $Id: ThresholdingOutputStream.java 540714 2007-05-22 19:39:44Z niallp $
404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira */
414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapublic abstract class ThresholdingOutputStream
424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    extends OutputStream
434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira{
444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // ----------------------------------------------------------- Data members
464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * The threshold at which the event will be triggered.
504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    private int threshold;
524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * The number of bytes written to the output stream.
564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    private long written;
584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Whether or not the configured threshold has been exceeded.
624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    private boolean thresholdExceeded;
644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // ----------------------------------------------------------- Constructors
674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Constructs an instance of this class which will trigger an event at the
714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * specified threshold.
724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param threshold The number of bytes at which to trigger an event.
744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public ThresholdingOutputStream(int threshold)
764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        this.threshold = threshold;
784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // --------------------------------------------------- OutputStream methods
824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Writes the specified byte to this output stream.
864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param b The byte to be written.
884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void write(int b) throws IOException
924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        checkThreshold(1);
944ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        getStream().write(b);
954ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        written++;
964ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
974ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
984ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
994ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1004ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Writes <code>b.length</code> bytes from the specified byte array to this
1014ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * output stream.
1024ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1034ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param b The array of bytes to be written.
1044ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1054ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
1064ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1074ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void write(byte b[]) throws IOException
1084ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1094ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        checkThreshold(b.length);
1104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        getStream().write(b);
1114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        written += b.length;
1124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Writes <code>len</code> bytes from the specified byte array starting at
1174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * offset <code>off</code> to this output stream.
1184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param b   The byte array from which the data will be written.
1204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param off The start offset in the byte array.
1214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param len The number of bytes to write.
1224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
1244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void write(byte b[], int off, int len) throws IOException
1264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        checkThreshold(len);
1284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        getStream().write(b, off, len);
1294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        written += len;
1304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Flushes this output stream and forces any buffered output bytes to be
1354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * written out.
1364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
1384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void flush() throws IOException
1404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        getStream().flush();
1424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Closes this output stream and releases any system resources associated
1474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * with this stream.
1484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
1504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public void close() throws IOException
1524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        try
1544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
1554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            flush();
1564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
1574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        catch (IOException ignored)
1584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
1594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            // ignore
1604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
1614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        getStream().close();
1624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // --------------------------------------------------------- Public methods
1664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Returns the threshold, in bytes, at which an event will be triggered.
1704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return The threshold point, in bytes.
1724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public int getThreshold()
1744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        return threshold;
1764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Returns the number of bytes that have been written to this output stream.
1814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return The number of bytes written.
1834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public long getByteCount()
1854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        return written;
1874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
1884ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1894ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
1904ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
1914ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Determines whether or not the configured threshold has been exceeded for
1924ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * this output stream.
1934ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
1944ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return <code>true</code> if the threshold has been reached;
1954ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *         <code>false</code> otherwise.
1964ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
1974ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    public boolean isThresholdExceeded()
1984ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
1994ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        return (written > threshold);
2004ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
2014ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2024ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2034ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // ------------------------------------------------------ Protected methods
2044ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2054ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2064ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
2074ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Checks to see if writing the specified number of bytes would cause the
2084ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * configured threshold to be exceeded. If so, triggers an event to allow
2094ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * a concrete implementation to take action on this.
2104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
2114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @param count The number of bytes about to be written to the underlying
2124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *              output stream.
2134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
2144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
2154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
2164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    protected void checkThreshold(int count) throws IOException
2174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
2184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        if (!thresholdExceeded && (written + count > threshold))
2194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        {
2204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            thresholdExceeded = true;
2214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira            thresholdReached();
2224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        }
2234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
2244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
2264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Resets the byteCount to zero.  You can call this from
2274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * {@link #thresholdReached()} if you want the event to be triggered again.
2284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
2294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    protected void resetByteCount()
2304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    {
2314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        this.thresholdExceeded = false;
2324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira        this.written = 0;
2334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    }
2344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    // ------------------------------------------------------- Abstract methods
2364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
2394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Returns the underlying output stream, to which the corresponding
2404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * <code>OutputStream</code> methods in this class will ultimately delegate.
2414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
2424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @return The underlying output stream.
2434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
2444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
2454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
2464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    protected abstract OutputStream getStream() throws IOException;
2474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira
2494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    /**
2504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * Indicates that the configured threshold has been reached, and that a
2514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * subclass should take whatever action necessary on this event. This may
2524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * include changing the underlying output stream.
2534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     *
2544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     * @exception IOException if an error occurs.
2554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira     */
2564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira    protected abstract void thresholdReached() throws IOException;
2574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira}
258