Top Description Fields Constructors Methods
org.apache.derby.iapi.types

public final Class ReaderToUTF8Stream

extends InputStream
Class Inheritance
Imports
java.io.InputStream, .IOException, .EOFException, .Reader, org.apache.derby.shared.common.reference.SQLState, .MessageId, org.apache.derby.shared.common.i18n.MessageService, org.apache.derby.iapi.services.io.DerbyIOException, .LimitReader, org.apache.derby.shared.common.sanity.SanityManager

Converts the characters served by a java.io.Reader to a stream returning the data in the on-disk modified UTF-8 encoded representation used by Derby.

Length validation is performed. If required and allowed by the target column type, truncation of blanks will also be performed.

Field Summary

Modifier and TypeField and Description
private int
private int
private byte[]
buffer

Buffer to hold the data read from stream and converted to the modified UTF-8 format.

private int
charCount

The number of chars encoded.

private final int
charsToTruncate

Number of characters to truncate from this stream.

private boolean
private static final int
FIRST_READ

Constant indicating the first iteration of fillBuffer.

private final StreamHeaderGenerator
hdrGen

The generator for the stream header to use for this stream.

private int
headerLength

The length of the header.

private int
mark

Stream mark, set through mark(int).

private static final int
MARK_UNSET_OR_EXCEEDED

Constant indicating that no mark is set in the stream, or that the read ahead limit of the mark has been exceeded.

private boolean
multipleBuffer

Tells if the stream content is/was larger than the buffer size.

private static final int
READ_BUFFER_RESERVATION

Buffer space reserved for one 3 byte encoded char and the EOF marker.

private int
readAheadLimit

Read ahead limit for mark, set through mark(int).

private LimitReader
reader

Application's reader wrapped in a LimitReader.

private static final char
private final String
typeName

The type name for the column data is inserted into.

private final int
valueLength

If positive, length of the expected final value, after truncation if any, in characters.

Constructor Summary

AccessConstructor and Description
public
ReaderToUTF8Stream(Reader
application reader
appReader
,
int
the expected length of the reader in characters (positive), or the inverse (maxColWidth * -1) of the maximum column width if the expected stream length is unknown
valueLength
,
int
the number of trailing blanks to truncate
numCharsToTruncate
,
String
type name of the column data is inserted into
typeName
,
StreamHeaderGenerator
the stream header generator
headerGenerator
)

Create a stream that will truncate trailing blanks if required/allowed.

public
ReaderToUTF8Stream(Reader
application reader
appReader
,
int
maximum allowed length in number of characters for the reader, typically the maximum field size
maximumLength
,
String
type name of the column data is inserted into
typeName
,
StreamHeaderGenerator
the stream header generator
headerGenerator
)

Creates a UTF-8 stream for an application reader whose length isn't known at insertion time.

Method Summary

Modifier and TypeMethod and Description
public final int
available()

Overrides java.io.InputStream.available.

Return an optimized version of bytes available to read from the stream.

private boolean
canTruncate()

Determine if trailing blank truncation is allowed.

private void
checkSufficientData()

Validate the length of the stream, take corrective action if allowed.

public void
close()

Overrides java.io.InputStream.close.

Implements java.io.Closeable.close.

return resources

private void
fillBuffer(int
offset at which to start filling the buffer, used to avoid overwriting the stream header data on the first iteration
startingOffset
)

Fills the internal buffer with data read from the source stream.

public void
mark(int
the maximum limit of bytes that can be read before the mark position becomes invalid
readAheadLimit
)

Overrides java.io.InputStream.mark.

Marks the current position in the stream.

public boolean

Returns:

true, mark/reset is always supported.
markSupported
()

Overrides java.io.InputStream.markSupported.

Tests if this stream supports mark/reset.

public int

Returns:

The byte read, or -1 if the end-of-stream is reached.
read
()

Implements abstract java.io.InputStream.read.

Reads a byte from the stream.

public int

Returns:

The number of bytes read, or -1 if the end-of-stream is reached.
read
(byte[]
the buffer into which the data is read.
b
,
int
the start offset in array b at which the data is written.
off
,
int
the maximum number of bytes to read.
len
)

Overrides java.io.InputStream.read.

Reads up to len bytes from the stream.

public void
reset()

Overrides java.io.InputStream.reset.

Repositions this stream to the position at the time the mark method was last called on this input stream.

private void
truncate()

Attempt to truncate the stream by removing trailing blanks.

Inherited from java.io.InputStream:
nullInputStreamreadreadAllBytesreadNBytesreadNBytesskipskipNBytestransferTo

Field Detail

blenback to summary
private int blen
boffback to summary
private int boff
bufferback to summary
private byte[] buffer

Buffer to hold the data read from stream and converted to the modified UTF-8 format. The initial size is dependent on whether the data value length is known (limited upwards to 32 KB), but it may grow if mark(int) is invoked.

charCountback to summary
private int charCount

The number of chars encoded.

charsToTruncateback to summary
private final int charsToTruncate

Number of characters to truncate from this stream. The SQL standard allows for truncation of trailing spaces for CLOB, VARCHAR and CHAR. If zero, no characters are truncated, unless the stream length exceeds the maximum length of the column we are inserting into.

eofback to summary
private boolean eof
FIRST_READback to summary
private static final int FIRST_READ

Constant indicating the first iteration of fillBuffer.

hdrGenback to summary
private final StreamHeaderGenerator hdrGen

The generator for the stream header to use for this stream.

See Also
checkSufficientData()
headerLengthback to summary
private int headerLength

The length of the header.

markback to summary
private int mark

Stream mark, set through mark(int).

MARK_UNSET_OR_EXCEEDEDback to summary
private static final int MARK_UNSET_OR_EXCEEDED

Constant indicating that no mark is set in the stream, or that the read ahead limit of the mark has been exceeded.

multipleBufferback to summary
private boolean multipleBuffer

Tells if the stream content is/was larger than the buffer size.

READ_BUFFER_RESERVATIONback to summary
private static final int READ_BUFFER_RESERVATION

Buffer space reserved for one 3 byte encoded char and the EOF marker.

readAheadLimitback to summary
private int readAheadLimit

Read ahead limit for mark, set through mark(int).

readerback to summary
private LimitReader reader

Application's reader wrapped in a LimitReader.

SPACEback to summary
private static final char SPACE
typeNameback to summary
private final String typeName

The type name for the column data is inserted into.

valueLengthback to summary
private final int valueLength

If positive, length of the expected final value, after truncation if any, in characters. If negative, the maximum length allowed in the column we are inserting into. A negative value means we are working with a stream of unknown length, inserted through one of the JDBC 4.0 "lengthless override" methods.

Constructor Detail

ReaderToUTF8Streamback to summary
public ReaderToUTF8Stream(Reader appReader, int valueLength, int numCharsToTruncate, String typeName, StreamHeaderGenerator headerGenerator)

Create a stream that will truncate trailing blanks if required/allowed. If the stream must be truncated, the number of blanks to truncate is specified to allow the stream to be checked for exact length, as required by JDBC 3.0. If the stream is shorter or longer than specified, an exception is thrown during read.

Parameters
appReader:Reader

application reader

valueLength:int

the expected length of the reader in characters (positive), or the inverse (maxColWidth * -1) of the maximum column width if the expected stream length is unknown

numCharsToTruncate:int

the number of trailing blanks to truncate

typeName:String

type name of the column data is inserted into

headerGenerator:StreamHeaderGenerator

the stream header generator

ReaderToUTF8Streamback to summary
public ReaderToUTF8Stream(Reader appReader, int maximumLength, String typeName, StreamHeaderGenerator headerGenerator)

Creates a UTF-8 stream for an application reader whose length isn't known at insertion time.

The application reader is coming in through one of the "lengthless overrides" added in JDBC 4.0, for instance java.sql.PreparedStatement.setCharacterStream(int,Reader). A limit is placed on the length of the application reader. If the reader exceeds the maximum length, truncation of trailing blanks is attempted. If truncation fails, an exception is thrown.

Parameters
appReader:Reader

application reader

maximumLength:int

maximum allowed length in number of characters for the reader, typically the maximum field size

typeName:String

type name of the column data is inserted into

headerGenerator:StreamHeaderGenerator

the stream header generator

Exceptions
IllegalArgumentException:
if maximum length is negative

Method Detail

availableback to summary
public final int available()

Overrides java.io.InputStream.available.

Return an optimized version of bytes available to read from the stream.

Note, it is not exactly per java.io.InputStream#available().

Returns:int

Doc from java.io.InputStream.available.

an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking or 0 when it reaches the end of the input stream.

canTruncateback to summary
private boolean canTruncate()

Determine if trailing blank truncation is allowed.

checkSufficientDataback to summary
private void checkSufficientData() throws IOException

Validate the length of the stream, take corrective action if allowed. JDBC 3.0 (from tutorial book) requires that an input stream has the correct number of bytes in the stream. If the stream is too long, trailing blank truncation is attempted if allowed. If truncation fails, or is disallowed, an exception is thrown.

Exceptions
IOException:
if an errors occurs in the application stream
DerbyIOException:
if Derby finds a problem with the stream; stream is too long and cannot be truncated, or the stream length does not match the specified length
closeback to summary
public void close()

Overrides java.io.InputStream.close.

Implements java.io.Closeable.close.

return resources

fillBufferback to summary
private void fillBuffer(int startingOffset) throws IOException

Fills the internal buffer with data read from the source stream.

The characters read from the source are converted to the modified UTF-8 encoding, used as the on-disk format by Derby.

Parameters
startingOffset:int

offset at which to start filling the buffer, used to avoid overwriting the stream header data on the first iteration

Exceptions
IOException:
if reading from the source stream fails
DerbyIOException:
if the source stream has an invalid length (different than specified), or if truncation of blanks fails
markback to summary
public void mark(int readAheadLimit)

Overrides java.io.InputStream.mark.

Marks the current position in the stream.

Note that this stream is not marked at position zero by default (i.e. in the constructor).

Parameters
readAheadLimit:int

the maximum limit of bytes that can be read before the mark position becomes invalid

markSupportedback to summary
public boolean markSupported()

Overrides java.io.InputStream.markSupported.

Tests if this stream supports mark/reset.

The markSupported method of ByteArrayInputStream always returns true.

Returns:boolean

true, mark/reset is always supported.

readback to summary
public int read() throws IOException

Implements abstract java.io.InputStream.read.

Reads a byte from the stream.

Characters read from the source stream are converted to the UTF-8 Derby specific encoding.

Returns:int

The byte read, or -1 if the end-of-stream is reached.

Exceptions
IOException:
if reading from the source stream fails
EOFException:
if the end-of-stream has already been reached or the stream has been closed
See Also
java.io.InputStream#read()
readback to summary
public int read(byte[] b, int off, int len) throws IOException

Overrides java.io.InputStream.read.

Reads up to len bytes from the stream.

Characters read from the source stream are converted to the UTF-8 Derby specific encoding.

Parameters
b:byte[]

Doc from java.io.InputStream.read.

the buffer into which the data is read.

off:int

Doc from java.io.InputStream.read.

the start offset in array b at which the data is written.

len:int

Doc from java.io.InputStream.read.

the maximum number of bytes to read.

Returns:int

The number of bytes read, or -1 if the end-of-stream is reached.

Exceptions
IOException:
if reading from the source stream fails
EOFException:
if the end-of-stream has already been reached or the stream has been closed
See Also
java.io.InputStream#read(byte[], int, int)
resetback to summary
public void reset() throws IOException

Overrides java.io.InputStream.reset.

Repositions this stream to the position at the time the mark method was last called on this input stream.

Exceptions
IOException:
if no mark has been set, or the read ahead limit of the mark has been exceeded
EOFException:
if the stream has been closed
truncateback to summary
private void truncate() throws IOException

Attempt to truncate the stream by removing trailing blanks.