XML Configuration

The MessageFactory can read a XML file to setup message templates, ISO headers by type and parsing templates, which are the most cumbersome parts to configure programmatically.

There are three types of main elements that you need to specify in the config file: header, template, and parse. All these must be contained in a single j8583-config element. There is a DTD available at .

header element

Specify a header element for every type of message that needs an ISO header. Only one per message type:

<header type="0200">ISO015000050</header>
<header type="0400">ISO015000050</header>

New in 1.9: You can define a header as a reference to another header:

<header type="0800" ref="0200" />

The header for 0800 messages will be the same as the header for 0200 messages.

template element

Each template element defines a message template, with the message type and the fields that the template should include. Every new message of that type that the MessageFactory creates will contain those same values, so this is very useful for defining fixed values, which will be the same in every message. Only one template per type.

<template type="0200">
    <field num="3" type="NUMERIC" length="6">650000</field>
    <field num="32" type="LLVAR">456</field>
    <field num="35" type="LLVAR">4591700012340000=</field>
    <field num="43" type="ALPHA" length="40">Fixed-width data</field>
    <field num="48" type="LLLVAR">Life, the Universe, and Everything|42</field>
    <field num="49" type="ALPHA" length="3">840</field>
    <field num="60" type="LLLVAR">B456PRO1+000</field>
    <field num="61" type="LLLVAR">This field can have a value up to 999 characters long.</field>
    <field num="100" type="LLVAR">999</field>
    <field num="102" type="LLVAR">ABCD</field>
</template>

New in 1.9: You can define a template as extending another template, so that it includes all the fields from the referenced template as well as any new fields defined in it, as well as excluding fields from the referenced template:

<template type="0400" extends="0200">
    <field num="90" type="ALPHA" length="42">Bla bla</field>
    <field num="102" type="exclude" />
</template>

In the above example, the template for message type 0400 will include all fields defined in the template for message type 0200 except field 102, and will additionally include field 90.

parse element

Each parse element defines a parsing template for a message type. It must include all the fields that an incoming message can contain, each field with its type and length (if needed). Only ALPHA and NUMERIC types need to have a length specified. The other types either have a fixed length, or have their length specified as part of the field (LLVAR and LLLVAR).

<parse type="0210">
    <field num="3" type="NUMERIC" length="6" />
    <field num="4" type="AMOUNT" />
    <field num="7" type="DATE10" />
    <field num="11" type="NUMERIC" length="6" />
    <field num="12" type="TIME" />
    <field num="13" type="DATE4" />
    <field num="15" type="DATE4" />
    <field num="17" type="DATE_EXP" />
    <field num="32" type="LLVAR" />
    <field num="35" type="LLVAR" />
    <field num="37" type="NUMERIC" length="12" />
    <field num="38" type="NUMERIC" length="6" />
    <field num="39" type="NUMERIC" length="2" />
    <field num="41" type="ALPHA" length="16" />
    <field num="43" type="ALPHA" length="40" />
    <field num="48" type="LLLVAR" />
    <field num="49" type="ALPHA" length="3" />
    <field num="60" type="LLLVAR" />
    <field num="61" type="LLLVAR" />
    <field num="70" type="ALPHA" length="3" />
    <field num="100" type="LLVAR" />
    <field num="102" type="LLVAR" />
    <field num="126" type="LLLVAR" />
</parse>

New in 1.9: As with message templates, you can define parsing guides that extend other parsing guides:

<parse type="0410" extends="0210">
    <field num="90" type="ALPHA" length="42" />
    <field num="102" type="exclude" />
</parse>

Composite fields

Another new feature introduced in 1.9 is the CompositeField. This is a CustomField that acts as a container for several IsoValues, and it can be configured in the parsing guide of a message type:

<parse type="0410">
    <field num="125" type="LLLVAR">
        <field num="1" type="ALPHA" length="5" />
        <field num="2" type="LLVAR" />
        <field num="3" type="NUMERIC" length="6" />
        <field num="4" type="ALPHA" length="2" />
    </field>
</parse>

In the above example, when a message with type 0410 is parsed, the value for field 125 will be a CompositeField and you can obtain the subfields via getField() or getObjectValue(). The num attribute of the subfields is ignored; it's just there to pass the DTD validation.

This means that you can do this via code:

//Assuming original data for field 125 is "018one  03two123456OK"
CompositeField f = message.getObjectValue(125);
String sub1 = f.getObjectValue(0); //"one  "
String sub2 = f.getObjectValue(1); //"two"
String sub3 = f.getObjectValue(2); //"123456"
String sub4 = f.getObjectValue(3); //"OK"

You can also create a CompositeField, store several subfields inside it, and store it in any field inside an IsoMessage, specifying the same instance as the CustomField:

CompositeField f = new CompositeField().addValue(new IsoValue<String>(IsoType.ALPHA, "one", 5))
    .addValue(new IsoValue<String>(IsoType.LLVAR, "two"))
    .addValue(new IsoValue<Long>(IsoType.NUMERIC, 123l, 6))
    .addValue(new IsoValue<String>(IsoType.ALPHA, "OK", 2));
message.setValue(125, f, f, IsoType.LLLVAR, 0);

When the message is encoded, field 125 will be "018one 03two000123OK".