001: /****************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one *
003: * or more contributor license agreements. See the NOTICE file *
004: * distributed with this work for additional information *
005: * regarding copyright ownership. The ASF licenses this file *
006: * to you under the Apache License, Version 2.0 (the *
007: * "License"); you may not use this file except in compliance *
008: * with the License. You may obtain a copy of the License at *
009: * *
010: * http://www.apache.org/licenses/LICENSE-2.0 *
011: * *
012: * Unless required by applicable law or agreed to in writing, *
013: * software distributed under the License is distributed on an *
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
015: * KIND, either express or implied. See the License for the *
016: * specific language governing permissions and limitations *
017: * under the License. *
018: ****************************************************************/package org.apache.james.util.watchdog;
019:
020: import java.io.IOException;
021: import java.io.OutputStream;
022:
023: /**
024: * This will reset the Watchdog each time a certain amount of data has
025: * been transferred. This allows us to keep the timeout settings low, while
026: * not timing out during large data transfers.
027: */
028: public class BytesWrittenResetOutputStream extends OutputStream {
029:
030: /**
031: * The output stream wrapped by this method
032: */
033: OutputStream out = null;
034:
035: /**
036: * The Watchdog to be reset every lengthReset bytes
037: */
038: private Watchdog watchdog;
039:
040: /**
041: * The number of bytes that need to be written before the counter is reset.
042: */
043: int lengthReset = 0;
044:
045: /**
046: * The number of bytes written since the counter was last reset
047: */
048: int writtenCounter = 0;
049:
050: public BytesWrittenResetOutputStream(OutputStream out,
051: Watchdog watchdog, int lengthReset) {
052: this .out = out;
053: this .watchdog = watchdog;
054: this .lengthReset = lengthReset;
055:
056: writtenCounter = 0;
057: }
058:
059: /**
060: * Write an array of bytes to the stream
061: *
062: * @param b the array of bytes to write to the stream
063: * @param off the index in the array where we start writing
064: * @param len the number of bytes of the array to write
065: *
066: * @throws IOException if an exception is encountered when writing
067: */
068: public void write(byte[] b, int off, int len) throws IOException {
069: out.write(b, off, len);
070: writtenCounter += len;
071:
072: if (writtenCounter > lengthReset) {
073: writtenCounter = 0;
074: watchdog.reset();
075: }
076: }
077:
078: /**
079: * Write a byte to the stream
080: *
081: * @param b the byte to write to the stream
082: *
083: * @throws IOException if an exception is encountered when writing
084: */
085: public void write(int b) throws IOException {
086: out.write(b);
087: writtenCounter++;
088:
089: if (writtenCounter > lengthReset) {
090: writtenCounter = 0;
091: watchdog.reset();
092: }
093: }
094:
095: /**
096: * Flush the stream
097: *
098: * @throws IOException if an exception is encountered when flushing
099: */
100: public void flush() throws IOException {
101: out.flush();
102: }
103:
104: /**
105: * Close the stream
106: *
107: * @throws IOException if an exception is encountered when closing
108: */
109: public void close() throws IOException {
110: out.close();
111: }
112: }
|