public int read()

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;
        }