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 booleanprivate DRDAConnThreadprivate byte[]private CcsidManagerprivate intprivate long[]private longprivate static final intprivate booleanprivate intprivate booleanprivate booleanprivate booleanprivate intprivate DssTraceprivate EbcdicCcsidManagerprivate static final intprivate InputStreamprivate static final longprivate static final intprivate static final booleanprivate static final intprivate intprivate intprivate intprivate static final int[][]private booleanprivate int(package private) longprivate 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 voidadjustLengths(int length) Adjust remaining lengthprotected voidprivate voidcompressBLayerData(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 StringconvertBytes(byte[] buf) Convert EBCDIC byte array to unicode string(package private) booleanprivate voidensureALayerDataInBuffer(int desiredDataSize) Make sure a certain amount of Layer A data is in the buffer.private voidensureBLayerDataInBuffer(int desiredDataSize, boolean adjustLen) Make sure a certain amount of Layer B data is in the buffer.private voidensureSpaceInBufferForFill(int desiredSpace) This method makes sure there is enough room in the buffer for a certain number of bytes.private voidfill(int minimumBytesNeeded) This method will attempt to read a minimum number of bytes from the underlying stream.private voidprotected intGet the next CodePoint from a collectionprotected intgetCodePoint(int codePointCheck) Get the next CodePoint from a collection and check that it matches the specified CodePointprotected byteReturn chaining bit for current DSS.protected longLength of current DDM object(package private) byte[]getExtData(long desiredLength, boolean checkNullability) (package private) EXTDTAReaderInputStreamgetEXTDTAReaderInputStream(boolean checkNullability) Creates an InputStream which can stream EXTDTA objects.protected voidinitialize(DRDAConnThread agent, DssTrace dssTrace) Initialize values for this session, the reader is reused so we need to set null and 0 valuesprotected booleanNext DSS has different correlator than current DSSprotected booleanNext DSS has same correlator as current DSSprotected booleanisCmd()Check for the command protocolprivate booleanprotected voidPush DDM Length on to collection stackprotected booleanmoreData()Is there more data in the bufferprotected booleanIs there more in this DDM objectprotected booleanIs there more in this DDS objectprivate intpackedNybblesToInt(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 9 digits without overflow) to an int.private longpackedNybblesToLong(byte[] buffer, int offset, int startNybble, int numberOfNybbles) Convert a range of packed nybbles (up to 18 digits without overflow) to a long.protected BigDecimalreadBigDecimal(int precision, int scale) Read a BigDecimal valueprotected bytereadByte()Read byte valueprotected byte[]Read byte string valueprotected byte[]readBytes(int length) Read byte string valueprotected StringRead string valueprotected StringreadCmdString(int length) Read string valueprotected intRead the CodePointprotected doublereadDouble(int byteOrder) Read platform double valueprivate voidprotected intRead 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 StringreadEncryptedString(DecryptionManager decryptM, int securityMechanism, byte[] initVector, byte[] sourcePublicKey) Read encrypted stringprotected floatreadFloat(int byteOrder) Read platform float valueprotected intreadInt(int byteOrder) Read platform int valueprotected StringreadLDStringData(String encoding) Read length delimited string value in DDM data with default encodingprotected intreadLengthAndCodePoint(boolean isLayerBStreamingPossible) Read the DDM Length and CodePointprivate ByteArrayInputStreamreadLOBChunk(boolean readHeader, long desiredLength) This method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStreamThis method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStreamreadLOBContinuationStream(long desiredLength) This method is used by EXTDTAReaderInputStream to read the next chunk of data.(package private) ByteArrayInputStreamThis method is used by EXTDTAReaderInputStream to read the first chunk of data.(package private) ByteArrayInputStreamreadLOBInitStream(long desiredLength) This method is used by EXTDTAReaderInputStream to read the first chunk of data.protected longreadLong(int byteOrder) Read platform long valueprotected intRead network int valueprotected longRead network long valueprotected intRead network short valueprotected longRead network six byte value and put it in a long vprotected voidRead Reply DSS This is used in testing the protocol.protected shortreadShort(int byteOrder) Read platform short valueprotected intRead signed network short valueprotected StringRead string valueprotected StringreadString(int length) Read string value Strings in DRDA protocol are encoded in EBCDIC by default so we need to convert to UCS2protected StringreadString(int length, String encoding) Read encoded string valueprotected voidreadString(DRDAString dst, int size, boolean unpad) Read string value into aDRDAStringobject.protected StringreadStringData(int length) Read specified length of string value in DDM data with default encodingprotected intRead byte value and mask out high order bytes before returningprotected voidprotected voidprivate voidshiftBuffer(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 voidSkip byte string valueprotected voidskipBytes(int length) Skip byte string valueprotected voidskipDss()Skip remaining DSSprivate voidprotected booleanprivate voidPrint 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 aDRDAStringobject.- 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()
-