Android Open Source - wototoplayer Fault Recovering Output Stream






From Project

Back to project page wototoplayer.

License

The source code is released under:

Copyright (c) 2015, Chris Greenhalgh All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met...

If you think the Android project wototoplayer listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 Square, Inc.//from w  ww  .  j av a2  s.c om
 *
 * Licensed 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 com.squareup.okhttp.internal;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import static com.squareup.okhttp.internal.Util.checkOffsetAndCount;

/**
 * An output stream wrapper that recovers from failures in the underlying stream
 * by replacing it with another stream. This class buffers a fixed amount of
 * data under the assumption that failures occur early in a stream's life.
 * If a failure occurs after the buffer has been exhausted, no recovery is
 * attempted.
 *
 * <p>Subclasses must override {@link #replacementStream} which will request a
 * replacement stream each time an {@link IOException} is encountered on the
 * current stream.
 */
public abstract class FaultRecoveringOutputStream extends AbstractOutputStream {
  private final int maxReplayBufferLength;

  /** Bytes to transmit on the replacement stream, or null if no recovery is possible. */
  private ByteArrayOutputStream replayBuffer;
  private OutputStream out;

  /**
   * @param maxReplayBufferLength the maximum number of successfully written
   *     bytes to buffer so they can be replayed in the event of an error.
   *     Failure recoveries are not possible once this limit has been exceeded.
   */
  public FaultRecoveringOutputStream(int maxReplayBufferLength, OutputStream out) {
    if (maxReplayBufferLength < 0) throw new IllegalArgumentException();
    this.maxReplayBufferLength = maxReplayBufferLength;
    this.replayBuffer = new ByteArrayOutputStream(maxReplayBufferLength);
    this.out = out;
  }

  @Override public final void write(byte[] buffer, int offset, int count) throws IOException {
    if (closed) throw new IOException("stream closed");
    checkOffsetAndCount(buffer.length, offset, count);

    while (true) {
      try {
        out.write(buffer, offset, count);

        if (replayBuffer != null) {
          if (count + replayBuffer.size() > maxReplayBufferLength) {
            // Failure recovery is no longer possible once we overflow the replay buffer.
            replayBuffer = null;
          } else {
            // Remember the written bytes to the replay buffer.
            replayBuffer.write(buffer, offset, count);
          }
        }
        return;
      } catch (IOException e) {
        if (!recover(e)) throw e;
      }
    }
  }

  @Override public final void flush() throws IOException {
    if (closed) {
      return; // don't throw; this stream might have been closed on the caller's behalf
    }
    while (true) {
      try {
        out.flush();
        return;
      } catch (IOException e) {
        if (!recover(e)) throw e;
      }
    }
  }

  @Override public final void close() throws IOException {
    if (closed) {
      return;
    }
    while (true) {
      try {
        out.close();
        closed = true;
        return;
      } catch (IOException e) {
        if (!recover(e)) throw e;
      }
    }
  }

  /**
   * Attempt to replace {@code out} with another equivalent stream. Returns true
   * if a suitable replacement stream was found.
   */
  private boolean recover(IOException e) {
    if (replayBuffer == null) {
      return false; // Can't recover because we've dropped data that we would need to replay.
    }

    while (true) {
      OutputStream replacementStream = null;
      try {
        replacementStream = replacementStream(e);
        if (replacementStream == null) {
          return false;
        }
        replaceStream(replacementStream);
        return true;
      } catch (IOException replacementStreamFailure) {
        // The replacement was also broken. Loop to ask for another replacement.
        Util.closeQuietly(replacementStream);
        e = replacementStreamFailure;
      }
    }
  }

  /**
   * Returns true if errors in the underlying stream can currently be recovered.
   */
  public boolean isRecoverable() {
    return replayBuffer != null;
  }

  /**
   * Replaces the current output stream with {@code replacementStream}, writing
   * any replay bytes to it if they exist. The current output stream is closed.
   */
  public final void replaceStream(OutputStream replacementStream) throws IOException {
    if (!isRecoverable()) {
      throw new IllegalStateException();
    }
    if (this.out == replacementStream) {
      return; // Don't replace a stream with itself.
    }
    replayBuffer.writeTo(replacementStream);
    Util.closeQuietly(out);
    out = replacementStream;
  }

  /**
   * Returns a replacement output stream to recover from {@code e} thrown by the
   * previous stream. Returns a new OutputStream if recovery was successful, in
   * which case all previously-written data will be replayed. Returns null if
   * the failure cannot be recovered.
   */
  protected abstract OutputStream replacementStream(IOException e) throws IOException;
}




Java Source Code List

com.phonegap.plugins.barcodescanner.BarcodeScanner.java
com.squareup.okhttp.Address.java
com.squareup.okhttp.ConnectionPool.java
com.squareup.okhttp.Connection.java
com.squareup.okhttp.Dispatcher.java
com.squareup.okhttp.Failure.java
com.squareup.okhttp.HttpResponseCache.java
com.squareup.okhttp.Job.java
com.squareup.okhttp.MediaType.java
com.squareup.okhttp.OkAuthenticator.java
com.squareup.okhttp.OkHttpClient.java
com.squareup.okhttp.OkResponseCache.java
com.squareup.okhttp.Request.java
com.squareup.okhttp.ResponseSource.java
com.squareup.okhttp.Response.java
com.squareup.okhttp.RouteDatabase.java
com.squareup.okhttp.Route.java
com.squareup.okhttp.TunnelRequest.java
com.squareup.okhttp.internal.AbstractOutputStream.java
com.squareup.okhttp.internal.Base64.java
com.squareup.okhttp.internal.DiskLruCache.java
com.squareup.okhttp.internal.Dns.java
com.squareup.okhttp.internal.FaultRecoveringOutputStream.java
com.squareup.okhttp.internal.NamedRunnable.java
com.squareup.okhttp.internal.Platform.java
com.squareup.okhttp.internal.StrictLineReader.java
com.squareup.okhttp.internal.Util.java
com.squareup.okhttp.internal.http.AbstractHttpInputStream.java
com.squareup.okhttp.internal.http.HeaderParser.java
com.squareup.okhttp.internal.http.HttpAuthenticator.java
com.squareup.okhttp.internal.http.HttpDate.java
com.squareup.okhttp.internal.http.HttpEngine.java
com.squareup.okhttp.internal.http.HttpTransport.java
com.squareup.okhttp.internal.http.HttpURLConnectionImpl.java
com.squareup.okhttp.internal.http.HttpsEngine.java
com.squareup.okhttp.internal.http.HttpsURLConnectionImpl.java
com.squareup.okhttp.internal.http.OkResponseCacheAdapter.java
com.squareup.okhttp.internal.http.Policy.java
com.squareup.okhttp.internal.http.RawHeaders.java
com.squareup.okhttp.internal.http.RequestHeaders.java
com.squareup.okhttp.internal.http.ResponseHeaders.java
com.squareup.okhttp.internal.http.RetryableOutputStream.java
com.squareup.okhttp.internal.http.RouteSelector.java
com.squareup.okhttp.internal.http.SpdyTransport.java
com.squareup.okhttp.internal.http.Transport.java
com.squareup.okhttp.internal.http.UnknownLengthHttpInputStream.java
com.squareup.okhttp.internal.spdy.ErrorCode.java
com.squareup.okhttp.internal.spdy.FrameReader.java
com.squareup.okhttp.internal.spdy.FrameWriter.java
com.squareup.okhttp.internal.spdy.HeadersMode.java
com.squareup.okhttp.internal.spdy.Hpack.java
com.squareup.okhttp.internal.spdy.Http20Draft06.java
com.squareup.okhttp.internal.spdy.IncomingStreamHandler.java
com.squareup.okhttp.internal.spdy.NameValueBlockReader.java
com.squareup.okhttp.internal.spdy.Ping.java
com.squareup.okhttp.internal.spdy.Settings.java
com.squareup.okhttp.internal.spdy.Spdy3.java
com.squareup.okhttp.internal.spdy.SpdyConnection.java
com.squareup.okhttp.internal.spdy.SpdyStream.java
com.squareup.okhttp.internal.spdy.Variant.java
com.squareup.okhttp.internal.tls.DistinguishedNameParser.java
com.squareup.okhttp.internal.tls.OkHostnameVerifier.java
org.apache.cordova.App.java
org.apache.cordova.AuthenticationToken.java
org.apache.cordova.CallbackContext.java
org.apache.cordova.ConfigXmlParser.java
org.apache.cordova.Config.java
org.apache.cordova.CordovaActivity.java
org.apache.cordova.CordovaArgs.java
org.apache.cordova.CordovaBridge.java
org.apache.cordova.CordovaChromeClient.java
org.apache.cordova.CordovaInterface.java
org.apache.cordova.CordovaPlugin.java
org.apache.cordova.CordovaPreferences.java
org.apache.cordova.CordovaResourceApi.java
org.apache.cordova.CordovaUriHelper.java
org.apache.cordova.CordovaWebViewClient.java
org.apache.cordova.CordovaWebView.java
org.apache.cordova.DirectoryManager.java
org.apache.cordova.DroidGap.java
org.apache.cordova.ExifHelper.java
org.apache.cordova.ExposedJsApi.java
org.apache.cordova.FileHelper.java
org.apache.cordova.IceCreamCordovaWebViewClient.java
org.apache.cordova.JSONUtils.java
org.apache.cordova.LOG.java
org.apache.cordova.LinearLayoutSoftKeyboardDetect.java
org.apache.cordova.NativeToJsMessageQueue.java
org.apache.cordova.PluginEntry.java
org.apache.cordova.PluginManager.java
org.apache.cordova.PluginResult.java
org.apache.cordova.ScrollEvent.java
org.apache.cordova.Whitelist.java
org.opensharingtoolkit.cordova.aestheticodes.Scan.java
org.opensharingtoolkit.cordova.aestheticodes.Scan.java
org.opensharingtoolkit.player.CordovaApp.java