org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/PollingInputStream.java
Parent Directory
|
Revision Log
Revision 1.11 -
(download)
(annotate)
Wed May 10 17:47:43 2006 UTC (3 years, 6 months ago) by mvalenta
Branch: MAIN
CVS Tags: I20060510, I200607032320, I200609251710, I20070409, R3_2, I20070402, r33x_20070724, I20071015, I200610021645, I20070709, I20070202, I20061208, I20070528, I20070529, I20070522, I20070523, I20070524, I20070525, I20070115, I20070801, I200608211720, I20070808, r33x_20071024, R3_3_1_1, I20060917, I20060911, I200702071200, I200606191715, R3_3, I20070416, pre_R3_3, I20070924, I20071001, I20070326, I20070730, I20060714, I20070316, I20070212, I20070219, I20070607, I20070605, I20070604, I200605181830, I200606051140, I20061218, I20070516, I20070515, I20070514, I20070511, I20070101, I200702081200, I200702051300, I20070430, I200606121730, I200703211300, r33x_20080128, I20070312, I20070220, I20070226, I200703191600, I20070507, I20070426, I20070129, I200702081800, r33x_20070709, I20070130, M20060711, r33x_20070807, I20070723, I200610161750, r33x_20071129, I20070910, I20070914, M20061114, I20070501, I20070502, I20060605-1430, R3_2_1, R3_2_2, I200610232323, r33x_20070730, I20070305, I20070303, I20070716, I20070423, I20070531, I20070122, I20070510, I200607101745, R3_3_1, R3_3_2, v20070212
Branch point for: R3_3_maintenance, R3_2_maintenance
Changes since 1.10: +1 -1 lines
Wed May 10 17:47:43 2006 UTC (3 years, 6 months ago) by mvalenta
Branch: MAIN
CVS Tags: I20060510, I200607032320, I200609251710, I20070409, R3_2, I20070402, r33x_20070724, I20071015, I200610021645, I20070709, I20070202, I20061208, I20070528, I20070529, I20070522, I20070523, I20070524, I20070525, I20070115, I20070801, I200608211720, I20070808, r33x_20071024, R3_3_1_1, I20060917, I20060911, I200702071200, I200606191715, R3_3, I20070416, pre_R3_3, I20070924, I20071001, I20070326, I20070730, I20060714, I20070316, I20070212, I20070219, I20070607, I20070605, I20070604, I200605181830, I200606051140, I20061218, I20070516, I20070515, I20070514, I20070511, I20070101, I200702081200, I200702051300, I20070430, I200606121730, I200703211300, r33x_20080128, I20070312, I20070220, I20070226, I200703191600, I20070507, I20070426, I20070129, I200702081800, r33x_20070709, I20070130, M20060711, r33x_20070807, I20070723, I200610161750, r33x_20071129, I20070910, I20070914, M20061114, I20070501, I20070502, I20060605-1430, R3_2_1, R3_2_2, I200610232323, r33x_20070730, I20070305, I20070303, I20070716, I20070423, I20070531, I20070122, I20070510, I200607101745, R3_3_1, R3_3_2, v20070212
Branch point for: R3_3_maintenance, R3_2_maintenance
Changes since 1.10: +1 -1 lines
Updated Copyrights
/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.team.internal.core.streams; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.team.internal.core.*; import org.eclipse.team.internal.core.Policy; import org.eclipse.team.internal.core.TeamPlugin; /** * Polls a progress monitor periodically and handles timeouts over extended durations. * For this class to be effective, a high numAttempts should be specified, and the * underlying stream should time out frequently on reads (every second or so). * * Supports resuming partially completed operations after an InterruptedIOException * if the underlying stream does. Check the bytesTransferred field to determine how * much of the operation completed; conversely, at what point to resume. */ public class PollingInputStream extends FilterInputStream { private static final boolean DEBUG = Policy.DEBUG_STREAMS; private int numAttempts; private IProgressMonitor monitor; private boolean cancellable; /** * Creates a new polling input stream. * @param in the underlying input stream * @param numAttempts the number of attempts before issuing an InterruptedIOException, * if 0, retries indefinitely until canceled * @param monitor the progress monitor to be polled for cancellation */ public PollingInputStream(InputStream in, int numAttempts, IProgressMonitor monitor) { super(in); this.numAttempts = numAttempts; this.monitor = monitor; this.cancellable = true; } /** * Wraps the underlying stream's method. * It may be important to wait for an input stream to be closed because it * holds an implicit lock on a system resoure (such as a file) while it is * open. Closing a stream may take time if the underlying stream is still * servicing a previous request. * @throws OperationCanceledException if the progress monitor is canceled * @throws InterruptedIOException if the underlying operation times out numAttempts times * @throws IOException if an i/o error occurs */ public void close() throws IOException { int attempts = 0; try { readPendingInput(); } catch (IOException e) { // We shouldn't get an exception when we're getting the available input. // If we do, just log it so we can close. TeamPlugin.log(IStatus.ERROR, e.getMessage(), e); } finally { boolean stop = false; while (!stop) { try { in.close(); stop = true; } catch (InterruptedIOException e) { if (checkCancellation()) throw new OperationCanceledException(); if (++attempts == numAttempts) throw new InterruptedIOException(Messages.PollingInputStream_closeTimeout); if (DEBUG) System.out.println("close retry=" + attempts); //$NON-NLS-1$ } } } } /** * Wraps the underlying stream's method. * @throws OperationCanceledException if the progress monitor is canceled * @throws InterruptedIOException if the underlying operation times out numAttempts times * and no data was received, bytesTransferred will be zero * @throws IOException if an i/o error occurs */ public int read() throws IOException { int attempts = 0; for (;;) { if (checkCancellation()) throw new OperationCanceledException(); try { return in.read(); } catch (InterruptedIOException e) { if (++attempts == numAttempts) throw new InterruptedIOException(Messages.PollingInputStream_readTimeout); if (DEBUG) System.out.println("read retry=" + attempts); //$NON-NLS-1$ } } } /** * Wraps the underlying stream's method. * @throws OperationCanceledException if the progress monitor is canceled * @throws InterruptedIOException if the underlying operation times out numAttempts times * and no data was received, bytesTransferred will be zero * @throws IOException if an i/o error occurs */ public int read(byte[] buffer, int off, int len) throws IOException { int attempts = 0; for (;;) { if (checkCancellation()) throw new OperationCanceledException(); try { return in.read(buffer, off, len); } catch (InterruptedIOException e) { if (e.bytesTransferred != 0) return e.bytesTransferred; // keep partial transfer if (++attempts == numAttempts) throw new InterruptedIOException(Messages.PollingInputStream_readTimeout); if (DEBUG) System.out.println("read retry=" + attempts); //$NON-NLS-1$ } } } /** * Wraps the underlying stream's method. * @throws OperationCanceledException if the progress monitor is canceled * @throws InterruptedIOException if the underlying operation times out numAttempts times * and no data was received, bytesTransferred will be zero * @throws IOException if an i/o error occurs */ public long skip(long count) throws IOException { int attempts = 0; for (;;) { if (checkCancellation()) throw new OperationCanceledException(); try { return in.skip(count); } catch (InterruptedIOException e) { if (e.bytesTransferred != 0) return e.bytesTransferred; // keep partial transfer if (++attempts == numAttempts) throw new InterruptedIOException(Messages.PollingInputStream_readTimeout); if (DEBUG) System.out.println("read retry=" + attempts); //$NON-NLS-1$ } } } /** * Reads any pending input from the input stream so that * the stream can savely be closed. */ protected void readPendingInput() throws IOException { byte[] buffer= new byte[2048]; while (true) { int available = in.available(); if (available < 1) break; if (available > buffer.length) available = buffer.length; if (in.read(buffer, 0, available) < 1) break; } } /** * Called to set whether cancellation will be checked by this stream. Turning cancellation checking * off can be very useful for protecting critical portions of a protocol that shouldn't be interrupted. * For example, it is often necessary to protect login sequences. * @param cancellable a flag controlling whether this stream will check for cancellation. */ public void setIsCancellable(boolean cancellable) { this.cancellable = cancellable; } /** * Checked whether the monitor for this stream has been cancelled. If the cancellable * flag is <code>false</code> then the monitor is never cancelled. * @return <code>true</code> if the monitor has been cancelled and <code>false</code> * otherwise. */ private boolean checkCancellation() { if(cancellable) { return monitor.isCanceled(); } else { return false; } } }
| help@eclipse.org | ViewVC Help |
| Powered by ViewVC 1.0.3 |
