|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectjava.io.Reader
org.barracudamvc.plankton.io.BetterPipedReader
public class BetterPipedReader
This class is based on Sun's PipedReader. It attempts to address 2 deficiencies in the Sun implementation: the PIPE_SIZE is configurable, and if we get a dewadlock on the writer (because the pipe size has been reached) then the writer will timeout after a certain amount of time. This is important in a servlet environment, where one request may start a writer pumping data into the sink, but you have no guarantee that anyone is going to actually read the data from the sink. Using the Sun implementation, the writer deadlocks and that thread is completely out of action for the duration...not very robust behavior for a servlet environment. This implementation will gracefully timeout, allowing the thread to complete and be returned to the servlet container for further use. It should also be noted that this implementation supports the notion of a Pausable controller, which if present will block the writer (up to but not exceeding the timeout period) while the parent controller isPaused(). Note that we completely reimplement these classes because the Sun classes weren't really designed to be extended (grrr).
Field Summary | |
---|---|
protected boolean |
closedByReader
|
protected boolean |
closedByWriter
|
protected boolean |
connected
|
static int |
DEFAULT_PIPE_SIZE
The default (global) size of the pipe's circular input buffer. |
static int |
DEFAULT_TIMEOUT
The default (global) timeout (in millis) |
protected int |
in
The index of the position in the circular buffer at which the next character of data will be stored when received from the connected piped writer. |
protected static org.apache.log4j.Logger |
logger
|
protected boolean |
notifiedFirst
|
protected int |
out
The index of the position in the circular buffer at which the next character of data will be read by this piped reader. |
protected Pausable |
pausable
|
protected int |
pipeSize
The pipe size for this particular circular input buffer (defaults to DEFAULT_PIPE_SIZE) |
protected Thread |
readSide
|
protected StringBuffer |
sbuffer
The circular buffer into which incoming data is placed. |
protected int |
timeout
The timeout for this particular pipe reader (defaults to DEFAULT_TIMEOUT) |
protected Thread |
writeSide
|
Fields inherited from class java.io.Reader |
---|
lock |
Constructor Summary | |
---|---|
BetterPipedReader()
Creates a BetterPipedReader that is not yet connected. |
|
BetterPipedReader(BetterPipedWriter src)
Creates a BetterPipedReader and automatically connect it to the piped writer
src . |
|
BetterPipedReader(Pausable ipausable,
int ipipeSize)
Creates a BetterPipedReader that is not yet connected, specifying
a custom pipe size. |
Method Summary | |
---|---|
void |
close()
Closes this piped stream and releases any system resources associated with the stream. |
void |
connect(BetterPipedWriter src)
Causes this piped reader to be connected to the piped writer src . |
Pausable |
getPausable()
get the Pausable controller |
int |
getPipeSize()
get the pipe size |
int |
getPipeTimeout()
get the timeout setting. |
int |
read()
Reads the next character of data from this piped stream. |
int |
read(char[] cbuf,
int off,
int len)
Reads up to len characters of data from this piped
stream into an array of characters. |
boolean |
ready()
Tell whether this stream is ready to be read. |
protected void |
receive(char[] c,
int off,
int len)
Receives data into an array of characters. |
protected void |
receive(int c)
Receives a char of data. |
protected void |
receivedFirst()
Notifies all waiting threads that we have started to receive data |
protected void |
receivedLast()
Notifies all waiting threads that the last character of data has been received. |
void |
setPausable(Pausable ipausable)
set the Pausable controller (null indicates the pipe can't be paused). |
void |
setPipeSize(int ipipeSize)
set the pipe size. |
void |
setPipeTimeout(int itimeout)
set the timeout (you may call this at any time). |
Methods inherited from class java.io.Reader |
---|
mark, markSupported, read, read, reset, skip |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static final org.apache.log4j.Logger logger
protected boolean closedByWriter
protected boolean closedByReader
protected boolean connected
protected boolean notifiedFirst
protected Pausable pausable
protected Thread readSide
protected Thread writeSide
public static int DEFAULT_PIPE_SIZE
protected int pipeSize
public static int DEFAULT_TIMEOUT
protected int timeout
protected StringBuffer sbuffer
protected int in
in<0
implies the buffer is empty,
in==out
implies the buffer is full
protected int out
Constructor Detail |
---|
public BetterPipedReader()
BetterPipedReader
that is not yet connected. It must be
manually connected to a BetterPipedWriter
before being used.
connect(org.barracudamvc.plankton.io.BetterPipedWriter)
,
BetterPipedWriter.connect(org.barracudamvc.plankton.io.BetterPipedReader)
public BetterPipedReader(Pausable ipausable, int ipipeSize)
BetterPipedReader
that is not yet connected, specifying
a custom pipe size. It must be manually connected to a BetterPipedWriter
before being used.
pipeSize
- the specific pipe size of the circular bufferconnect(org.barracudamvc.plankton.io.BetterPipedWriter)
,
BetterPipedWriter.connect(org.barracudamvc.plankton.io.BetterPipedReader)
public BetterPipedReader(BetterPipedWriter src) throws IOException
BetterPipedReader
and automatically connect it to the piped writer
src
. Data written to src
will then be available as input
from this stream. Note that if you use this method, calls to setPipeSize
will
have no effect (because the circular buffer has already been initialized when the connection
was made).
src
- the stream to connect to.
IOException
- if an I/O error occurs.Method Detail |
---|
public void setPipeSize(int ipipeSize)
public int getPipeSize()
public void setPipeTimeout(int itimeout)
public int getPipeTimeout()
public void setPausable(Pausable ipausable)
public Pausable getPausable()
public void connect(BetterPipedWriter src) throws IOException
src
.
If this object is already connected to some other piped writer, an IOException
is thrown.
If src
is an unconnected piped writer and snk
is an unconnected piped reader, they may be connected by either the call:
snk.connect(src)
or the call:
src.connect(snk)
The two calls have the same effect.
src
- The piped writer to connect to.
IOException
- if an I/O error occurs.protected void receive(int c) throws IOException
IOException
protected void receive(char[] c, int off, int len) throws IOException
IOException
protected void receivedFirst()
protected void receivedLast()
public int read() throws IOException
-1
is returned.
This method blocks until input data is available, the end of
the stream is detected, or an exception is thrown.
If a thread was providing data characters
to the connected piped writer, but
the thread is no longer alive, then an
IOException
is thrown.
read
in class Reader
-1
if the end of the
stream is reached.
IOException
- if the pipe is broken.public int read(char[] cbuf, int off, int len) throws IOException
len
characters of data from this piped
stream into an array of characters. Less than len
characters
will be read if the end of the data stream is reached. This method
blocks until at least one character of input is available.
If a thread was providing data characters to the connected piped output,
but the thread is no longer alive, then an IOException
is thrown.
read
in class Reader
cbuf
- the buffer into which the data is read.off
- the start offset of the data.len
- the maximum number of characters read.
-1
if there is no more data because the end of
the stream has been reached.
IOException
- if an I/O error occurs.public boolean ready() throws IOException
ready
in class Reader
IOException
- If an I/O error occurspublic void close() throws IOException
close
in interface Closeable
close
in class Reader
IOException
- if an I/O error occurs.
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |