in axiom-compat/src/main/java/org/apache/axiom/util/blob/OverflowBlob.java [334:395]
public long readFrom(InputStream in, long length, boolean commit) throws StreamCopyException {
// TODO: this will not work if the blob is in state UNCOMMITTED and we have already switched to a temporary file
long read = 0;
long toRead = length == -1 ? Long.MAX_VALUE : length;
while (true) {
int c;
try {
int len = chunkSize-chunkOffset;
if (len > toRead) {
len = (int)toRead;
}
c = in.read(getCurrentChunk(), chunkOffset, len);
} catch (IOException ex) {
throw new StreamCopyException(StreamCopyException.READ, ex);
}
if (c == -1) {
break;
}
read += c;
toRead -= c;
chunkOffset += c;
if (chunkOffset == chunkSize) {
chunkIndex++;
chunkOffset = 0;
if (chunkIndex == chunks.length) {
FileOutputStream fileOutputStream;
try {
fileOutputStream = switchToTempFile();
} catch (IOException ex) {
throw new StreamCopyException(StreamCopyException.WRITE, ex);
}
byte[] buf = new byte[4096];
while (true) {
int c2;
try {
c2 = in.read(buf, 0, (int)Math.min(toRead, 4096));
} catch (IOException ex) {
throw new StreamCopyException(StreamCopyException.READ, ex);
}
if (c2 == -1) {
break;
}
try {
fileOutputStream.write(buf, 0, c2);
} catch (IOException ex) {
throw new StreamCopyException(StreamCopyException.WRITE, ex);
}
read += c2;
toRead -= c2;
}
try {
fileOutputStream.close();
} catch (IOException ex) {
throw new StreamCopyException(StreamCopyException.WRITE, ex);
}
break;
}
}
}
state = commit ? STATE_COMMITTED : STATE_UNCOMMITTED;
return read;
}