public class SwiftMessage
extends java.lang.Object
implements java.io.Serializable
Base class for swift messages.
This class is a generic data structure container for SWIFT messages.
This is a low level java representation of an MT. If you are looking for
a class more suitable to be persisted see MtSwiftMessage
Instances of this class may have a list of unparsed texts (UnparsedTextList).
For easy access, methods have been created that first ensure the lists exists (the
real object is created and then call the base method).
However, not all the base list methods have been implemented. If you need to use not
exposed functionality, retrieve the underlying list with (see getUnparsedTexts method).
Modifier and Type | Field and Description |
---|---|
protected java.lang.Long |
id
Identification of the message when persisted
|
Constructor and Description |
---|
SwiftMessage()
Default constructor.
|
SwiftMessage(boolean initBlocks)
Constructor that initializes blocks
TODO document hibernate didn't work
|
SwiftMessage(boolean initBlocks,
UnparsedTextList unparsedText)
Constructor for an unparsed text list that initializes blocks
|
SwiftMessage(UnparsedTextList unparsedText)
Constructor for an unparsed text list
|
Modifier and Type | Method and Description |
---|---|
void |
addBlock(SwiftBlock b)
Add a block to this message.
|
void |
addUserBlock(SwiftBlockUser userBlock)
Add a user defined block to the message (if the block already exists, it is replaced)
|
void |
clear()
remove all blocks from these message, including user blocks
|
boolean |
equals(java.lang.Object obj) |
Field |
field(java.lang.String name)
return first results of fields() or
null if none |
java.util.List<Field> |
fields(java.lang.String... names)
Get all fields with the given name in the block 4.
|
java.lang.Integer |
fragmentCount()
Gets the total number of fragments of a fragmented message as informed in tag 203.
|
java.lang.Integer |
fragmentNumber()
Gets the number of this fragment
|
SwiftBlock |
getBlock(int b)
Get the block number specified by b.
|
SwiftBlock1 |
getBlock1()
Get block number 1 of this message, may be
null if not set |
SwiftBlock2 |
getBlock2()
Get block number 2 of this message, may be
null if not set |
SwiftBlock3 |
getBlock3()
Get block number 3 of this message, may be
null if not set |
SwiftBlock4 |
getBlock4()
Get block number 4 of this message, may be
null if not set |
SwiftBlock5 |
getBlock5()
Get block number 5 of this message, may be
null if not set |
int |
getBlockCount()
Get the number of blocks in this message, including the user blocks
|
int |
getBlockCount(java.lang.Boolean includeUserBlocks)
Get the number of blocks in this message, optionally including the user blocks.
A block is summed if it is not null and is not empty. |
MtCategory |
getCategory()
Returns the message category from the message type.
|
BIC |
getCorrespondentBIC()
Returns the correspondent BIC code from the headers.
For an outgoing message, the BIC address identifies the receiver of the message. |
MessageIOType |
getDirection()
Returns the message direction from block 2 or null if block 2 is not found or incomplete
|
java.lang.Long |
getId()
Get the unique identifier of this message
|
java.util.List<SwiftTagListBlock> |
getLinkages()
Return the message's LINK sequences if any.
|
java.lang.String |
getMIR()
The MIR (Message Input Reference) is a String of 28 characters, always local to the sender of the message.
|
MtId |
getMtId()
Returns the MT message identification.
Composed by the business process, message type and variant. |
java.lang.String |
getMUR()
Gets MUR (Message User Reference) from the user header block or null if the user header or MUR are not present.
|
SequenceNode |
getParsedSequences() |
java.lang.String |
getPDE()
Gets PDE (Possible Duplicate Emission) flag from the trailer block or null if the trailer or the PDE field is not present
|
java.lang.String |
getPDM()
Gets PDM from the trailer block or null if the trailer or the PDM field is not present
|
java.lang.String |
getReceiver()
Gets the message receiver BIC from the message headers.
|
java.lang.String |
getSender()
Gets the message sender BIC from the message headers.
|
java.util.List<java.lang.String> |
getTagNames()
Get a list of unique tagname contained in this message
|
java.lang.String |
getType()
Tell the message type associated with this object if a block 2 is present.
|
int |
getTypeInt()
get message type as an int or -1 if an error occurs or it is not set
|
java.lang.String |
getUID(java.util.Calendar created,
java.lang.Long id)
Gets a UID (Unique Identifier) for the message appending a suffix to the UUID generated with
getUUID() . |
UnparsedTextList |
getUnparsedTexts()
returns the unparsed text list
|
java.lang.Integer |
getUnparsedTextsSize()
returns the size of the unparsed text list
|
SwiftBlockUser |
getUserBlock(java.lang.Integer blockNumber)
Get a user defined block by number, may be
null if not set |
SwiftBlockUser |
getUserBlock(java.lang.String blockName)
Get a user defined block by name, may be
null if not set |
int |
getUserBlockPosition(java.lang.String blockName)
Finds the position of a given User Defined Block in the internal list
|
java.util.List<SwiftBlockUser> |
getUserBlocks()
Get the list of List of
SwiftBlockUser user defined blocks. |
java.lang.String |
getUUID()
Gets a UUID (User Unique Identifier) for the message conformed by:
Direction: A single-character direction indicator; "I" for an outgoing message (input to the network) and "O" for an incoming message (output from the network).
|
MTVariant |
getVariant() |
int |
hashCode() |
boolean |
isAck()
Returns true if this message is an ACK.
|
boolean |
isCategory(MtCategory... categories)
Returns true if the message category is equal to one of the given by parameter
|
boolean |
isCOV()
Checks if the message is a cover payment, based on the content of the User Header (block3).
|
java.lang.Boolean |
isFragment()
Checks if the message is a fragment
|
boolean |
isIncoming()
Returns true if the message is incoming (received from SWIFT), false other case; using the direction attribute.
|
boolean |
isInput() |
java.lang.Boolean |
isLastFragment()
Checks if the message is the last fragment
|
java.lang.Boolean |
isLinked()
Checks if the message is linked to other message based on the presence of a LINK sequence.
|
boolean |
isMT(java.lang.String type)
Deprecated.
this method has been deprecated in favor of
isType(int) which provides a safer API just passing an int number for the message type |
boolean |
isNack()
Returns true if this message is an NACK.
|
boolean |
isOutgoing()
Returns true if the message is outgoing (sent to SWIFT), false other case; using the direction attribute.
|
boolean |
isOutput() |
boolean |
isREMIT()
Checks if the message is a remit, based on the content of the User Header (block3).
|
boolean |
isServiceMessage()
Returns true if message service id is anything but 01 = GPA/FIN Message (system and user-to-user)
|
boolean |
isServiceMessage21()
Returns true if message service id is 21 = GPA/FIN Message (ACK/NAK/UAK/UNK)
|
boolean |
isSTP()
Checks if the message is Straight Through Processing (STP), based on the content of the User Header (block3).
|
boolean |
isSystemMessage()
Deprecated.
|
boolean |
isType(int... types)
Returns true if the message type is equal to one of the given numbers.
|
boolean |
isType(int type)
Returns true if the message type is equal to the given number.
|
static SwiftMessage |
parse(java.lang.String fin)
Parses a the string content into a SwiftMessage.
|
void |
removeEmptyBlocks()
Checks all blocks (1 to 5) and if a block is empty, it is removed from the message.
|
void |
removeUserBlock(java.lang.Integer blockNumber)
removes a user defined block to the message (if the block does not exists, nothing is done)
|
void |
removeUserBlock(java.lang.String blockName)
removes a user defined block to the message (if the block does not exists, nothing is done)
|
void |
setBlock1(SwiftBlock1 block1)
Set the block 1 of the message
|
void |
setBlock2(SwiftBlock2 block2)
Set the block 2 of the message
|
void |
setBlock3(SwiftBlock3 block3)
Set the block 3 of the message
|
void |
setBlock4(SwiftBlock4 block4)
Set the block 4 of the message
|
void |
setBlock5(SwiftBlock5 block5)
Set the block 5 of the message
|
void |
setId(java.lang.Long id)
Set the unique identifier of this message
|
void |
setParsedSequences(SequenceNode parsedSequences) |
void |
setUnparsedTexts(UnparsedTextList texts)
sets the list of unparsed texts
|
protected void |
setUserBlocks(java.util.List<SwiftBlockUser> userBlocks)
Set the list of user defined blocks.
This method is mainly needed for persistence services. |
java.lang.String |
toJson()
Get a json representation of this object.
|
AbstractMT |
toMT()
Get the MTxxx instance that corresponds to the current message type.
|
java.lang.String |
toString()
Commons-lang reflection toString implementation
|
java.lang.String |
toXml()
Gets a proprietary XML representation of this message.
Notice: it is neither a standard nor the MX version of this MT. |
void |
unparsedTextAddText(java.lang.String text)
adds a new unparsed text
|
void |
unparsedTextAddText(SwiftMessage message)
adds a new unparsed text from a message
|
SwiftMessage |
unparsedTextGetAsMessage(java.lang.Integer index)
get an unparsed text as a parsed swift message
|
java.lang.String |
unparsedTextGetText(java.lang.Integer index)
get an unparsed text
|
java.lang.Boolean |
unparsedTextIsMessage(java.lang.Integer index)
decides if a specific text (by index) is likely a SWIFT FIN message.
|
protected void |
unparsedTextVerify()
verifies that the unparsed text list exists
|
void |
visit(IMessageVisitor visitor)
Visit the current message with the given visitor.
|
static void |
visit(SwiftBlock3 block,
IMessageVisitor visitor)
Visit a Block 3 (SwiftBlock3), i.e: call the tag method for block 3
This method is called from
visit(IMessageVisitor) but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called. |
static void |
visit(SwiftBlock4 block,
IMessageVisitor visitor)
Visit a Block 4 (SwiftBlock4), i.e: call the tag method for block 4
This method is called from
visit(IMessageVisitor) but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called. |
static void |
visit(SwiftBlock5 block,
IMessageVisitor visitor)
Visit a Block 5 (SwiftBlock5), i.e: call the tag method for block 4
This method is called from
visit(IMessageVisitor) but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called. |
static void |
visit(SwiftBlockUser block,
IMessageVisitor visitor)
Visit a User Defined Block (SwiftBlockUser), i.e: call the tag method for block 4
This method is called from
visit(IMessageVisitor) but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called. |
public SwiftMessage()
SwiftMessage(boolean)
public SwiftMessage(boolean initBlocks)
initBlocks
- when false
the message will not have any blocks when constructed, if true
blocks are created, just like with default constructorpublic SwiftMessage(boolean initBlocks, UnparsedTextList unparsedText)
initBlocks
- when false
the message will not have any blocks when constructed, if true
blocks are created, just like with default consturctorunparsedText
- the list of unparsed textsSwiftMessage()
public SwiftMessage(UnparsedTextList unparsedText)
unparsedText
- the list of unparsed textsSwiftMessage()
public static final SwiftMessage parse(java.lang.String fin) throws java.io.IOException
fin
- string a string containing a swift MT messagejava.io.IOException
public SwiftBlock getBlock(int b)
b
- the block number to retrieve, must be greater or equal to 1 and smaller or equal to 5.java.lang.IllegalArgumentException
- if b < 1 or b > 5public java.lang.String toString()
toString
in class java.lang.Object
public void addBlock(SwiftBlock b)
Notes: on user blocks, no checks are done, on swift blocks, block number must be non null and have a value from 1-5 both inclusive
b
- the block to add, may be null
in which case nothing happensjava.lang.IllegalArgumentException
- b
is null
or the method getInt in the block returns a value out of range (non user blocks)@Deprecated @ProwideDeprecated(phase2=_2018) public boolean isMT(java.lang.String type)
isType(int)
which provides a safer API just passing an int number for the message typetype
- must be a valid registered handler idtrue
if this message is successfully identified as the given MT and false
in other case *java.lang.IllegalArgumentException
- if parameter type is null
or not a valid type (i.e: 3 chars len)SwiftBlock2.getMessageType()
,
getType()
public java.lang.String getType()
null
if the message does not have a block 2.SwiftBlock2.getMessageType()
public void visit(IMessageVisitor visitor)
visitor
- the visitor to usejava.lang.IllegalArgumentException
- if parameter visitor is null
SwiftWriter.writeMessage(SwiftMessage, java.io.Writer)
public static void visit(SwiftBlock3 block, IMessageVisitor visitor)
visit(IMessageVisitor)
but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called.
To serialize in SWIFT native format with block boundaries check SwiftWriter.writeBlock3(SwiftBlock3, java.io.Writer)
block
- the block containing the tags to visitvisitor
- the visitor to usejava.lang.IllegalArgumentException
- if parameter block or visitor are null
public static void visit(SwiftBlock4 block, IMessageVisitor visitor)
visit(IMessageVisitor)
but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called.
To serialize in SWIFT native format with block boundaries check SwiftWriter.writeBlock4(SwiftBlock4, java.io.Writer)
block
- the block containing the tags to visitvisitor
- the visitor to usejava.lang.IllegalArgumentException
- if parameter block or visitor are null
public static void visit(SwiftBlock5 block, IMessageVisitor visitor)
visit(IMessageVisitor)
but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called.
To serialize in SWIFT native format with block boundaries check SwiftWriter.writeBlock5(SwiftBlock5, java.io.Writer)
block
- the block containing the tags to visitvisitor
- the visitor to usejava.lang.IllegalArgumentException
- if parameter block or visitor are null
public static void visit(SwiftBlockUser block, IMessageVisitor visitor)
visit(IMessageVisitor)
but may be used independently, in such case,
the startBlockX and endBlockX in the visitor will not be called.block
- the block containing the tags to visitvisitor
- the visitor to usejava.lang.IllegalArgumentException
- if parameter block or visitor are null
public java.lang.Long getId()
id
public void setId(java.lang.Long id)
id
- the id to be setid
public int getBlockCount()
public int getBlockCount(java.lang.Boolean includeUserBlocks)
null
and is not empty.
NOTE: that isEmpty() will be called in each block, the behavior of isEmpty is block
dependentincludeUserBlocks
- indicates whether or not user defined blocks should be countedSwiftBlock1.isEmpty()
,
SwiftBlock2Input.isEmpty()
,
SwiftBlock2Output.isEmpty()
,
SwiftTagListBlock.isEmpty()
,
SwiftTagListBlock.isEmpty()
,
SwiftTagListBlock.isEmpty()
public SwiftBlock1 getBlock1()
null
if not setnull
public void setBlock1(SwiftBlock1 block1)
block1
- the content of the block 1public SwiftBlock2 getBlock2()
null
if not setnull
public void setBlock2(SwiftBlock2 block2)
block2
- the content of the block 1public SwiftBlock3 getBlock3()
null
if not setnull
public void setBlock3(SwiftBlock3 block3)
block3
- the content of the block 1public SwiftBlock4 getBlock4()
null
if not setnull
public void setBlock4(SwiftBlock4 block4)
block4
- the content of the block 1public SwiftBlock5 getBlock5()
null
if not setnull
public void setBlock5(SwiftBlock5 block5)
block5
- the content of the block 5public int getUserBlockPosition(java.lang.String blockName)
blockName
- the block name to find may be empty or null, in which case this method does nothing-1
if not foundpublic java.util.List<SwiftBlockUser> getUserBlocks()
SwiftBlockUser
user defined blocks.
The requested object may be null
if the message was cleared or not initialized.protected void setUserBlocks(java.util.List<SwiftBlockUser> userBlocks)
userBlocks
- the new list of user defined blocksjava.lang.IllegalArgumentException
- if parameter userBlocks is null
java.lang.IllegalArgumentException
- if parameter userBlocks has elements of class other than SwiftBlockUserSwiftBlockUser
public SwiftBlockUser getUserBlock(java.lang.String blockName)
null
if not setblockName
- the name of the block to findnull
java.lang.IllegalArgumentException
- if parameter blockName is null
java.lang.IllegalArgumentException
- if parameter blockName has an invalid block namepublic SwiftBlockUser getUserBlock(java.lang.Integer blockNumber)
null
if not setblockNumber
- the number of the block to findnull
java.lang.IllegalArgumentException
- if parameter userBlock is null
java.lang.IllegalArgumentException
- if parameter userBlock has an invalid block namepublic void addUserBlock(SwiftBlockUser userBlock)
userBlock
- the user defined blockjava.lang.IllegalArgumentException
- if parameter userBlock is null
java.lang.IllegalArgumentException
- if parameter userBlock has an invalid block namepublic void removeUserBlock(java.lang.Integer blockNumber)
blockNumber
- the block number to removejava.lang.IllegalArgumentException
- if parameter blockNumber is null
java.lang.IllegalArgumentException
- if parameter blockNumber is invalidSwiftBlockUser.isValidName(Integer)
public void removeUserBlock(java.lang.String blockName)
blockName
- the block name to removejava.lang.IllegalArgumentException
- if parameter blockName is null
java.lang.IllegalArgumentException
- if parameter blockName is invalidpublic void clear()
public java.lang.Boolean isFragment()
public java.lang.Boolean isLastFragment()
public java.lang.Integer fragmentCount()
public java.lang.Integer fragmentNumber()
java.lang.UnsupportedOperationException
- if the message is not a part of a fragmented messageprotected void unparsedTextVerify()
public UnparsedTextList getUnparsedTexts()
public void setUnparsedTexts(UnparsedTextList texts)
texts
- the new list of unparsed texts (may be null)public java.lang.Integer getUnparsedTextsSize()
public java.lang.Boolean unparsedTextIsMessage(java.lang.Integer index)
index
- the unparsed text numberjava.lang.IllegalArgumentException
- if parameter index is null
java.lang.IndexOutOfBoundsException
- if parameter index is out of boundspublic java.lang.String unparsedTextGetText(java.lang.Integer index)
index
- the unparsed text numberjava.lang.IllegalArgumentException
- if parameter index is null
java.lang.IndexOutOfBoundsException
- if parameter index is out of boundspublic SwiftMessage unparsedTextGetAsMessage(java.lang.Integer index)
index
- the unparsed text numberjava.lang.IllegalArgumentException
- if parameter index is null
public void unparsedTextAddText(java.lang.String text)
text
- the unparsed text to appendjava.lang.IllegalArgumentException
- if parameter text is null
public void unparsedTextAddText(SwiftMessage message)
message
- the message to be appendedjava.lang.IllegalArgumentException
- if parameter message is null
public int hashCode()
hashCode
in class java.lang.Object
public boolean equals(java.lang.Object obj)
equals
in class java.lang.Object
public boolean isCOV()
true
if 119:COV is found at User Header (block3)public boolean isSTP()
true
if 119:STP is found at User Header (block3)public boolean isREMIT()
true
if 119:REMIT is found at User Header (block3)public java.lang.String getSender()
For outgoing messages this is the the logical terminal at block 1, and for incoming messages this is logical terminal at the MIR of block 2.
for service message (example acknowledges) always returns the logical terminal from block1
null
if blocks 1 or 2 are not found or incompletepublic java.lang.String getReceiver()
For outgoing messages this is the receiver address at block 2, and for incoming messages this is logical terminal at block 1.
for service message (example acknowledges) always returns null
null
if blocks 1 or 2 are not found or incompletepublic java.util.List<Field> fields(java.lang.String... names)
names
- list of names to add in fields to searchjava.lang.IllegalArgumentException
- if names is null
public void removeEmptyBlocks()
public int getTypeInt()
public MessageIOType getDirection()
public boolean isOutgoing()
public boolean isInput()
isOutgoing()
public boolean isIncoming()
public boolean isOutput()
isIncoming()
public java.lang.String getPDE()
public java.lang.String getPDM()
public java.lang.String getMIR()
public java.lang.String getMUR()
The MUR is a free-format field in which users may specify their own reference of up to 16 characters of the permitted character set, and it is contained in a 108 field at the message user header (block 3).
public java.lang.String getUUID()
SwiftMessageUtils.reference(SwiftMessage)
Notice despite the name this identifier is unique only in the context of a specific message management platform,
since all its values could be repeated from one installation to another. To make it completely unique in your
application context, consider using #getUUID(Calendar, Long)
public java.lang.String getUID(java.util.Calendar created, java.lang.Long id)
getUUID()
.
The suffix is a system-generated value that can help uniquely identify a message. The suffix generated by this method is similar to the suffix used by SWIFT Alliance Lite. The first part is the creation date of the message in YYMMDD format, a six-digit number. The second part consists of 1-10 left padded digit number generated from the container application/system incremental identifier.
created
- optional creation date, if provided, the YYMMDD will be appended as first part of the suffixid
- optional incremental identifier number from the application, if provided it will be appended as second part of the suffixpublic SequenceNode getParsedSequences()
public void setParsedSequences(SequenceNode parsedSequences)
public Field field(java.lang.String name)
null
if nonename
- null
if not foundfields(String...)
public java.lang.Boolean isLinked()
null
if cannot determinepublic java.util.List<SwiftTagListBlock> getLinkages()
null
if cannot determinepublic java.lang.String toJson()
{ "version" : 1, "timestamp" : "2016-08-26T23:57:36Z", data" : { "block1" : { "applicationId" : "F", "serviceId" : "01", "logicalTerminal" : "FOOSEDR0AXXX", "sessionNumber" : "0000", "sequenceNumber" : "000000" } , "block2" : { "messageType" : "103", "receiverAddress" : "FOORECV0XXXX", "messagePriority" : "N", "deliveryMonitoring" : "null", "obsolescencePeriod" : "null" } , "block3" : { }, "block4" : [ { "20" : "REFERENCE" }, { "23B" : "CRED" }, { "32A" : "130204USD1234567,89" }, { "50K" : "/12345678901234567890\nFOOBANKXXXXX" }, { "59" : "/12345678901234567890\nJOE DOE" }, { "71A" : "OUR" } ] ,"block5" : { } } }
public final java.lang.String toXml()
XMLWriterVisitor
,
XMLParser
public AbstractMT toMT()
If you have a MT102 in a SwiftMessage, this method is the same as invoking
new MT102(SwiftMessage)
.
For messages with service id 21 = GPA/FIN Message (ACK/NAK/UAK/UNK) it will
return an instance of AckSystemMessage
.
public boolean isType(int type)
Returns true if the message type is equal to the given number.
Notice this method only checks the message type number but can be combined with any
message variant check such as isSTP()
, isREMIT()
or isCOV()
to determine the message kind precisely.
The implementation uses getTypeInt()
type
- message type number to checkpublic boolean isType(int... types)
getTypeInt()
types
- message type numbers to checkpublic final boolean isCategory(MtCategory... categories)
categories
- the categories 0 to 9 to checkpublic final MtCategory getCategory()
getType()
to retrieve the message type of the message.null
if block 2 is not found or the message type is not category numberpublic final boolean isServiceMessage()
@Deprecated @ProwideDeprecated(phase2=_2018) public boolean isSystemMessage()
IMPORTANT: Note despite the method name this will NOT return true for FIN system messages (category 0).
It is just useful to detect acknowledges.
To check for system messages use isCategory(MtCategory...)
instead, passing zero as parameter
@deprecated this method is kept for backward compatibility but was replace by isServiceMessage21()
which
reflects what the method returns properly. Notice a "system message" is actually a message with category 0, which is
not the same as a "service message".
public boolean isServiceMessage21()
public boolean isAck()
public boolean isNack()
public MTVariant getVariant()
public java.util.List<java.lang.String> getTagNames()
null
everpublic MtId getMtId()
null
if message is a service messagepublic BIC getCorrespondentBIC()