Configuración por XML

La clase MessageFactory puede leer un archivo XML para congfigurar sus plantillas de mensajes, encabezados ISO y plantillas de lectura, que son las partes más tediosas de configurar por código.

Hay tres tipos principales de elementos que se deben especificar en el archivo de configuración: header, template y parse. Estos deben ir dentro de un único elemento j8583-config en el archivo. Existe un DTD disponible en .

Elemento header

Se debe especificar un elemento header por cada tipo de mensaje que necesita un encabezado ISO, únicamente uno por cada tipo de mensaje:

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

Nuevo en 1.9: Se puede definir un elemento header como referencia a otro elemento para que tengan el mismo valor:

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

Elemento template

Cada elemento template define una plantilla de mensaje, con el tipo del mismo y los campos que debe incluir, con sus valores ya definidos. Cada mensaje de este tipo que se pida a la fábrica de mensajes, contendrá los valores definidos en la plantilla. Esto es muy útil para campos que siempre tienen el mismo valor en todos los mensajes creados. Solamente se permite una plantilla por tipo.

<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>

Nuevo en 1.9: Se puede definir una plantilla que extienda otra plantilla, de modo que incluya todos los campos de la plantilla que extiende, además de poder excluir campos de la plantilla original.

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

En este ejemplo, la plantilla para mensajes 0400 include todos los campos de los mensajes 0200 excepto el campo 102, y además incluye el campo 90.

Elemento parse

Cada elemento parse define una plantilla de lectura para un tipo de mensaje. Debe incluir todos los campos que el mensaje entrante pueda contener, indicando el tipo y longitud de cada campo (la longitud depende del tipo de dato). Solamente los tipos ALPHA y NUMERIC deben incluir longitud, los demás ya la tienen predefinida o la toman del mismo campo cuando se lee el mensaje (LLVAR y 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>

Nuevo en 1.9: Al igual que las plantillas, las guías de lectura también pueden extender otras guías:

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

Campos compuestos

Otra característica nueva a partir de la versión 1.9 son los campos compuestos, por medio de la clase CompositeField, que es una implementación de CustomField que funciona como un contenedor de varios IsoValues, y puede ser configurado en la guía de lectura de un tipo de mensaje:

<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>

En este ejemplo, cuando un mensaje tipo 0410 se decodifica, el valor del campo 125 será una instancia de CompositeField y se pueden obtener sus subcampos con los métodos getField() y getObjectValue(). El atributo num de los subcampos es ignorado; simplemente se tiene que incluir para pasar la validación del DTD.

Lo anterior significa que se puede hacer esto con código, una vez que se ha leído el mensaje:

//Suponiendo que originalmente el campo 125 trae "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"

También se puede crear un CompositeField, guardar varios valores en él, y luego ponerlo como valor en cualquier campo de un IsoMessage, usando el mismo objeto como 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);

Cuando ese mensaje sea codificado, el campo 125 se verá como "018one 03two000123OK".