0

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

1 Answers1

2

as javadoc of getDynamicPackager(byte[], byte[]) says:

    /**
     * allow subclasses to override default packager
     * on incoming messages
     * @param header message header
     * @param image incoming message image
     * @return ISOPackager
     */
     protected ISOPackager getDynamicPackager (byte[] header, byte[] image) {
         return getDynamicPackager(image);
     }

that method is for overriding packager for incoming message.

If you want to override packager for outgoing message you need to implement method:


   /**
    * allow subclasses to override default packager
    * on outgoing messages
    * @param m outgoing ISOMsg
    * @return ISOPackager
    */
    protected ISOPackager getDynamicPackager (ISOMsg m) {
        return packager;
    }

For implementing that method, you can just return getDynamicPcakager(m.getHeader(), null) since you are not using the message parameter.

Andrés Alcarraz
  • 1,570
  • 1
  • 12
  • 21