Class DDMReader
At layer A are request, reply and data correlation, structure chaining, continuation or termination of chains when errors are detected, interleaving and multi-leaving request, reply, and data DSSs for multitasking environments. For TCP/IP, the format of the DDM envelope is 2 bytes Length of the data 1 byte 'D0' - indicates DDM data 1 byte DDM format byte(DSSFMT) - type of DSS(RQSDSS,RPYDSS), whether it is chained, information about the next chained DSS 2 bytes request correlation identifier
The correlation identifier ties together a request, the request data and the reply. In a chained DSS, each request has a correlation identifier which is higher than the previous request (all correlation identifiers must be greater than 0).
At layer B are object mapping, object validation and command routing. Layer B objects with data 5 bytes less than 32K bytes consist of 2 bytes Length 2 bytes Type of the object (code point) Object data Object data is either SCALAR or COLLECTION data. Scalar data consists of a string of bytes formatted as the class description of the object required. Collections consist of a set of objects in which the entries in the collection are nested within the length/ code point of the collection.
Layer B objects with data >=32763 bytes long format is 2 bytes Length - length of class, length, and extended total length fields (high order bit set, indicating >=32763) 2 bytes Type of the object (code point) n bytes Extended total length - length of the object (n = Length - 4) Object data
At layer C are services each class of DDM object provides. |-------------------------------------------| Layer C | Specific | Specific | Specific | | Commands | Replies | Scalars and | | and their | and their | Collections | |-------------------------------------------|----------------| Layer B | Commands | Reply | Scalars and | Communications | | | Messages | Collections | | |-----------|---------------|---------------|----------------| Layer A | RQSDSS | RPYDSS | OBJDSS | CMNDSS | | | | | Mapped Data | |-----------|---------------|---------------|----------------| | DDM Data Stream Structures | |------------------------------------------------------------| DSS's may be chained so that more than one can be transmitted at a time to improve performance. For more details, see DRDA Volume 3 (Distributed Data Management(DDM) Architecture (DDS definition)
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final boolean
private DRDAConnThread
private byte[]
private CcsidManager
private int
private long[]
private long
private static final int
private boolean
private int
private boolean
private boolean
private boolean
private int
private DssTrace
private EbcdicCcsidManager
private static final int
private InputStream
private static final long
private static final int
private static final boolean
private static final int
private int
private int
private int
private static final int[][]
private boolean
private int
(package private) long
private Utf8CcsidManager
-
Constructor Summary
ConstructorsConstructorDescriptionDDMReader
(InputStream inputStream) This constructor is used for testing the protocol It is used by ProtocolTestAdapter to read the protocol returned by the serverDDMReader
(DRDAConnThread agent, DssTrace dssTrace) -
Method Summary
Modifier and TypeMethodDescriptionprivate void
adjustLengths
(int length) Adjust remaining lengthprotected void
private void
compressBLayerData
(int continueDssHeaderCount) Compress B Layer data if extended total length is used by removing the continuation headersprivate int[]
computeMagnitude
(int[] input) Compute the int array of magnitude from input value segments.protected String
convertBytes
(byte[] buf) Convert EBCDIC byte array to unicode string(package private) boolean
private void
ensureALayerDataInBuffer
(int desiredDataSize) Make sure a certain amount of Layer A data is in the buffer.private void
ensureBLayerDataInBuffer
(int desiredDataSize, boolean adjustLen) Make sure a certain amount of Layer B data is in the buffer.private void
ensureSpaceInBufferForFill
(int desiredSpace) This method makes sure there is enough room in the buffer for a certain number of bytes.private void
fill
(int minimumBytesNeeded) This method will attempt to read a minimum number of bytes from the underlying stream.private void
protected int
Get the next CodePoint from a collectionprotected int
getCodePoint
(int codePointCheck) Get the next CodePoint from a collection and check that it matches the specified CodePointprotected byte
Return chaining bit for current DSS.protected long
Length of current DDM object(package private) byte[]
getExtData
(long desiredLength, boolean checkNullability) (package private) EXTDTAReaderInputStream
getEXTDTAReaderInputStream
(boolean checkNullability) Creates an InputStream which can stream EXTDTA objects.protected void
initialize
(DRDAConnThread agent, DssTrace dssTrace) Initialize values for this session, the reader is reused so we need to set null and 0 valuesprotected boolean
Next DSS has different correlator than current DSSprotected boolean
Next DSS has same correlator as current DSSprotected boolean
isCmd()
Check for the command protocolprivate boolean
protected void
Push DDM Length on to collection stackprotected boolean
moreData()
Is there more data in the bufferprotected boolean
Is there more in this DDM objectprotected boolean
Is there more in this DDS objectprivate int
packedNybblesToInt
(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 9 digits without overflow) to an int.private long
packedNybblesToLong
(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 18 digits without overflow) to a long.protected BigDecimal
readBigDecimal
(int precision, int scale) Read a BigDecimal valueprotected byte
readByte()
Read byte valueprotected byte[]
Read byte string valueprotected byte[]
readBytes
(int length) Read byte string valueprotected String
Read string valueprotected String
readCmdString
(int length) Read string valueprotected int
Read the CodePointprotected double
readDouble
(int byteOrder) Read platform double valueprivate void
protected int
Read DSS header DSS Header format is 2 bytes - length 1 byte - 'D0' - indicates DDM data 1 byte - DSS format |---|---------|----------| | 0 | flags | type | |---|---------|----------| | 0 | 1 2 3 | 4 5 6 7 | |---|---------|----------| bit 0 - '0' bit 1 - '0' - unchained, '1' - chained bit 2 - '0' - do not continue on error, '1' - continue on error bit 3 - '0' - next DSS has different correlator, '1' - next DSS has same correlator type - 1 - Request DSS - 2 - Reply DSS - 3 - Object DSS - 4 - Communications DSS - 5 - Request DSS where no reply is expected 2 bytes - request correlation idprotected String
readEncryptedString
(DecryptionManager decryptM, int securityMechanism, byte[] initVector, byte[] sourcePublicKey) Read encrypted stringprotected float
readFloat
(int byteOrder) Read platform float valueprotected int
readInt
(int byteOrder) Read platform int valueprotected String
readLDStringData
(String encoding) Read length delimited string value in DDM data with default encodingprotected int
readLengthAndCodePoint
(boolean isLayerBStreamingPossible) Read the DDM Length and CodePointprivate ByteArrayInputStream
readLOBChunk
(boolean readHeader, long desiredLength) This method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStream
This method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStream
readLOBContinuationStream
(long desiredLength) This method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStream
This method is used by EXTDTAReaderInputStream to read the first chunk of data.(package private) ByteArrayInputStream
readLOBInitStream
(long desiredLength) This method is used by EXTDTAReaderInputStream to read the first chunk of data.protected long
readLong
(int byteOrder) Read platform long valueprotected int
Read network int valueprotected long
Read network long valueprotected int
Read network short valueprotected long
Read network six byte value and put it in a long vprotected void
Read Reply DSS This is used in testing the protocol.protected short
readShort
(int byteOrder) Read platform short valueprotected int
Read signed network short valueprotected String
Read string valueprotected String
readString
(int length) Read string value Strings in DRDA protocol are encoded in EBCDIC by default so we need to convert to UCS2protected String
readString
(int length, String encoding) Read encoded string valueprotected void
readString
(DRDAString dst, int size, boolean unpad) Read string value into aDRDAString
object.protected String
readStringData
(int length) Read specified length of string value in DDM data with default encodingprotected int
Read byte value and mask out high order bytes before returningprotected void
protected void
private void
shiftBuffer
(byte[] destinationBuffer) This is a helper method which shifts the buffered bytes from wherever they are in the current buffer to the beginning of different buffer (note these buffers could be the same).protected void
Skip byte string valueprotected void
skipBytes
(int length) Skip byte string valueprotected void
skipDss()
Skip remaining DSSprivate void
protected boolean
private void
Print a internal trace message
-
Field Details
-
DEFAULT_BUFFER_SIZE
private static final int DEFAULT_BUFFER_SIZE- See Also:
-
MAX_MARKS_NESTING
private static final int MAX_MARKS_NESTING- See Also:
-
NO_CODEPOINT
private static final int NO_CODEPOINT- See Also:
-
EMPTY_STACK
private static final int EMPTY_STACK- See Also:
-
ADJUST_LENGTHS
private static final boolean ADJUST_LENGTHS- See Also:
-
NO_ADJUST_LENGTHS
private static final boolean NO_ADJUST_LENGTHS- See Also:
-
MAX_EXTDTA_SIZE
private static final long MAX_EXTDTA_SIZE- See Also:
-
tenRadixMagnitude
private static final int[][] tenRadixMagnitude -
agent
-
utf8CcsidManager
-
ebcdicCcsidManager
-
ccsidManager
-
buffer
private byte[] buffer -
pos
private int pos -
count
private int count -
topDdmCollectionStack
private int topDdmCollectionStack -
ddmCollectionLenStack
private long[] ddmCollectionLenStack -
ddmScalarLen
private long ddmScalarLen -
dssLength
private int dssLength -
dssIsContinued
private boolean dssIsContinued -
terminateChainOnErr
private boolean terminateChainOnErr -
dssIsChainedWithSameID
private boolean dssIsChainedWithSameID -
dssIsChainedWithDiffID
private boolean dssIsChainedWithDiffID -
dssCorrelationID
private int dssCorrelationID -
prevCorrelationID
private int prevCorrelationID -
svrcod
private int svrcod -
dssTrace
-
inputStream
-
doingLayerBStreaming
private boolean doingLayerBStreaming -
totalByteCount
volatile long totalByteCount
-
-
Constructor Details
-
DDMReader
DDMReader(DRDAConnThread agent, DssTrace dssTrace) -
DDMReader
DDMReader(InputStream inputStream) This constructor is used for testing the protocol It is used by ProtocolTestAdapter to read the protocol returned by the server
-
-
Method Details
-
initialize
Initialize values for this session, the reader is reused so we need to set null and 0 values -
setUtf8Ccsid
protected void setUtf8Ccsid() -
setEbcdicCcsid
protected void setEbcdicCcsid() -
terminateChainOnErr
protected boolean terminateChainOnErr() -
isChainedWithSameID
protected boolean isChainedWithSameID()Next DSS has same correlator as current DSS- Returns:
- true if next DSS has the same correlator as current DSS
-
isChainedWithDiffID
protected boolean isChainedWithDiffID()Next DSS has different correlator than current DSS- Returns:
- true if next DSS has a different correlator than current DSS
-
getDdmLength
protected long getDdmLength()Length of current DDM object- Returns:
- length of DDM object
-
moreDdmData
protected boolean moreDdmData()Is there more in this DDM object- Returns:
- true if DDM length is > 0
-
moreDssData
protected boolean moreDssData()Is there more in this DDS object- Returns:
- true if DDS length is > 0
-
moreData
protected boolean moreData()Is there more data in the buffer- Returns:
- true if there is more data in the buffer
-
isCmd
Check for the command protocol- Returns:
- true if this is a command; false otherwise
- Throws:
DRDAProtocolException
- if a protocol error is detectedUnsupportedEncodingException
-
readDssHeader
Read DSS header DSS Header format is 2 bytes - length 1 byte - 'D0' - indicates DDM data 1 byte - DSS format |---|---------|----------| | 0 | flags | type | |---|---------|----------| | 0 | 1 2 3 | 4 5 6 7 | |---|---------|----------| bit 0 - '0' bit 1 - '0' - unchained, '1' - chained bit 2 - '0' - do not continue on error, '1' - continue on error bit 3 - '0' - next DSS has different correlator, '1' - next DSS has same correlator type - 1 - Request DSS - 2 - Reply DSS - 3 - Object DSS - 4 - Communications DSS - 5 - Request DSS where no reply is expected 2 bytes - request correlation id- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readReplyDss
Read Reply DSS This is used in testing the protocol. We shouldn't see a reply DSS when we are servicing DRDA commands- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readLengthAndCodePoint
protected int readLengthAndCodePoint(boolean isLayerBStreamingPossible) throws DRDAProtocolException Read the DDM Length and CodePoint- Parameters:
isLayerBStreamingPossible
- true only when layer B streaming is possible- Returns:
- - returns codepoint
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readCodePoint
protected int readCodePoint()Read the CodePoint- Returns:
- - returns codepoint
-
markCollection
protected void markCollection()Push DDM Length on to collection stack -
getCodePoint
Get the next CodePoint from a collection- Returns:
- NO_CODEPOINT if collection stack is empty or remaining length is 0; otherwise, read length and code point
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
getCodePoint
Get the next CodePoint from a collection and check that it matches the specified CodePoint- Parameters:
codePointCheck
- - codePoint to check against- Returns:
- codePoint
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readByte
Read byte value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readUnsignedByte
Read byte value and mask out high order bytes before returning- Returns:
- value
- Throws:
DRDAProtocolException
-
readNetworkShort
Read network short value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readSignedNetworkShort
Read signed network short value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readShort
Read platform short value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readNetworkInt
Read network int value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readInt
Read platform int value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readNetworkLong
Read network long value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readNetworkSixByteLong
Read network six byte value and put it in a long v- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readLong
Read platform long value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readFloat
Read platform float value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readDouble
Read platform double value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readBigDecimal
Read a BigDecimal value- Parameters:
precision
- of the BigDecimalscale
- of the BigDecimal- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
getEXTDTAReaderInputStream
EXTDTAReaderInputStream getEXTDTAReaderInputStream(boolean checkNullability) throws DRDAProtocolException Creates an InputStream which can stream EXTDTA objects. The InputStream uses this DDMReader to read data from network. The DDMReader should not be used before all data in the stream has been read.- Parameters:
checkNullability
- used to check if the stream is null. If it is null, this method returns null- Returns:
- EXTDTAReaderInputStream object which can be passed to prepared statement as a binary stream.
- Throws:
DRDAProtocolException
- standard DRDA protocol exception
-
readLOBInitStream
This method is used by EXTDTAReaderInputStream to read the first chunk of data. This lengthless method must be called only when layer B streaming.- Throws:
DRDAProtocolException
- standard DRDA protocol exception
-
readLOBInitStream
This method is used by EXTDTAReaderInputStream to read the first chunk of data.- Parameters:
desiredLength
- the desired length of chunk. This parameter is ignored when layerB Streaming is doing.- Throws:
DRDAProtocolException
- standard DRDA protocol exception
-
readLOBContinuationStream
This method is used by EXTDTAReaderInputStream to read the next chunk of data. Calling this method finishes layer B streaming if continuation of DSS segment was finished. This lengthless method must be called only when layer B streaming.- Throws:
IOException
- IOException
-
readLOBContinuationStream
This method is used by EXTDTAReaderInputStream to read the next chunk of data. Furthermore, when Layer B streaming is carried out, calling this method finishes layer B streaming if continuation of DSS segment was finished.- Parameters:
desiredLength
- the desired length of chunk. This parameter is ignored when layerB Streaming is doing.- Throws:
IOException
- IOException
-
readLOBChunk
private ByteArrayInputStream readLOBChunk(boolean readHeader, long desiredLength) throws DRDAProtocolException This method is used by EXTDTAReaderInputStream to read the next chunk of data. Furthermore, when Layer B streaming is carried out, calling this method may finish layer B streaming.- Parameters:
readHeader
- set to true if the dss continuation should be readdesiredLength
- the desired length of chunk. This parameter is ignored when layerB Streaming is doing.- Throws:
DRDAProtocolException
- standard DRDA protocol exception
-
getExtData
- Throws:
DRDAProtocolException
-
readDSSContinuationHeader
- Throws:
DRDAProtocolException
-
isEXTDTANull
- Throws:
DRDAProtocolException
-
packedNybblesToInt
private int packedNybblesToInt(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 9 digits without overflow) to an int. Note that for performance purpose, it does not do array-out-of-bound checking.- Parameters:
buffer
- buffer to read fromoffset
- offset in the bufferstartNybble
- start nybblenumberOfNybbles
- number of nybbles- Returns:
- an int value
-
packedNybblesToLong
private long packedNybblesToLong(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 18 digits without overflow) to a long. Note that for performance purpose, it does not do array-out-of-bound checking.- Parameters:
buffer
- buffer to read fromoffset
- offset in the bufferstartNybble
- start nybblenumberOfNybbles
- number of nybbles- Returns:
- an long value
-
computeMagnitude
private int[] computeMagnitude(int[] input) Compute the int array of magnitude from input value segments.- Parameters:
input
- value segments- Returns:
- array of int magnitudes
-
readEncryptedString
protected String readEncryptedString(DecryptionManager decryptM, int securityMechanism, byte[] initVector, byte[] sourcePublicKey) throws DRDAProtocolException, SQLException Read encrypted string- Parameters:
decryptM
- decryption managersecurityMechanism
- security mechanisminitVector
- initialization vector for ciphersourcePublicKey
- public key (as in Deffie-Hellman algorithm) from source (encryptor)- Returns:
- decrypted string
- Throws:
DRDAProtocolException
- if a protocol error is detectedSQLException
- wrapping any exception in decryption
-
readString
Read string value Strings in DRDA protocol are encoded in EBCDIC by default so we need to convert to UCS2- Parameters:
length
- - length of string to read- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readString
Read string value into aDRDAString
object.- Parameters:
dst
- destination for the read stringsize
- size (in bytes) of string to readunpad
- if true, remove padding (trailing spaces)- Throws:
DRDAProtocolException
-
readString
Read encoded string value- Parameters:
length
- - length of string to read- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readStringData
Read specified length of string value in DDM data with default encoding- Parameters:
length
- - length of string to read- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readLDStringData
Read length delimited string value in DDM data with default encoding- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readString
Read string value- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readBytes
Read byte string value- Parameters:
length
- - length of string to read- Returns:
- byte array
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
readBytes
Read byte string value- Returns:
- byte array
- Throws:
DRDAProtocolException
- if a protocol error is detected
-
skipBytes
Skip byte string value- Parameters:
length
- - length of string to skip- Throws:
DRDAProtocolException
- if a protocol error is detected
-
skipBytes
Skip byte string value- Throws:
DRDAProtocolException
-
skipDss
Skip remaining DSS- Throws:
DRDAProtocolException
-
clearBuffer
- Throws:
DRDAProtocolException
-
convertBytes
Convert EBCDIC byte array to unicode string- Parameters:
buf
- - byte array- Returns:
- string
-
adjustLengths
private void adjustLengths(int length) Adjust remaining length- Parameters:
length
- - adjustment length
-
readCmdString
protected String readCmdString(int length) throws DRDAProtocolException, UnsupportedEncodingException Read string value- Parameters:
length
- - length of string to read- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detectedUnsupportedEncodingException
-
readCmdString
Read string value- Returns:
- value
- Throws:
DRDAProtocolException
- if a protocol error is detectedUnsupportedEncodingException
-
ensureALayerDataInBuffer
Make sure a certain amount of Layer A data is in the buffer. The data will be in the buffer after this method is called.- Parameters:
desiredDataSize
- - amount of data we need- Throws:
DRDAProtocolException
-
ensureBLayerDataInBuffer
private void ensureBLayerDataInBuffer(int desiredDataSize, boolean adjustLen) throws DRDAProtocolException Make sure a certain amount of Layer B data is in the buffer. The data will be in the buffer after this method is called.- Parameters:
desiredDataSize
- - amount of data we needadjustLen
- - whether to adjust the remaining lengths- Throws:
DRDAProtocolException
- if a protocol error is detected
-
compressBLayerData
Compress B Layer data if extended total length is used by removing the continuation headers- Parameters:
continueDssHeaderCount
- - amount of data we need- Throws:
DRDAProtocolException
-
shiftBuffer
private void shiftBuffer(byte[] destinationBuffer) This is a helper method which shifts the buffered bytes from wherever they are in the current buffer to the beginning of different buffer (note these buffers could be the same). State information is updated as needed after the shift.- Parameters:
destinationBuffer
- - buffer to shift data to
-
ensureSpaceInBufferForFill
private void ensureSpaceInBufferForFill(int desiredSpace) This method makes sure there is enough room in the buffer for a certain number of bytes. This method will allocate a new buffer if needed and shift the bytes in the current buffer to make ensure space is available for a fill. Right now this method will shift bytes as needed to make sure there is as much room as possible in the buffer before trying to do the read. The idea is to try to have space to get as much data as possible if we need to do a read on the socket's stream.- Parameters:
desiredSpace
- - amount of data we need
-
fill
This method will attempt to read a minimum number of bytes from the underlying stream. This method will keep trying to read bytes until it has obtained at least the minimum number.- Parameters:
minimumBytesNeeded
- - minimum required bytes- Throws:
DRDAProtocolException
- if a protocol error is detected
-
trace
Print a internal trace message -
getCurrChainState
protected byte getCurrChainState()Return chaining bit for current DSS. -
startLayerBStreaming
private void startLayerBStreaming() -
finishLayerBStreaming
private void finishLayerBStreaming() -
doingLayerBStreaming
boolean doingLayerBStreaming()
-