FileDocCategorySizeDatePackage
ASInputStream.javaAPI DocGlassfish v2 API6373Fri May 04 22:35:52 BST 2007com.sun.enterprise.server.ss.provider

ASInputStream

public final class ASInputStream extends InputStream
InputStream implementation for the socket wrappers of Quick startup implementation. Implementation is thread safe while using nio to read and write simultaneusly in the non-blocking mode.

Fields Summary
private static final Logger
logger
private SocketChannel
sc
private Socket
sock
private boolean
closed
private Selector
selector
private ByteBuffer
bb
private byte[]
bs
private byte[]
b1
Constructors Summary
ASInputStream(SocketChannel sc, Socket sock)


         
        this.sc = sc;
        this.sock = sock;
        this.selector = Selector.open();
        this.sc.register(selector, SelectionKey.OP_READ); 
    
Methods Summary
private voidcheckClosed()

        if (closed) {
            throw new IOException("Stream is closed");
        }

        if (sock.isInputShutdown()) {
            throw new IOException("Input Shutdown");
        }
    
public voidclose()

        if (closed) {
            return;
        }
        closed = true;
        try {
            selector.close();
            selector = null;
            sc = null;
        } catch (Exception ie) {
            if ( logger.isLoggable(Level.FINE) ) {
                logger.log(Level.FINE, "" + ie.getMessage(), ie);
            }
        }
    
protected voidfinalize()

        try {
            close();
        } catch (Throwable t) {}
    
public synchronized intread()

	if (b1 == null)
	    b1 = new byte[1];
	int n = this.read(b1);
	if (n == 1)
	    return b1[0] & 0xff;
	return -1;
    
public synchronized intread(byte[] bs, int off, int len)

	if ((off < 0) || (off > bs.length) || (len < 0) ||
	    ((off + len) > bs.length) || ((off + len) < 0)) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0)
	    return 0;

	ByteBuffer bb = ((this.bs == bs)
			 ? this.bb
			 : ByteBuffer.wrap(bs));
	bb.position(off);
	bb.limit(Math.min(off + len, bb.capacity()));
	this.bb = bb;
	this.bs = bs;
	return read(bb);
    
private intread(java.nio.ByteBuffer bb)

        checkClosed();
        waitForSelect();
        return sc.read(bb);
    
private voidwaitForSelect()

        
        java.net.Socket sock = sc.socket();
        if (sock.isClosed()) {
            close();
            throw new IOException("Socket Closed");
        }

        int timeout = sock.getSoTimeout();
        Iterator it;
        SelectionKey selKey;
        
        selectorblock:
            while (true) {
                boolean timedout = true;
                try {
                    int n = selector.select(timeout);
                    if (sock.isInputShutdown() || sock.isClosed()) {
                        throw new IOException("Input Shutdown");
                    }
                    if (n > 0) {
                        timedout = false;
                    }
                    it = selector.selectedKeys().iterator();
                    while (it.hasNext()) {
                        timedout = false;
                        selKey = (SelectionKey)it.next();
                        if (selKey.isValid() && selKey.isReadable()) {
                            it.remove();
                            break selectorblock;
                        } 
                    }
                } catch (Exception e) {
                    throw (IOException) (new IOException()).initCause(e);
                }
                if (timedout) {
                     boolean wakenup = ((ASSelector) selector).wakenUp();
                     if ( !wakenup && !Thread.currentThread().isInterrupted()) {
                        throw new java.net.SocketTimeoutException("Read timed out");
                     }
                } 
            }