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;
019:
020: import org.apache.avalon.cornerstone.services.scheduler.TimeScheduler;
021:
022: import java.io.IOException;
023: import java.io.OutputStream;
024:
025: /**
026: * This will reset the scheduler each time a certain amount of data has
027: * been transfered. This allows us to keep the timeout settings low, while
028: * not timing out during large data transfers.
029: */
030: public class SchedulerNotifyOutputStream extends OutputStream {
031:
032: /**
033: * The output stream wrapped by this method
034: */
035: OutputStream out = null;
036:
037: /**
038: * The scheduler used by this class to timeout
039: */
040: TimeScheduler scheduler = null;
041:
042: /**
043: * The name of the trigger
044: */
045: String triggerName = null;
046:
047: /**
048: * The number of bytes that need to be written before the counter is reset.
049: */
050: int lengthReset = 0;
051:
052: /**
053: * The number of bytes written since the counter was last reset
054: */
055: int writtenCounter = 0;
056:
057: public SchedulerNotifyOutputStream(OutputStream out,
058: TimeScheduler scheduler, String triggerName, int lengthReset) {
059: this .out = out;
060: this .scheduler = scheduler;
061: this .triggerName = triggerName;
062: this .lengthReset = lengthReset;
063:
064: writtenCounter = 0;
065: }
066:
067: /**
068: * Write an array of bytes to the stream
069: *
070: * @param b the array of bytes to write to the stream
071: * @param off the index in the array where we start writing
072: * @param len the number of bytes of the array to write
073: *
074: * @throws IOException if an exception is encountered when writing
075: */
076: public void write(byte[] b, int off, int len) throws IOException {
077: out.write(b, off, len);
078: writtenCounter += len;
079:
080: if (writtenCounter > lengthReset) {
081: writtenCounter -= lengthReset;
082: scheduler.resetTrigger(triggerName);
083: }
084: }
085:
086: /**
087: * Write a byte to the stream
088: *
089: * @param b the byte to write to the stream
090: *
091: * @throws IOException if an exception is encountered when writing
092: */
093: public void write(int b) throws IOException {
094: out.write(b);
095: writtenCounter++;
096:
097: if (writtenCounter > lengthReset) {
098: writtenCounter -= lengthReset;
099: scheduler.resetTrigger(triggerName);
100: }
101: }
102:
103: /**
104: * Flush the stream
105: *
106: * @throws IOException if an exception is encountered when flushing
107: */
108: public void flush() throws IOException {
109: out.flush();
110: }
111:
112: /**
113: * Close the stream
114: *
115: * @throws IOException if an exception is encountered when closing
116: */
117: public void close() throws IOException {
118: out.close();
119: }
120: }
|