Created User's Guide (markdown)

Enrique Zamudio
2016-07-04 10:14:19 -05:00
parent 293ee9fbf3
commit 8bcdcbec6f
+80
@@ -0,0 +1,80 @@
# Usage Guide
This guide explains how to setup j8583. If you want to know more about the ISO8583 protocol,
please read the [corresponding page](ISO8583).
## The `MessageFactory` and `IsoMessage` classes
These are the two main classes you need to use to work with ISO8583 messages. An `IsoMessage` can be
encoded into a byte array or a `ByteBuffer` to be written to an `OutputStream`, or it can directly write itself
to an `OutputStream`. You can set and get the values for each field in an `IsoMessage`, and it will adjust itself
to use a secondary bitmap if necessary. An `IsoMessage` has settings to encode itself in binary or ASCII,
to use a secondary bitmap even if it's not necessary, and it can have its own ISO header.
However, it can be cumbersome to programmatically create `IsoMessages` all the time. The `MessageFactory` is a
big aid in creating IsoMessages with predefined values; also, it can set the date and the trace number
in each new message.
## Configuring the `MessageFactory`
There are five main things you need to configure in a `MessageFactory`: ISO headers, message templates,
parsing templates, `TraceNumberGenerator`, and custom field encoders.
### ISO headers
ISO headers are strings that are associated with a message type. Whenever you ask the message factory
to create an `IsoMessage`, it will pass the corresponding ISO header (if present) to the new message.
### Message templates
A message template is an `IsoMessage` itself; the `MessageFactory` can have a template for each message type
it needs to create. When it creates a message and it has a template for that message type, it copies the
fields from the template to the new message before returning it.
### Parsing templates
A parsing template is a map containing `FieldParseInfo` objects as values and the field numbers as the keys.
A `FieldParseInfo` object contains an `IsoType` and an optional length; with this information and the field number,
the `MessageFactory` can parse incoming messages, first analyzing the message type and then using the parsing
template for that type; when parsing a message, the `MessageFactory` only parses the fields that are specified
in the message's bitmap. For example if the bitmap specifies field 4, the factory will get the `FieldParseInfo`
stored in the map under key 4, and will attempt to parse the field according to the type and length specified
by the `FieldParseInfo`.
A message does not need to contain all the fields specified in a parsing template, but a parsing template must
contain all the fields specified in the bitmap of a message, or the `MessageFactory` won't be able to parse it
because it has no way of knowing how it should parse that field (and also all subsequent fields).
### The `TraceNumberGenerator`
When creating new messages, they usually need to have a unique trace number, contained in field 11. Also, they
usually need to have the date they were created (or the date the transaction was originated) in field 7.
The `MessageFactory` can automatically set the current date on all new messages, you just need to set the
`assignDate` property to `true`. And it can also assign a new trace number to each message it creates,
but for this it needs a `TraceNumberGenerator`.
The `TraceNumberGenerator` interface defines a `nextTrace()` method, which must return a new trace number
between 1 and 999999. It needs to be cyclic, so it returns 1 again after returning 999999. And usually, it
needs to be thread-safe.
j8583 only defines the interface; in production environments you will usually need to implement your own
`TraceNumberGenerator`, getting the new trace number from a sequence in a database or some similar mechanism.
As an example, the library includes the `SimpleTraceGenerator`, which simply increments an in-memory value.
### Custom field encoders
Certain implementations of ISO8583 specify fields which contain many subfields. If you only handle strings
in those fields, you'll have to encode all those values before storing them in an `IsoMessage`, and decode them
when you get them from an `IsoMessage`.
In these cases you can implement a `CustomField`, which is an interface that defines two methods, one for encoding
an object into a String and another for decoding an object from a String. You can pass the `MessageFactory` a
`CustomField` for every field where you want to store custom values, so that parsed messages will return the
objects decoded by the `CustomField`s instead of just strings; and when you set a value in an `IsoMessage`, you
can specify the `CustomField` to be used to encode the value as a String.
[Learn more about custom field encoders](Encoders).
## XML configuration
The easiest way to configure the message templates and parsing templates is by using a
[XML config file](XML Configuration) and pass it to the `MessageFactory`.