/*******************************************************************************
*
* Copyright (c) 2004-2009 Oracle Corporation.
*
* 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:
*
* Kohsuke Kawaguchi
*
*
*******************************************************************************/
package hudson.util;
import java.io.OutputStream;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
* {@link ByteArrayOutputStream} re-implementation.
*
* <p> This version allows one to read while writing is in progress.
*
* @author Kohsuke Kawaguchi
* @deprecated since 2008-05-28. Moved to stapler
*/
public class ByteBuffer extends OutputStream {
private byte[] buf = new byte[8192];
/**
* Size of the data.
*/
private int size = 0;
public synchronized void write(byte b[], int off, int len) throws IOException {
ensureCapacity(len);
System.arraycopy(b, off, buf, size, len);
size += len;
}
public synchronized void write(int b) throws IOException {
ensureCapacity(1);
buf[size++] = (byte) b;
}
public synchronized long length() {
return size;
}
private void ensureCapacity(int len) {
if (buf.length - size > len) {
return;
}
byte[] n = new byte[Math.max(buf.length * 2, size + len)];
System.arraycopy(buf, 0, n, 0, size);
this.buf = n;
}
public synchronized String toString() {
return new String(buf, 0, size);
}
/**
* Writes the contents of this buffer to another OutputStream.
*/
public synchronized void writeTo(OutputStream os) throws IOException {
os.write(buf, 0, size);
}
/**
* Creates an {@link InputStream} that reads from the underlying buffer.
*/
public InputStream newInputStream() {
return new InputStream() {
private int pos = 0;
public int read() throws IOException {
synchronized (ByteBuffer.this) {
if (pos >= size) {
return -1;
}
return buf[pos++];
}
}
public int read(byte b[], int off, int len) throws IOException {
synchronized (ByteBuffer.this) {
if (size == pos) {
return -1;
}
int sz = Math.min(len, size - pos);
System.arraycopy(buf, pos, b, off, sz);
pos += sz;
return sz;
}
}
public int available() throws IOException {
synchronized (ByteBuffer.this) {
return size - pos;
}
}
public long skip(long n) throws IOException {
synchronized (ByteBuffer.this) {
int diff = (int) Math.min(n, size - pos);
pos += diff;
return diff;
}
}
};
}
}