in axis-rt-core/src/main/java/org/apache/axis/attachments/ManagedMemoryDataSource.java [680:820]
public int read(byte[] b, int off, int len) throws java.io.IOException {
if (debugEnabled) {
is_log.debug(this.hashCode() + " read(" + off + ", " + len
+ ")");
}
if (deleted) {
throw new java.io.IOException(
Messages.getMessage("resourceDeleted"));
}
if (readClosed) {
throw new java.io.IOException(
Messages.getMessage("streamClosed"));
}
if (b == null) {
throw new InternalException(Messages.getMessage("nullInput"));
}
if (off < 0) {
throw new IndexOutOfBoundsException(
Messages.getMessage("negOffset", "" + off));
}
if (len < 0) {
throw new IndexOutOfBoundsException(
Messages.getMessage("length", "" + len));
}
if (len + off > b.length) {
throw new IndexOutOfBoundsException(
Messages.getMessage("writeBeyond"));
}
if (len == 0) {
return 0;
}
int bwritten = 0;
synchronized (ManagedMemoryDataSource.this) {
if (bread == totalsz) {
return -1;
}
java.util.List ml = memorybuflist;
long longlen = len;
longlen = Math.min(
longlen,
totalsz
- bread); // Only return the number of bytes in the data store that is left.
len = new Long(longlen).intValue();
if (debugEnabled) {
is_log.debug("len = " + len);
}
if (ml != null) {
if (null == currentBuf) { // Get the buffer we need to read from.
currentBuf = (byte[]) ml.get(currentIndex);
currentBufPos = 0; // New buffer start from the begining.
}
do {
// The bytes to copy, the minimum of the bytes left in this buffer or bytes remaining.
int bcopy = Math.min(currentBuf.length - currentBufPos,
len - bwritten);
// Copy the data.
System.arraycopy(currentBuf, currentBufPos, b,
off + bwritten, bcopy);
bwritten += bcopy;
currentBufPos += bcopy;
if (bwritten < len) { // Get the next buffer.
currentBuf = (byte[]) ml.get(++currentIndex);
currentBufPos = 0;
}
} while (bwritten < len);
}
if ((bwritten == 0) && (null != diskCacheFile)) {
if (debugEnabled) {
is_log.debug(Messages.getMessage("reading", "" + len));
}
if (null == fin) { // we are now reading from disk.
if (debugEnabled) {
is_log.debug(
Messages.getMessage(
"openBread",
diskCacheFile.getCanonicalPath()));
}
if (debugEnabled) {
is_log.debug(Messages.getMessage("openBread",
"" + bread));
}
fin = new java.io.FileInputStream(diskCacheFile);
if (bread > 0) {
fin.skip(bread); // Skip what we've read so far.
}
}
if (cachediskstream != null) {
if (debugEnabled) {
is_log.debug(Messages.getMessage("flushing"));
}
cachediskstream.flush();
}
if (debugEnabled) {
is_log.debug(Messages.getMessage("flushing"));
is_log.debug("len=" + len);
is_log.debug("off=" + off);
is_log.debug("b.length=" + b.length);
}
bwritten = fin.read(b, off, len);
}
if (bwritten > 0) {
bread += bwritten;
}
}
if (debugEnabled) {
is_log.debug(this.hashCode()
+ Messages.getMessage("read", "" + bwritten));
}
return bwritten;
}