ISO 8583 Message Processor
ISO 8583 Message Processor
Written by
AT Mulyana
Copyright © 2009-2010
List of Content
Process Diagram
Message Processor
Class MessageProcessor
Interface IMessageSender
Delegate MessageCallback
Interface IModelParsingReceiver
Interface IProcessedMessage
Class MessageProcessorWorker
Interface ICustomMessageProcessor
Message Parser
Interface IParsedMessage
Class MessageParser
Message Compiler
Interface ICompiledMessage
Class MessageCompiler
Message Container
Header Container Classes
Class IMessageHeader
Class MessageBitMap
Class MessageTypeHeader
Class MessageHeader
Field Container Classes
Class MessageField
Class NMessageField
Class NsMessageField
Class AnMessageField
Class AnsMessageField
Message Container Classes
Class ParsedMessageContainer
Class CompiledMessageField
Class CompiledMessageContainer
Message Listener/Server
Class MessageListenerSync
Class MessageListener
Class MessageListenerWorker
Message Client
Class MessageClient
Utility Classes
Class MessageUtility
Class Util
XML Configuration
Element message
Element header
Element message-type
Element bitmap
Element bit
Element model
Element property
Element message-to-model
Element mask
Element BitContent
Element field
Element tlv
Element tag
Element delegate
Element type
Configuration Objects
Class BitContentFieldConfig
Class BitContentConfig
Class TlvTagConfig
Class TlvConfig
Interface IMessageHeaderConfig
Class MessageBitMapConfig
Class MessageTypeConfig
Class MessageHeaderConfig
Class MessageFieldConfig
Class MessageConfig
Class ModelPropertyConfig
Class ModelConfig
Interface IMaskConfig
Interface IMaskListConfig
Class MaskConfig
Class MaskAndConfig
Class MaskOrConfig
Class MessageToModelConfig
Class TransactionTypeConfig
Class MessageConfigs
Delegate GetHeaderBytes
Delegate GetFieldBytes
Delegate GetPropertyValue
Delegate ProcessModel
XML Configuration Parser
Class XmlConfigParser
Exception
Class MessageProcessorException
Class ConfigParserException
Class MessageParserException
Class MessageCompilerException
Class MessageListenerException
Logger
Interface ILoggerOutput
Class ConsoleLoggerOutput
Class LoggerOutputList
Class Logger
Namespace LMD.iso8583.model
Class NibbleList
Class DateTimeNibble
Class Diagram
Process Diagram
Purpose: To make an abstraction from the business objects so that they only process a model object without realizing how „hard‟ to parse/build an ISO 8583
message. Another purpose is to make generic process, all message types will be processed by one processor, only provides a configuration, no hard coding.
2. Reads configuration.
From some identified
bytes, it knows which
model to use 4. Populates model
5. Sends message
Message
3. Processor may delegate its task to
Custom Processor in the case the
generic process cannot be done
Message Listener/Server
(e.g. Artajasa switch) 1. Receives message
Message Client (e.g. EDC) Custom
Processor
Message Processor
Processor should have the life cycle at the application scope. It is started when the application starts and
destroyed when the application stops. When it starts, it loads the message mappings configuration (XML
format) and maintains it as long as the processor alive. Loading/parsing configuration process only once
is a benefit because it will speed up the process of message parsing/compiling.
The processor acts as a server which serves the requests from message listener, message client and
business objects. The processor will create as many threads as needed to serve all request. To limit how
many thread can run is the task of the message listener and the business objects.
When it starts and then parses the configuration and if it finds any bad configuration, it will throw an error
and be shutdown. The processor will check all object class mentioned in the configuration. After
successfully started, it will not be shutdown if there is any bad ISO 8583 message comes because of no
match configuration or the other reasons. It will only log the error. It should be never shutdown except the
application is shutdown.
The processor will maintain some fields of a request so that it can be sent back as response, such as
system trace number, or generate automatically a field value, such as transaction system. The processor
will calculate the value of message length field for a response. If a request message comes and the
message length field records a different length value from the actual length then the processor logs the
error and no further process executed (message is ignored) . Actually, these tasks will be delegated to
message parser and message compiler.
Class MessageProcessor
It is the main class to/from which the ISO 8583 message comes and goes. It is the message gateway. It
will instantiate the other objects as necessary to process the message. Only one instance of this class
exists (a singleton object). This class cannot be instantiated directly but via method GetInstance
instead. To make it works correctly, method Load must be called when the application starts to load the
configuration. This method must be also called again when the configuration changes.
There are other complementary objects provided by this library, those are Message Listener (to accept a
request and send its response) and Message Client (to send a request and accept its response). These
objects, however, can be replaced by outside objects to fit the application‟s need, as long as they
implement IMessageSender. These replacing objects must be passed as the parameter to method
Send or Receive.
namespace LMD.iso8583
public class MessageProcessor
o sender is the message client to which the message will be passed to be sent to
the remote host (server).
o callback is a delegate object which will be called after the reply message comes
and converted to the model object. This delegate object accepts a parameter as a
model object and returns another model object as the reply. Within this delegate,
the business process is executed. If the parameter passed to this delegate is
null then the delegate should not execute the business process or do some
default processes. If callback is set to null then the processor will try to find
an appropriate MessageCallback object based on its configuration. If still not
found then no process will be executed after the response comes.
Returns:
An IProcessedMessage object. This is the threaded object which processes the
message.
Interface IMessageSender
This interface describes the interfaces for sending the message. Message listener/server and message
client implement this interface. These two objects must have capability to send message.
namespace LMD.iso8583
public interface IMessageSender
Delegate MessageCallback
This is a callback that will be invoked when a message is received and has been converted to a model
object. In this callback, the business process will be executed and a reply will be returned if exists. This
callback is used by method Send and Receive of MessageProcessor.
namespace LMD.iso8583
public delegate Object MessageCallback(Object model)
This delegate takes a parameter of a model object and returns another object model as a
reply. Parameter and returned object can be null. If the returned object is null then no
reply returned. If parameter is null, the behavior depends on each delegate itself,
perhaps no process executed.
Interface IModelParsingReceiver
This interface, typically, is implemented by the object which provides MessageCallback delegate. It‟s
not mandatory that the object must implement this interface. It defines the interface to set the message
that has been parsed (the message has been divided becomes to bitmap, headers, content etc). The
object implementing this interface tells the message processor that it wants the result of message
parsing.
namespace LMD.iso8583
public interface IModelParsingReceiver
Interface IProcessedMessage
This interface defines interfaces to access the message which is sent or received both in format of ISO
8583 and model object. It is implemented by MessageProcessorWorker.
namespace LMD.iso8583
public interface IProcessedMessage
Class MessageProcessorWorker
When Send or Receive method of MessageProcessor object is invoked, it will create a thread to serve
the request. The thread is an instance object of MessageProcessorWorker class. This is actual class
which implements IProcessedMessage interface.
namespace LMD.iso8583
public class MessageProcessorWorker : IProcessedMessage
o sender is the thread inside the message server which processes the request. It‟s
needed because the response message will be passed to it to be sent to the
remote host.
o callback is a delegate object which will be called after the request message
comes and converted to the model object. This delegate object accepts a
parameter as a model object and returns another model object as the reply. Within
this delegate, the business process is executed. If this delegate is null then the
processor will look for the appropriate delegate based on the configuration.
o callback is a delegate object which will be called after the reply message comes
and converted to the model object. This delegate object accepts a parameter as a
model object. Within this delegate, the business process is executed. If this
delegate is null then the processor will look for the appropriate delegate based
on the configuration.
Interface ICustomMessageProcessor
To be reviewed. There may be a message that cannot be processed by generic process as done by this
message processor. Then it will need a custom processor. The object that acts as the custom processor
must implement this interface. The processor will notice when the message needs a custom processor
from the configuration. In this case, when the Send or Receive method is invoked, the process will be
delegated to the custom processor. The Send and Receive are executed asynchronously. There will be
many processes will call these methods.
namespace LMD.iso8583
public interface ICustomMessageProcessor
IProcessedMessage Send(Object model, IMessageSender sender,
MessageCallback callback)
IProcessedMessage Send(Object model, IMessageSender sender)
Message Parser
This part is responsible to parse the incoming ISO 8583 message. By this message parser, the message
will be divided to be message type header, bitmap and other various headers and, of course, its content.
The message content will be converted to an appropriate model object. The message parser will try to
understand the configuration to make the parsing process done. The message parser will be created by
message processor when there is an incoming message.
Interface IParsedMessage
It defines interfaces from those we can retrieve the result of the parsing process previously done by the
message parser. This interface is typically implemented by class MessageParser. This interface is
created because class MessageParser is signed as internal. To expose the members that can be
used by outside world, the class implements this interface. For further explanation, see interface
IModelParsingReceiver about the use of this interface.
namespace LMD.iso8583
public interface IParsedMessage
Class MessageParser
It is the core object which does parsing process. This class is signed as internal, cannot be invoked by
outside world. This class is created by the message processor as the follow-up of a request for
sending/receiving an ISO 8583 message. This class takes a part to parse the bytes of the ISO 8583
message either as a response message (in sending process) or as a request message (in receiving
process). Specifically, this object is created when the method SendMessage or ReceiveMessage of
class MessageProcessorWorker is invoked.
namespace LMD.iso8583
internal class MessageParser : IParsedMessage
o curField is the configuration object for the message field that will be read. It will
be null if the piece is a message header.
See also Configuration Objects.
o tagName is the tag name. It‟s usable when there is only one tag (one sub field).
The method uses this parameter only for getting the length of tag if cfg is null or
the tag name is not defined in cfg.
o lengthBytes is how many byte after tag which records the length of the sub field
content. It‟s used when cfg is null or the length of bytes is not defined in cfg.
o tlvType is the type of the model object associated to this TLV field. The type is
set via attribute class of element tlv. If it‟s null then the TLV field doesn‟t have
an associated model object. If this TLV field has a model object and this model
object is assignable to the assigned property then this model object will be
returned. If those conditions are not met then if there is only one sub field and this
sub field‟s value is assignable then this value will be returned. If those conditions
are not still satisfied then it will create a dictionary and return it if it‟s assignable.
The dictionary is keyed by sub field tag names. If still fails, this method will create
an object of the same type as assigned property type. Then, each sub field value
will be assigned to the object‟s property whose the same name as the sub field tag
name. If this process fails, an exception will be thrown.
o bytesValue is the bytes array of the message field which belongs to the TLV
field. Note, when invoked by method ParseBitContent, the length of the array
will possibly exceed the actual length of the TLV sub field. It is because BitContent
field doesn‟t have a note about the length of a TLV sub field inside it. The actual
length will be returned via parameter tlvLength.
o locMsg is the message for the exception which possibly happens when executing
this method.
o isAlwaysOneTag defines whether the TLV field always has one sub field or not.
It‟s true if it‟s invoked from ParseBitContent and false if invoked from
ConvertToModel.
Message Compiler
This part is responsible to compile the outgoing ISO 8583 message, that is, to convert a model object to
be an appropriate message. The message compiler will try to understand the configuration to make the
compiling process done. Actually, this message compiler only creates a message container object (which
is an instance object of class CompiledMessageContainer). To get the complete bytes of the
message, use method GetAllBytes of that message container object. The message compiler will be
created by message processor when send a message.
Interface ICompiledMessage
It defines interfaces from those we can retrieve the result of the compiling process previously done by the
message compiler. This interface is typically implemented by class MessageCompiler. This interface is
created because class MessageCompiler is signed as internal. To expose the members that can be
used by outside world, the class implements this interface.
namespace LMD.iso8583
public interface ICompiledMessage
CompiledMessageContainer CompiledMessage { get; }
Returns a message container object storing the message that has been compiled (the
translation result of the Model object). See about Message Container.
Class MessageCompiler
It is the core object which does compiling process. This class is signed as internal, cannot be invoked
by outside world. This class is created by the message processor as the follow-up of a request for
sending/receiving an ISO 8583 message. This class takes a part to compile the bytes of the ISO 8583
message either as a response message (in receiving process) or as a request message (in sending
process). Specifically, this object is created when the method ReceiveMessage or SendMessage of
class MessageProcessorWorker is invoked.
namespace LMD.iso8583
internal class MessageCompiler : ICompiledMessage
o reqMsg is the request message that has been parsed. If it is to send a response,
this request message is useful to retrieve some message field values that must be
sent back to the client.
o lengthBytes is how many bytes after the tag which records the length of the sub
field content. It‟s used when cfg is null or the length of bytes is not defined in
cfg.
o obj is the value of the model property associated to this TLV field.
o locMsg is the message for the exception which possibly happens when executing
this method.
Message Container
Message container is the intermediate object to make easy when converting message bytes to a model
object and vice versa. It unifies interfaces among different headers and fields (About the kind of fields,
consult attribute type of element bit). The important thing is concerning different kind of fields which
each must be treated differently when getting their value. Another concern is how to make this field value
assignable to the mapped model property. Another one is how to convert the value of the mapped model
property to be the correct array of bytes for the corresponding message field. There are three groups of
classes among message container objects. Those are header classes, field classes and message
classes. The last group maintains separated header and field containers in the right order.
These classes are container for header entity. The header part of message consists of some entities. It
excludes the length of message header that must exist as the first header. It has been defined three
container classes. The first is for BitMap header, the second is for message type header and the last one
is for the other headers.
Class IMessageHeader
It is the base class for all header container classes. There are two interfaces that should be had by a
header container. Those are the length and the value (an array of bytes).
namespace LMD.iso8583
public abstract class IMessageHeader
public abstract int Length { get; internal set; }
It is the length of this header, that is how many bytes inside this header entity.
Class MessageBitMap
It is the container of the BitMap header. Bitmap header determines the presence of bits (fields) in the
message. It is related to element bitmap in XML Configuration.
namespace LMD.iso8583
public class MessageBitMap : IMessageHeader
o bitMap is the bitmap array from which it will check the on/off of bit.
Class MessageTypeHeader
It is the container class for message type header. It relates to element message-type in XML
Configuration.
namespace LMD.iso8583
public class MessageTypeHeader : IMessageHeader
Class MessageHeader
It is the container class for the headers other than message type and bitmap. It relates to element
header in XML Configuration.
namespace LMD.iso8583
public class MessageHeader : IMessageHeader
Some container classes have been defined to contain a message field. It is not only for the value of the
field but also some dispositions of that field, such as how many digits after decimal point for a numeric
field, the count of bytes should be owned by the field etc. There are properties to get field‟s value as a
bytes array, numeric or string. Of course, the returned value depends on the natures of that field. There
are also some overloaded SetValue methods which accepts parameter as bytes array, numeric or string
to set the field‟s value.
Class MessageField
It suits for container of a field whose type “B” (see attribute type of element bit). But because it‟s the
base class for all message field containers and all message field containers will be recognized as an
instance object of this class when parsing and compiling, this class defines members needed by all
message field type for general operation.
namespace LMD.iso8583
public class MessageField
Class NMessageField
It is suitable for the container of a field whose type “N” (see attribute type of element bit). After the
value is set, property DecimalValue and IntValue will return a not null value because this field is
numeric.
namespace LMD.iso8583
public class NMessageField : MessageField
It should be the container of a field whose type “NS” (see attribute type of element bit).
namespace LMD.iso8583
public class NsMessageField : NMessageField
Class AnMessageField
It should be the container of a field whose type “AN” (see attribute type of element bit). After the value
is set, property DecimalValue and IntValue will return a not null value because this field is numeric.
namespace LMD.iso8583
public class AnMessageField : MessageField
Class AnsMessageField
It is intended for the container of a field whose type “ANS” (see attribute type of element bit).
namespace LMD.iso8583
public class AnsMessageField : MessageField
The message container maintains all header and field container in the right order which construct the
whole message.
Class ParsedMessageContainer
It defines the object to maintain the parsed message. The message parser creates an object of this class
to save the result of parsing process.
namespace LMD.iso8583
public class ParsedMessageContainer
Class CompiledMessageField
It is a wrapper of MessageField when compiling a message, especially for the fields whose a variable
length that must be created their length header. This wrapper stores a header part for the field. Note, this
length header is not the part of message header. It records the actual length of the field and is placed
before the field value.
namespace LMD.iso8583
public class CompiledMessageField
Class CompiledMessageContainer
It‟s the container the whole message parts when compiling the message. The message compiler will
create an object of this class.
namespace LMD.iso8583
public class CompiledMessageContainer
Message Listener/Server
Message listener will accept a request message then it asks the message processor to parse the
incoming message and execute a business process after the message is converted to a model object.
Message listener provided by this library passes null for callback parameter when calling method
Receive of MessageProcessor. In the other words, it relies on the configuration to get the callback
(consult method ProcessModel of MessageProcessorWorker).
The other listener (created outside this library) may determine which business process to be executed by
passing a MessageCallback delegate to method Receive of MessageProcessor. So it may have a
configuration to determine which business process to be executed when a message comes. The
configuration can be based on processing code and/or message type and/or terminal ID and/or merchant
ID.
Class MessageListenerSync
This class defines properties that must be synchronized among threads serving the request. Typically, it‟s
intended for property Sync of MessageListener. This property will be locked by lock statement to
synchronize among threads.
namespace LMD.iso8583
internal class MessageListenerSync
Class MessageListener
This class is for main thread which listening the request. When a request comes, it will create a child
thread (an instance object of MessageListenerWorker) to process the request. Because of
asynchronous process, it will not wait the request processing finishes. It will start waiting a new request
instead. Therefore, there may be some concurrent processing of requests. Message listener must handle
any failure pertaining to the message sending process.
namespace LMD.iso8583
public class MessageListener
Class MessageListenerWorker
The instance object of this class will be created to process a request. There may be some instances
running concurrently that maintain different connection. The object of this class is created by method
DoAcceptTcpClientCallback. The count of instance object alive will not be more than
MaxConnections.
namespace LMD.iso8583
internal class MessageListenerWorker : IMessageSender
Message Client
The message client will send a request message asked by the message processor. The message
processor itself may get a request from a business object. By invoking method Send of
MessageProcessor, a model object will be sent as a request message. This model object will be
converted to an array of bytes (ISO 8583 message bytes) and in turn, method Send of message client will
be called to send the message bytes to the server. The message client itself may invoke method Send of
MessageProcessor, which in turn, it will call method Send of itself.
Class MessageClient
This is a basic message client that can send a request message as a model object (using method
SendModel) or as an array of bytes (using method SendBytes). Method Send, which is needed by
MessageProcessor, will connect to the server and send the message bytes and read the response
bytes.
namespace LMD.iso8583
public class MessageClient : IMessageSender
o callback is the function will be executed after the response message comes
and has been converted to a model object. The function itself must accept the
response model object as its parameter.
Utility Classes
Utility class defines the public functions that can be used by all processes without concerning an object
state. In technical words, they are signed as static.
Class MessageUtility
This static class provides the functions for manipulating the message. A lot of functions among them deal
with converting message field value.
namespace LMD.iso8583
public static class MessageUtility
Class Util
Contains some useful functions that are generally needed by some processes.
namespace LMD.iso8583
public static class Util
o str will contain the result string when the process finishes.
o indent contains some tab characters to indent the properties to make more
readable format. It is useful when doing recursive process. It should be empty
string when this method is called first time before recursive process.
o printableClassPrefixes is an array of type prefixes should be processed
recursively.
XML Configuration
<MessageMap …>
<message id=”…” length-header=”…” …>
<header name=”…” … />
<message-type length=”…” value=”…” />
<bitmap length=”…” />
<bit seq=”…” … />
<bit seq=”…” … />
……
</message>
<message …>
……
</message>
The root element is MessageMap. It will contain some message elements to define ISO 8583 messages,
some model elements to define the model objects and some message-to-model elements to map the
incoming messages to the appropriate model. Some complementary elements, such as BitContent and
delegate, may exist.
Element message
This element defines an ISO 8583 message, explains all fields inside the message. Each field is
represented by a child element inside message element. The child elements other than bit element are
categorized as the header message element and will be placed at the beginning of the message. These
header elements must be placed at the same order as their order in the message. It doesn‟t apply to
element bit because it has attribute seq.
Attributes:
id
Mandatory. The id of this message. It will be referred by the element model to which message it is
mapped.
length-header
Mandatory. How many bytes at the beginning message will record the message length. The binary
value in these bytes from left to right (the left most is the highest) if converted to decimal value will tell
how many bytes of message will come after the length header bytes.
Element header
It‟s the child element of element message. Defines the header of message and must be placed in the
same order as their order in the message.
Attributes:
name
Optional. The name of this header. It can be a description of what header it is.
length
Mandatory. Determines how many bytes of this header.
value
Optional but must exist if attribute delegate is absent. If this attribute is specified then all message
will have the same value of this header. The value of this attribute is a hexadecimal string.
delegate
Optional. Refers to an id of element delegate. This delegate will be executed to fill this header. The
delegate function accepts no parameter and returns an array of bytes. If this attribute is specified then
attribute value is ignored. See element delegate.
Element message-type
Child element of element message. Represents the message type header of this ISO 8583 message.
Attributes:
value
Mandatory. Hexadecimal string for message type value. It‟s useful when compiling a message.
length
Mandatory. How many bytes the length of this message type header.
Element bitmap
It‟s the child element of element message. This element is to specify the length of the primary bitmap
header. Bitmap header determines the presence of bits (fields) in the message. Example, if the first bit in
this bitmap header is 1 then the first bit message will be present. Otherwise, it will be absent.
Attributes:
length
Mandatory. How many bytes the length of this bitmap header.
Element bit
It‟s the child element of element message. Represents a field in the message. This field may absent
depends on the value of bitmap header.
Attributes:
seq
Mandatory. The ordinal number of this field in the message. It‟s the same as the ordinal number of the
corresponding bit in the bitmap header. A message may not specify the fields as many bit as in the
bitmap header. Some bits in bitmap header may be always 0. By the favor of this attribute, the element
bit doesn‟t have to be placed in the true sequence.
type
Mandatory. The data type of this field. Supported data types are:
o B represents a sequence of bits, on (1) or off (0). It can only be mapped to a model property of type
bytes array.
o N represents a numeric and each digit has four bits length (nibble). It‟s like a hexadecimal number
but only digit 1 to 9 exist. “0x19” means “19” decimal, not “25” (“19” hexadecimal).
o NS represents a hexadecimal string. It should be suitable to be mapped to a model property of type
bytes array or string.
o ANS represents an ANSI character, thus each character has 1 byte.
length
Optional if attribute length-header exists. How many characters or digits in the data. Especially for
type N, because one digit is four bits, if there are odd number of digits then it will be added one digit on
the left filled by 0 so that the number of bytes is rounded.
length-header
Optional. Determines how many bytes of field header recorded the bytes count of this field. The value
inside this header bytes is interpreted like type N (four bits digits) and replaces the value of attribute
length. If this attribute specifies one byte and the value in that byte records “0x15” and the data type
is ANS then the actual length of this field is 16 bytes (1 byte header and 15 bytes content). This
attribute will be ignored if attribute length presents.
save
Optional. Typically used by a request message. Asks the processor to save the value so that it can be
sent back as the response. After the response is sent, all saved values are destroyed. The possible
value of this attribute is true or false. The default value is false.
from-request
Optional. Typically used by a response message. Gets the previous value saved by the processor if
the value of the corresponding property of the model object is null. The possible value of this
attribute is true or false. The default value is false.
delegate
Optional. Refers to an id of element delegate. This delegate will be executed to fill this field when
translating the corresponding model object property. The delegate function accepts the property as the
parameter and returns an array of bytes. See element delegate.
Element model
Defines a model object that will be used to save a message. The object model is more understandable by
a business object to process. The message processor will translate a model object to/from an ISO 8583
message. A model object must be mapped to an ISO 8583 message for the processor to understand. A
model object has some properties that is mapped to a field (element bit) in the message. Some
properties may be generated automatically by the favor of a delegate function.
Attributes:
id
Optional. The id that will be referred by a message map (see element message-to-model) so that
the model can be created when an incoming message comes. Note, it is optional because you may
define a model that is just used by a sent message.
class
Mandatory if attribute extend is not specified. The assembly-qualified name of the type of the model
object. It can also be the id of element type. To create an instance of the model object, it will get the
object type first by using method Type.GeType.
message
Mandatory if attribute extend is not specified. The id of element message to which this model is
mapped.
extend
Optional. If this model is inherited from another model, this attribute refers the id of the parent model.
All attributes and properties different from those defined for the parent model, must be redefined by
child model. Redefined attributes and properties will override the same ones which are already defined
for the parent model.
Element property
It‟s the child element of element model. It represents a property of the model object. Perhaps not all
properties of the model object are mapped (for internal use of the object model). If a mapped property is
null then the corresponding field in the message will be absent (the corresponding bit in the bitmap
header will be 0) or the field value will be generated automatically.
Attributes:
name
Mandatory. The name of this property. It‟s declared variable name for this property in the object model
code.
bit
Mandatory. The order bit of the message field to which this property is mapped. The value will be the
same as the value of attribute seq of element bit.
type
Mandatory if attribute delegate and bitcontent are not specified. It‟s the data type of this property.
The possible values are string (for string value), int (for integer value), decimal (for money value)
and bytes (array of byte values). If another type needed, use attribute delegate. The actual type of
the property in the code must be able to be assigned using the specified type by this attribute
(supports auto cast operation).
frac-digits
Optional. How many digits after decimal point. The message will not contain decimal point. It will be
ignored if the value of attribute type is other than decimal. By default, the value is 0 (no digit after
decimal point).
delegate
Optional. Refers to an id of element delegate. This delegate will be executed to get the value of this
property. This delegate function accepts an array of byte values (will be taken from the message field
value to which this property is mapped) and returns an expected type for this property. If this attribute
is specified then the attribute type will be ignored. If this attribute is not ignored then attribute
delegate of the mapped element bit (linked by attribute bit) must be specified. See element
delegate.
bitcontent
Optional. Refers to an id of element BitContent. Typically, it‟s used by the field containing additional
information which has a variable length. If this attribute is specified then attribute delegate and type
will be ignored. See element BitContent.
tlv
Optional. Refers to an id of element tlv. Typically, it‟s used by the field containing additional
information which has a variable length. If this attribute is specified then attribute bitcontent,
delegate and type will be ignored. See element tlv.
tlv-tag-name
Mandatory if this property does not refers to an element tlv which defines the tag. The tag id.
Typically, it‟s used by the field containing additional information called TLV (Tag Length Value) data.
See element tlv for further information. This attribute indirectly specifies how many bytes will be
occupied by the tag id. Note, when parsing an ISO 8583 message, the tag id will be ignored, it only
notices the length of tag. Only when creating an ISO 8583 message from a model, the tag id will be
included into message. If this attribute is specified then attribute bitcontent, delegate and type
will be ignored. Note, this attribute will be usable if there is only one tag in this field. If there is more
than one tag, use element tlv.
tlv-length-bytes
Optional. How many bytes will contain the data length value. Typically, it‟s used by the field containing
additional information called TLV (Tag Length Value) data. This attribute is meaningful if attribute tlv
or tlv-tag-name is defined. The default value is 3. See element tlv.
tlv-class
Optional. This attribute is meaningful if attribute tlv or tlv-tag-name is defined. See attribute
class of element tlv.
Element message-to-model
This element is to map an incoming message to a model. When a message comes, the appropriate
model will be instantiated. This mapping configuration will be evaluated when executing method Receive
of MessageProcessor. This method is invoked by the message server or client when they receive a
message.
The technique used to determine which model will be used is bit-masking operation. Element message-
to-model contains one or more element mask. The element mask defines which bytes in the message
to be masked and the result value of masking. If there are more than one element specified then it will be
operated logical “or” operation. Element message-to-model may also contain element and and
element and itself may contain some element mask. The element and is to make logical “and” operation.
Inside element and may also contain element or and element or itself may contain some element mask.
The element or will operate all contained mask by logical “or” operation.
Attributes:
model
Mandatory. Refers to an id of the element model to which the incoming message will be mapped.
delegate
Optional. Refers to an id of the element delegate that will be executed when an appropriate
message comes. The delegate function must accept the model as parameter. If this attribute is not
specified then another process (message client or server) that utilize this message processor, should
invoke method Receive of MessageProcessor that takes a delegate (MessageCallback object)
for its parameter.
Element mask
It‟s the child element of element message-to-model. This element defines all parameter for masking
operation when mapping an incoming message to a model.
Attributes:
start-byte
Mandatory. Defines the starting byte to be masked. The first index is 1, not zero.
length
Mandatory. Determines how many bytes to be masked.
value
Mandatory if attribute mask is absent. If attribute mask is present then this attribute must be absent.
The value of the masked bytes must be equal a hexadecimal string written in this attribute.
mask
Mandatory if attribute value is absent. If attribute value is present then this attribute must be absent.
This attribute value will be operated with the masked bytes by bitwise „and‟ operation. This attribute
value is a hexadecimal string. The result of masking operation is determined by attribute result.
result
Mandatory if attribute mask is defined. The possible value is „equals‟ which defines the result of
masking operation must be equal with the value of attribute mask. Another possible value is „notZero‟
which defines the result of masking operation must be not zero (at least one bit is 1).
Attribute mask and result are useful to mask the bit map header.
Element BitContent
Some fields in the message may store an additional information whose a variable length. This additional
information can be broken down to be some sub fields. Thus, we can define a new model object whose
some properties to be mapped to this message field. The element BitContent defines the model object
needed for this purpose that can be referred by such sub fields. All properties of the object defined here
must be a string or an array of bytes.
This element has a child element, that is field. The first element is to determine how many header
bytes that store the length of the field. The length value itself excludes the count of bytes of the header.
The second one is to define the property of the defined object (sub field).
Attributes:
id
Mandatory. The id of this element that is referred by a message field needing it.
class
Mandatory. The assembly-qualified name of the type of this object. It can also be an id of element
type. To create an instance of the object, it will get the object type first by using method
Type.GeType.
Element field
Attributes:
name
Mandatory. The property name of the object defined by the element BitContent. This property is
mapped to this sub field.
length
Mandatory if tlv and tlv-tag-name are not specified. Determines how many characters (bytes)
inside this sub fields.
pad
Optional. Determines the character will be padded if the length of the sub field value is less than the
length defined by attribute length. It‟s usually space or zero. The default value is space.
align
Optional. Determines where to put the pad character. The possible values are left and right. If
left is specified then the pad characters are put on the right side, otherwise on the left side. The
default value is left.
null
Optional. Determines what character to be used when the mapped property is null. The sub field
must have the length as defined by the attribute length. If this attribute is not present, the value is the
same as the attribute pad value.
trim
Optional. It‟s to determine whether the sub field value must be trimmed (all leading and trailing spaces
are removed) before assigned to the mapped property. The possible values are true and false. The
default value is true which determines that the value must be trimmed.
optional
Optional. The possible values are true and false. The default value is false which determines that
the field must exist. The field that defines it‟s optional, must be the last field. Thus, not more than one
field that will be optional.
tlv
Optional. Refers to an id of element tlv. If this attribute is specified then all above attributes except
name will be ignored. See element tlv.
tlv-tag-name
Mandatory if this field does not refer to an element tlv which defines the tag. The tag id. Typically, it‟s
used by the field containing additional information called TLV (Tag Length Value) data. See element
tlv for further information. This attribute indirectly specifies how many bytes will be occupied by the
tag id. Note, when parsing an ISO 8583 message, the tag id will be ignored. It only notices the length
of tag. Only when creating an ISO 8583 message from a model, the tag id will be included into
message. If this attribute is specified then the all above attributes except name and tlv will be
ignored. Note, this attribute will be usable if there is only one tag in this field. If there are more than
one tag, use element tlv.
tlv-length-bytes
Optional. How many bytes will contain the data length value. Typically, it‟s used by the field containing
additional information called TLV (Tag Length Value) data. This atribute is meaningful if attribute tlv
or tlv-tag-name is defined. The default value is 3. See element tlv.
tlv-class
Optional. This atribute is meaningful if attribute tlv or tlv-tag-name is defined. See attribute
class of element tlv.
Note that attribute pad, align and null are needed when converting the model object to the message
field.
Element tlv
TLV stands for Tag Length Value. It‟s similar with BitContent to store additional data but has special
format. It uses a tag to identify the data following the tag. All data in TLV represents ASCII characters.
The format is started by a tag id which occupies some bytes defined by configuration, followed by pre-
determined length of bytes which specifies the length of data following, like described below:
Example: if tag ID is “TD” (occupies 2 bytes) and the data is “ABCDEFG” (has 7 bytes length) and the
bytes count of data length is 3 then the all data will be “TD007ABCDEFG”. Note, there may be more than
one „Tag ID – Data Length – Data‟ sequence that construct whole message field.
Attributes:
id
Mandatory. The id of this element that is referred by a model property or BitContent field needing it.
length-bytes
Optional. How many bytes will store data length value. If defined, it will supersede the value defined by
tlv-length-bytes attribute in element property of model and element field of BitContent.
class
Optional. The assembly-qualified name of the type of tlv object. It can also be the id of element
type. It supersedes attribute tlv-class of property and field element. It will be used when
parsing an ISO 8583 message to be converted to a model object. If this attribute is not specified then
the processor will try to interpret what the appropriate type for this tlv object that is assignable to the
property it is mapped to. The rule of interpretation is describes as follows:
When collecting the sub field value of the tlv, the processor will create a map (type of
IDictionary<String, Object>) keyed by tag ID. There may be more than one tag. The possible
type of the value of sub field is string, array of string or a type defined by a BitContent.
If there is only one entry in the map, the processor will try to assign the only value to the mapped
property. If it fails then it will try to search a constructor of the type of the property that accepts a
parameter whose type of value type and then creates an instance using that constructor. If not found
and the type of value is string then it will search a Parse method which is public and static to parse
the string value to an appropriate type. If still fails then throws an exception.
If there are more than one entry in the map then it will try to assign the map to the property. If fails then
it will interpret that the mapped property is an object whose properties named as the map key names
(tag IDs). Each value will be interpreted like interpreting the only one value described above.
Element tag
Element tlv should have some child element tags which define all tags inside this message field. If not
defined one, the element property and field referring to this element tlv must define attribute tlv-
tag-name.
Attributes:
name
Mandatory. The tag ID.
type
Optional. The possible values are „array‟ and „bitcontent‟. If specified „array‟ then attribute
splitter should be defined. The value is considered as a string array, each element is separated by
splitter. If specified „bitcontent‟ the attribute bitcontent must be defined. The value following
this tag will be treated as BitContent field.
splitter
Optional. It‟s meaningful if type is „array‟. This is a string will be used to separate each element of
array. The default value is „;‟ (semi-colon).
bitcontent
Mandatory if type is „bitcontent‟. The id of the referred element BitContent.
Element delegate
It‟s to define a delegate function that will be executed for some purposes. The signature of the delegate
function must fit with the purpose whether it‟s for mapping a field message to a property of the model
object, to generate a message field value or to be called to process a model object after it‟s converted
from a message.
Attributes:
id
Mandatory. The id of this element.
class
Mandatory. The assembly-qualified name of the type in which the method used for delegate is defined.
It can also be the id of element type. To create an instance of the object, it will get the object type first
by using method Type.GeType. If the method is not static, the message processor will create a new
instance object of this class. Each delegate has different instance of object.
method
Mandatory. The name of the used method.
param-type
Optional. The type of the parameter of this delegate. The delegate has one parameter at maximum. If
the delegate has no parameter, this attribute is not defined. The value of this attribute is the assembly-
qualified name of the type. It can also be an id of element type.
Element type
To define a type or class that furthermore can be referred by an attribute which defines a type, such as
attribute class. It‟s worth if the type is referred more than one time. As we know, to get a reference to a
type using a string as its identifier, we need assembly-qualified name. This name, if it‟s not a core type or
not placed in the same assembly, is rather complicated, which includes full name space and assembly
name. Using this element type, we can create an alias for a type, so we can refer a simple name.
Attributes:
id
Mandatory. The id of this element. This attribute value will be used to refer to this type.
class
Mandatory. The assembly-qualified name of the defined type. To create an instance of the object, it
will get the object type first by using method Type.GeType.
Configuration Objects
After the XML configuration is parsed, the configuration will be stored in some more „understandable‟
objects. All XML objects will be destroyed. This task is the responsibility of XML Configuration Parser. All
objects should be thread-safe that will be used by many threads, should not change anything inside them
after the configuration is stored in them. The XML parsing process should be done once when the
application starts or each time XML configuration changes. The objects yielded by the parsing process
should be alive as long as the application is running. All configuration objects are kept by a static class
named MessageConfigs. This class is always sought by the message parser and message compiler
when processing a message.
Generally, an element in XML Configuration has a class associated to it. The class will define the
properties associated to each attribute in the element. If the element has child elements, the class
associated to it, will define a property whose type of a collection to include all objects associated to each
child element.
All configuration classes are placed in namespace LMD.iso8583.config. In this namespace also, it is
defined four delegates (GetHeaderBytes, GetFieldBytes, GetPropertyValue and
ProcessModel). These four delegates represent element delegate. Each delegate defines different
signature that can be referred by different element in the configuration. If there is a delegate specified by
an element delegate whose the signature other than these four signatures, an exception will be raised
by XML Configuration Parser when parsing the configuration.
Class BitContentFieldConfig
namespace LMD.iso8583.config
public class BitContentFieldConfig
Class BitContentConfig
namespace LMD.iso8583.config
public class BitContentConfig
Class TlvTagConfig
namespace LMD.iso8583.config
public class TlvTagConfig
namespace LMD.iso8583.config
public class TlvConfig
Interface IMessageHeaderConfig
All configuration classes for header items should implement this interface. The header items are
represented by element bitmap, message-type and header. The message parser and message
compiler will recognize all header configuration object as IMessageHeaderConfig object.
namespace LMD.iso8583.config
public interface IMessageHeaderConfig
IMessageHeader GetNewHeader()
Returns an appropriate message container object for the associated header item. For
example, it will return a MessageBitMap object for a bitmap header. It‟s used by
message parser and message compiler to create the container for each header item. An
implementing class should utilize property Length to check/determine the header length.
Class MessageBitMapConfig
namespace LMD.iso8583.config
public class MessageBitMapConfig : IMessageHeaderConfig
IMessageHeader GetNewHeader()
Implements method GetNewHeader of interface IMessageHeaderConfig. Returns a
corresponding MessageBitMap object. Property Length of the MessageBitMap object
will be assigned the value of property Length of this configuration object.
Class MessageTypeConfig
namespace LMD.iso8583.config
public class MessageTypeConfig : IMessageHeaderConfig
IMessageHeader GetNewHeader()
Implements method GetNewHeader of interface IMessageHeaderConfig. Returns a
corresponding MessageTypeHeader object. Using property Value passed to the
constructor when creating the MessageTypeHeader object.
Class MessageHeaderConfig
namespace LMD.iso8583.config
public class MessageHeaderConfig : IMessageHeaderConfig
IMessageHeader GetNewHeader()
Implements method GetNewHeader of interface IMessageHeaderConfig. Returns a
corresponding MessageHeader object. The value of property Bytes of the
MessageHeader object will be the same as the value of property Value which has been
converted to a bytes array. Property GetFieldBytesFunc of the MessageHeader
object will refer the same delegate as referred by property GetFieldBytesFunc of this
configuration object.
Class MessageFieldConfig
namespace LMD.iso8583.config
public class MessageFieldConfig
Class MessageConfig
namespace LMD.iso8583.config
public class MessageConfig
Class ModelPropertyConfig
namespace LMD.iso8583.config
public class ModelPropertyConfig
public PropertyInfo PropertyInfo { get; set; }
It‟s the PropertyInfo object representing the property as mentioned by attribute name.
Class ModelConfig
Interface IMaskConfig
It defines the interface to get the result of masking bits operation. Masking bits operation is done when
there is an incoming message. It is to determine which model should be used to represent the message.
This interface is implemented by classes which represent element message-to-model and its child
elements (element and, or and mask). Only element mask defines how to mask the message bits
specifically. However, element and, or and message-to-model, that can contain some element masks,
will execute an operation involving all result of element mask inside them. Therefore, the classes
representing these elements should also implement this interface.
Note, element message-to-model can also contain element and and or. Element and can also contain
element or and vice versa. Therefore, element mask may also be operated with element and or or. By
implementing this interface, the process will be easier because it only invokes method IsQualified
regardless whether the operand is element mask, and or or.
namespace LMD.iso8583.config
public interface IMaskConfig
bool IsQualified(byte[] message)
Returns true if the incoming message is qualified.
Parameters:
o message is the incoming message to be tested.
Interface IMaskListConfig
It defines a list of IMaskConfig object. It is implemented by the classes representing element and, or
and message-to-model. These elements can include the other elements which implement interface
IMaskConfig.
namespace LMD.iso8583.config
public interface IMaskListConfig
Class MaskConfig
namespace LMD.iso8583.config
public class MaskConfig : IMaskConfig
Class MaskAndConfig
It represents element and inside element message-to-model. It does logical “and” operation between
all factors when testing a message.
namespace LMD.iso8583.config
public class MaskAndConfig : IMaskConfig, IMaskListConfig
Class MaskOrConfig
It represents element or inside element message-to-model. It does logical “or” operation between all
factors when testing a message.
namespace LMD.iso8583.config
public class MaskOrConfig : IMaskConfig, IMaskListConfig
Class MessageToModelConfig
It represents element message-to-model. It behaves like MaskOrConfig, that is, it will also execute
logical “or” operation. Therefore, it inherits MaskOrConfig. Extensions defined by this class are only the
attributes which apply to element message-to-model.
namespace LMD.iso8583.config
public class MessageToModelConfig : MaskOrConfig
Class TransactionTypeConfig
This class maintains all configuration objects so that they can be alive as long as the application is
running. The configuration objects are stored in some collections. These collections are fed by XML
Configuration Parser. These configuration objects‟ states represent the configuration written in XML
Configuration. Using XML objects is inefficient (not fast) because the configuration is always read each
time there is an incoming/outgoing message. Therefore, they must be converted to these configuration
objects. This converting (parsing) process, that is very time consuming, should be done once when the
application starts and each time the configuration changes. Once the configuration changes, reparsing
process can be asked again by using method Load of MessageProcessor object.
namespace LMD.iso8583
internal static class MessageConfigs
Among all collections above, only ClassToModels and MessageToModels are used intensively by
message compiler and message parser. The other collections are only used by XML Configuration Parser
to ease its task for parsing, which is actually able to be removed safely after parsing.
Delegate GetHeaderBytes
It defines signature for a function that can be used to get bytes for a message header, especially used by
message compiler. The function is referred by attribute delegate of element header in the
configuration.
namespace LMD.iso8583.config
public delegate byte[] GetHeaderBytes()
This function returns an array of bytes for the header value. This function may not return
null.
Delegate GetFieldBytes
This delegate is used for getting the value of a message field. Specially, it‟s used by message compiler.
The function implementing this delegate can be referred by attribute delegate of element bit in the
configuration.
namespace LMD.iso8583.config
public delegate byte[] GetFieldBytes<P>(P value)
This function takes a parameter which is the value of the mapped model property and returns
an array of bytes for the field value.
Delegate GetPropertyValue
It defines signature for a function that can be used to get the value for a model property. Typically, it‟s
used by message parser. The function can be referred by attribute delegate of element property in
the configuration.
namespace LMD.iso8583.config
public delegate R GetPropertyValue<R>(byte[] bytes)
This function takes a parameter which is the bytes of the mapped message field and returns
the value for the model property.
Delegate ProcessModel
It defines signature for a function that can be used by message parser to process a model yielded from a
message parsing. In this function, the business process is executed.
namespace LMD.iso8583.config
public delegate R ProcessModel<R,P>(P model)
This function takes a model as the only parameter and returns another model for the reply
message. It returns null if no reply.
This part is responsible to parse XML Configuration. The result of the parsing is some configuration
objects which are navigable much easier than XML objects. It causes much more efficient process in
parsing and compiling message. The configuration objects are used intensively by message parser and
message compiler. The configuration objects are stored in some collections maintained by class
MessageConfigs. The configuration objects will be alive as long as class MessageConfigs is not
destroyed (it‟s likely starting from this library is loaded up to the application stops).
XML configuration parser should be invoked before using message processor. It‟s invoked by executing
method Load of MessageProcessor. If XML configuration parser finds any bad configuration (such as
invalid value for an attribute, required attribute is not specified, a child element is placed inside an
inappropriate parent element etc), it will throw an exception of class ConfigParseException. It should
cause the application shuts down (it cannot process ISO 8583 message) because the exception will be
propagated by method Load of MessageProcessor. XML configuration parser will declare an error
message as clearly as possible. It tries to locate the element in which the bad configuration exists. The
element‟s attributes will guide to locate (id attribute is good clue if defined). Any rules and constraints
about the configuration are explained in section XML Configuration.
Class XmlConfigParser
This class represents XML configuration parser. Method Load of MessageProcessor creates an
instance object of this class and then calls its method Parse to execute XML configuration parsing.
namespace LMD.iso8583
class XmlConfigParser
o elmId is the id of the element (parmeter elm). It‟s null if the element does not
declares the id or it does gets the value of attribute id.
o elmName is the element name which owns the attribute. It‟s for error message.
o defaultVal is the default value if the attribute is not defined. If this parameter is
null, this method will return -1.
o propName is the property name. It‟s the same as the value of attribute name of
element property or field.
o locMsg is for the error message. It should be the location of the element
specifying property.
o cfg is the configuration object for element model specified by parameter elm.
o cfg is the configuration object of the element model containing the processed
element property.
Exception
This library provides some exception classes that will be used if there is any error pertaining to executing
code inside this library. MessageProcessorException is the root exception. It inherits class
Exception directly. The other exceptions inherit this exception. By this condition, it can be checked that
all exceptions raised by this library are always MessageProcessorException object or its descendant.
Class MessageProcessorException
It will be thrown if there is any exception in executing message processor or in setting message container.
It is also the general exception class should be used if no specific exception class defined.
Class ConfigParserException
This exception will be thrown when any bad configuration is found. It happens when parsing XML
configuration by XML configuration parser.
Class MessageParserException
The exception of this class will be thrown if any failure happens in parsing message process. It is thrown
by message parser.
Class MessageCompilerException
The exception of this class will be thrown if any failure happens in compiling message process. It is
thrown by message compiler.
Class MessageListenerException
This logger is used to log errors happening when processing the message or to log events such as a
request comes. When parsing the configuration, this logger is also used to log the error before the
message processor closes. Class Logger is the main class that is assigned to write the log. The log can
be written into console screen, file or another media based on the application setting. The application can
set the logger output by using method AddOutput or ReplaceOutput. The application may have some
logger output medias.
Interface ILoggerOutput
All logger output objects must implement this interface so that class Logger can use them. This interface
defines the methods to write the log.
namespace LMD.iso8583
public interface ILoggerOutput
Class ConsoleLoggerOutput
It is the basic/common class of logger output. It writes the log to console screen. By default, this class will
be used by class Logger as the output.
namespace LMD.iso8583
public class ConsoleLoggerOutput : ILoggerOutput
Class LoggerOutputList
As mentioned before, the logger may have some outputs. This class is to encapsulate all output objects
owned by the logger. This class implements interface ILoggerOutput, that is, it can be used as output
media which will write the log to all output objects contained by it. By favor of this object, Logger object
will not make any difference when writing a log either to one or more output. It still invokes only one
method Write or WriteLine of ILoggerOutput. An object of this class will be created automatically, if
not exists, when method AddOutput is invoked. Invocation of method AddOutput afterwards is actually
to add the output object to this LoggerOutputList object. Logger object itself only knows that the
used output object is this LoggerOutputList object.
namespace LMD.iso8583
public class LoggerOutputList : ILoggerOutput
Class Logger
This is the main class in writing the log. The application must get an instance of this class to write the log.
This class defines method Write and WriteLine to write the log. Only one instance may exist (a
singleton object). The only instance can be retrieved from method GetInstance.
namespace LMD.iso8583
public class Logger
Namespace LMD.iso8583.model
Class NibbleList
Nibble is four bits, that is a half byte. In ISO 8583 message, there are several fields which its each
character is stored in a nibble. It is to reduce the count of needed bytes to store data. To see what type of
field which uses the nibble data, you may consult attribute type of element bit in XML Configuration.
Class NibbleList defines a list of nibbles. This class inherits List<byte>. All method of List should
apply. This class is assignable to type of byte[] and vice versa. This class can be used by a model as
the type of its attribute and furthermore this attribute will be convertible to be an array of bytes that will be
used as the value of the mapped message field.
This class extends List by an additional property, that is IsOdd whose type of bool. If this property is
true then the count of nibbles is odd, that is, there is a half byte unused, at the first or the last.
Class DateTimeNibble
This class provides methods to convert a date/time value to be a bytes array and vice versa. In ISO 8583
message, a date/time value is usually stored in a group of nibble (each character is stored in a nibble).
For example, “December 13” or “12/13” will be stored in four nibbles (2 bytes), the first two nibbles are for
2 digits of month and the rest are for two digits of day. Date/time field must be specified as type “N” in
XML Configuration (see attribute type of element bit).
namespace LMD.iso8583.model
public class DateTimeNibble
public static DateTime GetMMDD(byte[] bytes)
Converts four nibbles (2 bytes) to a DateTime value. The first two nibbles are 2 digits of
month and the second two nibbles are two digits of day. This method throws an exception
if the length of parameter bytes is less than 2 or there is a nibble whose invalid value.
The valid value is between 0 and 9. A nibble can represent a value of 0 to 15. If the length
of parameter bytes is greater than 2 then only the first two bytes will be used.
MessageToModelConfig
«delegate»
GetHeaderBytes
«delegate»
GetFieldBytes MaskOrConfig MaskAndConfig MaskConfig
«delegate»
GetPropertyValue
«delegate»
ProcessModel
«interface» «interface»
IMaskListConfig IMaskConfig
1 *
«utility»
MessageConfigs
1
* 1
BitContentFieldConfig BitContentConfig
0..1
1 MessageFieldConfig
1 0..1 1
*
ModelPropertyConfig * 1 ModelConfig MessageConfig
1
1
1 1
1
1 0..1
0..1
TlvTagConfig TlvConfig
* 1
NibbleList
«uses»
«uses» «uses»
MessageProcessorWorker MessageParser MessageCompiler
«uses» «uses»
«uses» *
«uses»
«uses»
«uses» «interface» 1 «interface»
IModelParsingReceiver IMessageHeaderConfig
«uses» «uses»
«uses»
«uses»
MessageProcessor
MessageClient
«uses»
MessageHeaderConfig MessageTypeConfig MessageBitmapConfig
«uses»
«uses»
«uses» «uses»
«uses»
«interface» «interface»
«uses»
0..1 IParsedMessage ICompiledMessage
«delegate»
«uses»
MessageCallback
«uses»
1 1
«uses»
«uses»
«interface»
IMessageSender
«interface»
IProcessedMessage 1 1
ParsedMessageContainer CompiledMessageContainer
«interface»
ILoggerOutput
1 1
1 1
*
«uses» «uses»
MessageListenerWorker *
«uses»
«uses» CompiledMessageField
1 1
«uses»
«uses» «uses» «uses» LoggerOutputList
«uses» «uses»
«uses» «uses» * *
ConsoleLoggerOutput
MessageListener
IMessageHeader
«uses» «uses»
Logger *
MessageField
1 «uses»
MessageListenerSync
MessageBitMap MessageTypeHeader MessageHeader
«uses»
«uses» NMessageField AnMessageField AnsMessageField
«uses»
XmlConfigParser NsMessageField
«uses»
«uses»
«uses»
Legend
A B A inherits B
A B A implements B
«uses»
A B A uses B
BitContentConfig MaskConfig
TlvTagConfig MaskAndConfig
TlvConfig MaskOrConfig
«interface» MessageToModelConfig
IMessageHeaderConfig
MessageHeaderConfig «delegate»
GetFieldBytes
MessageFieldConfig «delegate»
GetPropertyValue
MessageConfig «delegate»
ProcessModel
«uses»
ModelPropertyConfig
XmlConfigParser
ModelConfig
«uses»
CompiledMessageContainer «uses»
«uses»
NsMessageField
«uses»
«uses»
«uses»
«uses»
NMessageField «uses»
«uses»
«uses»
MessageField «uses»
«uses» MessageProcessor
«utility» «uses»
MessageUtility
MessageHeader
«uses» «uses»
«uses» «exception»
MessageProcessorException
«uses»
XmlConfigParser
«uses» «uses»
«uses» «exception» «exception» «exception» «exception»
ConfigParserException MessageParserException MessageCompilerException MessageListenerException
«uses»
«uses»
MaskConfig «uses» «uses» «uses»
«uses»
«uses»
«uses» «uses»
«uses»
«uses» «utility»
Util