/*
* Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) 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:
* Nuxeo - initial API and implementation
*
* $Id$
*/
package org.eclipse.ecr.core.api.impl.blob;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import java.util.Vector;
/**
* @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
*
*/
public abstract class StreamBlob extends AbstractBlob {
public static byte[] readBytes(InputStream in) throws IOException {
List<byte[]> v = new Vector<byte[]>();
byte[] buffer = new byte[BUFFER_SIZE];
int w = 0;
try {
int read = 0;
int len;
do {
w += read;
len = BUFFER_SIZE - w;
if (len <= 0) {
v.add(buffer);
buffer = new byte[BUFFER_SIZE];
len = BUFFER_SIZE;
w = 0;
}
} while ((read = in.read(buffer, w, len)) != -1);
} finally {
if (in != null) {
in.close();
}
}
byte[] ret = new byte[v.size()*BUFFER_SIZE + w];
for (int i = 0, size = v.size(); i < size; i++) {
byte[] tmp = v.get(i);
System.arraycopy(tmp, 0, ret, i*BUFFER_SIZE, BUFFER_SIZE);
}
System.arraycopy(buffer, 0, ret, v.size()*BUFFER_SIZE, w);
return ret;
}
public static byte[] readBytes(Reader reader) throws IOException {
List<char[]> v = new Vector<char[]>();
char[] buffer = new char[BUFFER_SIZE];
int w = 0;
try {
int read = 0;
int len;
do {
w += read;
len = BUFFER_SIZE - w;
if (len <= 0) {
v.add(buffer);
buffer = new char[BUFFER_SIZE];
len = BUFFER_SIZE;
w = 0;
}
} while ((read = reader.read(buffer, w, len)) != -1);
} finally {
if (reader != null) {
reader.close();
}
}
byte[] ret = new byte[v.size()*BUFFER_SIZE + w];
for (int i = 0, size = v.size(); i < size; i++) {
char[] tmp = v.get(i);
System.arraycopy(tmp, 0, ret, i*BUFFER_SIZE, BUFFER_SIZE);
}
System.arraycopy(buffer, 0, ret, v.size()*BUFFER_SIZE, w);
return ret;
}
// public static byte[] readBytes(InputStream in) throws IOException {
// byte[] buffer = new byte[BUFFER_SIZE];
// int read = 0, w = 0, len;
// try {
// do {
// w += read;
// len = buffer.length - w;
// if (len <= 0) { // resize buffer
// byte[] b = new byte[buffer.length+BUFFER_SIZE];
// System.arraycopy(buffer, 0, b, 0, w);
// buffer = b;
// len = buffer.length - w;
// }
// } while((read = in.read(buffer, w, len)) != -1);
// } finally {
// if(in != null) {
// in.close();
// }
// }
// if (buffer.length > w) { // compact buffer
// byte[] b = new byte[w];
// System.arraycopy(buffer, 0, b, 0, w);
// buffer = b;
// }
// return buffer;
// }
// public static char[] readChars(Reader reader) throws IOException {
// char[] buffer = new char[BUFFER_SIZE];
// int read = 0, w = 0, len;
// try {
// do {
// w += read;
// len = buffer.length - w;
// if (len <= 0) { // resize buffer
// char[] b = new char[buffer.length+BUFFER_SIZE];
// System.arraycopy(buffer, 0, b, 0, w);
// buffer = b;
// len = buffer.length - w;
// }
// } while((read = reader.read(buffer, w, len)) != -1);
// } finally {
// if(reader != null) {
// reader.close();
// }
// }
// if (buffer.length > w) { // compact buffer
// char[] b = new char[w];
// System.arraycopy(buffer, 0, b, 0, w);
// buffer = b;
// }
// return buffer;
// }
public static String readString(Reader reader) throws IOException {
StringBuilder sb = new StringBuilder(BUFFER_SIZE);
try {
char[] buffer = new char[BUFFER_SIZE];
int read;
while ((read = reader.read(buffer, 0, BUFFER_SIZE)) != -1) {
sb.append(buffer, 0, read);
}
} finally {
if (reader != null) {
reader.close();
}
}
return sb.toString();
}
@Override
public byte[] getByteArray() throws IOException {
InputStream in = getStream();
if (in == null || in.available() == 0) {
return EMPTY_BYTE_ARRAY;
}
return readBytes(in);
}
@Override
public String getString() throws IOException {
Reader reader = getReader();
if (reader == null || reader == EMPTY_READER) {
return EMPTY_STRING;
}
return readString(reader);
}
@Override
public Reader getReader() throws IOException {
InputStream in = getStream();
if (in == null || in.available() == 0) {
return EMPTY_READER;
}
String enc = getEncoding();
return enc == null ? new InputStreamReader(in)
: new InputStreamReader(in, enc);
}
@Override
public long getLength() {
return -1;
}
public ByteArrayBlob asByteArrayBlob() throws IOException {
return new ByteArrayBlob(getByteArray(), getMimeType(), getEncoding());
}
public StringBlob asStringBlob() throws IOException {
return new StringBlob(getString(), getMimeType(), getEncoding());
}
}