I have created my own channel extending NAC channel based on the header it will load the packager dynamically.
The channel is as below based on the values the header is correctly identified for the incoming and the outgoing message (example mada_header and response_mada_header).
The package is loaded correctly for the incoming message which is CISebcdic_mada.xml but for outgoing message it is not loaded dynamically (expected is to load the CISebcdic_mada.xml) instead it is using the default packager from the server xml file
public class GWMipChannel extends NACChannel {
byte[] madaHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};
byte[] nitmxHeader = {(byte) 0x00, (byte) 0x18, (byte) 0xd6, (byte) 0xf3, (byte) 0xf7, (byte) 0xf3, (byte) 0xf2};
byte[] response_mada_header = {(byte) 0x00, (byte) 0x31, (byte) 0xc9, (byte) 0xf3, (byte) 0xf6, (byte) 0xf8, (byte) 0xf7};
byte[] message_header = null;
@Override
protected byte[] readHeader(int hLen) throws IOException {
byte[] header = new byte[25];
serverIn.readFully(header, 0, 25);
boolean mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(madaHeader));
boolean nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader));
boolean amex_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(amexheader));
boolean rsp_mada_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(response_mada_header, 0, 7));
boolean rsp_nitmx_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(response_mada_header, 0, 7));
boolean rsp_amex_header = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(response_amexheader, 0, 7));
if (mada_header) {
return header;
} else if (nitmx_header) {
header = Arrays.copyOf(header,47 );
serverIn.readFully(header, 25, 22);
return header;
}
else if (amex_header){
return header;
}
else if (rsp_mada_header) {
//serverIn.readFully(header, 0, 50);
header = Arrays.copyOf(header, 48);
serverIn.readFully(header, 0, 48);
return header;
}
else if (rsp_nitmx_header) {
//serverIn.readFully(header, 0, 50);
header = Arrays.copyOf(header, 50);
serverIn.readFully(header, 0, 50);
return header;
}
else{
Exception e = new ISOException();
e.printStackTrace();
}
this.message_header = header;
return header;
}
@Override
protected void sendMessageHeader(ISOMsg m, int len) throws IOException {
byte[] header = m.getHeader();
//assume header is the one to send, and already has 22 or 44 length
//or you can check
serverOut.write(header);
}
@Override
protected ISOPackager getDynamicPackager(byte[] header, byte[] message) {
boolean md = ByteBuffer.wrap(header, 3, 4).equals(ByteBuffer.wrap(madaHeader,3,4));
boolean nd = ByteBuffer.wrap(header, 0, 7).equals(ByteBuffer.wrap(nitmxHeader,0,7));
ISOPackager genericPackager = null;
if(nd) {
try {
genericPackager = new GenericPackager("cfg/packager/AS2805_NITMX.xml");
} catch (ISOException e) {
e.printStackTrace();
}
}
if(md) {
try {
genericPackager = new GenericPackager("cfg/packager/CISebcdic_mada.xml");
} catch (ISOException e) {
e.printStackTrace();
}
}
if(ax) {
try {
genericPackager = new GenericPackager("cfg/packager/CISebcdic_AMX.xml");
} catch (ISOException e) {
e.printStackTrace();
}
}
return genericPackager;
}
}
my server-xml file -
<server class="org.jpos.q2.iso.QServer" logger="Q2" name="gwmip-server-5281" realm="gwmip-server-5281">
<attr name="port" type="java.lang.Integer">5281</attr>
<channel class="org.jpos.iso.channel.GWMipChannel"
packager="org.jpos.iso.packager.GenericPackager"
type="server"
logger="Q2"
header="0018D6F3F7F3F2000000000000000000000000000000000002"
>
<property name="packager-config" value="cfg/packager/CISebcdic_AMX.xml" debug="True" />
<!--<property name="packager-config" value="cfg/packager/iso93ebcdic-custom.xml" debug="True" />-->
<property name="timeout" value="180000"/>
</channel>
<request-listener class="org.jpos.iso.IncomingListener" logger="Q2" realm="incoming-request-listener">
<property name="queue" value="GWMIPTXNMGR" />
<property name="ctx.DESTINATION" value="gwmip-AUTORESPONDER" />
</request-listener>
</server>
the incoming XML , where the packager is dynamically loaded correctly for the incoming message. the message is forwarded to the issuer host
<log realm="channel/127.0.0.1:44158" at="2020-06-23T03:38:42.475" lifespan="872ms">
<receive>
<isomsg direction="incoming">
<!-- org.jpos.iso.packager.GenericPackager[cfg/packager/CISebcdic_mada.xml] -->
<header>0018D6F3F6F8F7000000000000000000000000000000000002</header>
<field id="0" value="0200"/>
<field id="2" value="5000100100700010"/>
<field id="3" value="000000"/>
<field id="4" value="000000000100"/>
<field id="7" value="0623033838"/>
<field id="11" value="033838"/>
<field id="12" value="033838"/>
<field id="13" value="0623"/>
<field id="14" value="2006"/>
<field id="18" value="4900"/>
<field id="22" value="812"/>
<field id="32" value="588850"/>
<field id="33" value="004601"/>
<field id="37" value="230620033838"/>
<field id="41" value="UTIS2I25"/>
<field id="42" value="EUREKAAIR "/>
<field id="43" value="01007/S2M_txn_base.mat rix_/ Parel M XYZ"/>
<field id="48" value="54363130353030303031393230333132333432303730313033323132343332386A48796E2B3759466931455541524541414141764E5565364876383D" type="binary"/>
<field id="49" value="356"/>
<field id="61" value="10251000066003560000000000"/>
<field id="63" value="MC2MJG4F7"/>
</isomsg>
</receive>
</log>
the outgoing message ( response to the incoming message ) is as below the header length is loaded correctly , but the packager is not loaded dynamically which is CISebcdic_mada.xml instead it is using the default packager specifed in the server xml file which is -CISebcdic_AMX.xml
<log realm="channel/127.0.0.1:44158" at="2020-06-23T03:38:42.504" lifespan="2ms">
<send>
<isomsg direction="outgoing">
<!-- org.jpos.iso.packager.GenericPackager[cfg/packager/CISebcdic_AMX.xml] -->
<header>0031C9F3F6F8F700000000000000000000000000000000000000000000000000000000000000000000000000000000000002</header>
<field id="0" value="0210"/>
<field id="2" value="5000100100700010"/>
<field id="3" value="000000"/>
<field id="4" value="000000000100"/>
<field id="11" value="033838"/>
<field id="12" value="033838"/>
<field id="13" value="0623"/>
<field id="15" value="0623"/>
<field id="32" value="588850"/>
<field id="33" value="004601"/>
<field id="37" value="230620033838"/>
<field id="38" value="033842"/>
<field id="39" value="00"/>
<field id="41" value="UTIS2I25"/>
<field id="48" value="T6105000019203123420701032124328jHyn+7YFi1EUAREAAAAvNUe6Hv8="/>
<field id="49" value="356"/>
<field id="63" value="MC2MJG4F7"/>
</isomsg>
</send>
</log>
is there anything I have to do to load the packager dynamically for the outgoing ( response message) ?
thanks in advance