Search in sources :

Example 26 with ISOFieldPackager

use of org.jpos.iso.ISOFieldPackager in project jPOS by jpos.

the class TaggedSequencePackager method unpack.

@Override
public int unpack(ISOComponent m, byte[] b) throws ISOException {
    LogEvent evt = new LogEvent(this, "unpack");
    try {
        if (m.getComposite() != m)
            throw new ISOException("Can't call packager on non Composite");
        if (b.length == 0)
            // nothing to do
            return 0;
        if (// save a few CPU cycle if no logger available
        logger != null)
            evt.addMessage(ISOUtil.hexString(b));
        // Read any non-tlv fields present at beginning of data
        PrefixUnpackResult prefixUnpackResult = unpackPrefixes(m, b);
        int subFieldId = prefixUnpackResult.getSubFieldId();
        int consumed = prefixUnpackResult.getConsumed();
        if (subFieldId == 0) {
            subFieldId = 1;
        }
        while (consumed < b.length) {
            ISOField tagField = new ISOField(subFieldId);
            tagPackager.unpack(tagField, b, consumed);
            String tag = tagField.getValue().toString();
            ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
            if (fieldPackager == null) {
                fieldPackager = (ISOFieldPackager) packagerMap.get("default");
            }
            if (fieldPackager == null) {
                throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
            }
            int fieldNumber = subFieldId++;
            ISOTaggedField taggedField = (ISOTaggedField) fieldPackager.createComponent(fieldNumber);
            consumed += fieldPackager.unpack(taggedField, b, consumed);
            m.set(taggedField);
        }
        if (b.length != consumed) {
            evt.addMessage("WARNING: unpack len=" + b.length + " consumed=" + consumed);
        }
        return consumed;
    } catch (ISOException e) {
        evt.addMessage(e);
        throw e;
    } catch (Exception e) {
        evt.addMessage(e);
        throw new ISOException(e);
    } finally {
        Logger.log(evt);
    }
}
Also used : ISOField(org.jpos.iso.ISOField) ISOException(org.jpos.iso.ISOException) LogEvent(org.jpos.util.LogEvent) ISOTaggedField(org.jpos.tlv.ISOTaggedField) ISOFieldPackager(org.jpos.iso.ISOFieldPackager) ISOException(org.jpos.iso.ISOException) IOException(java.io.IOException)

Example 27 with ISOFieldPackager

use of org.jpos.iso.ISOFieldPackager in project jPOS by jpos.

the class TaggedSequencePackager method setFieldPackager.

public void setFieldPackager(ISOFieldPackager[] subFieldPackagers) {
    super.setFieldPackager(subFieldPackagers);
    for (ISOFieldPackager subFieldPackager : subFieldPackagers) {
        if (subFieldPackager instanceof TaggedFieldPackager) {
            String token = ((TaggedFieldPackager) subFieldPackager).getToken();
            if ("##########".startsWith(token)) {
                token = "default";
            }
            packagerMap.put(token, (TaggedFieldPackager) subFieldPackager);
        }
    }
    this.tagPackager = getTagPackager();
}
Also used : TaggedFieldPackager(org.jpos.iso.TaggedFieldPackager) ISOFieldPackager(org.jpos.iso.ISOFieldPackager)

Example 28 with ISOFieldPackager

use of org.jpos.iso.ISOFieldPackager in project jPOS by jpos.

the class TaggedSequencePackager method pack.

/**
 * Pack the subfield into a byte array
 */
public byte[] pack(ISOComponent m) throws ISOException {
    LogEvent evt = new LogEvent(this, "pack");
    try {
        ISOComponent c;
        List<byte[]> l = new ArrayList<byte[]>();
        Map fields = m.getChildren();
        fields.remove(new Integer(-1));
        int len = 0;
        boolean tagsStarted = false;
        Iterator iterator = fields.values().iterator();
        if (m instanceof OffsetIndexedComposite) {
            int offset = ((OffsetIndexedComposite) m).getOffset();
            for (int i = 0; i < offset && iterator.hasNext(); i++) {
                iterator.next();
            }
        }
        while (iterator.hasNext() && len < this.length) {
            Object obj = iterator.next();
            c = (ISOComponent) obj;
            byte[] b;
            if (c.getValue() != null) {
                if (c instanceof ISOTaggedField) {
                    tagsStarted = true;
                    String tag = ((ISOTaggedField) c).getTag();
                    if (tag == null) {
                        evt.addMessage("error packing subfield " + c.getKey());
                        evt.addMessage(c);
                        throw new ISOException("Tag should not be null");
                    } else {
                        ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
                        if (fieldPackager == null) {
                            fieldPackager = (ISOFieldPackager) packagerMap.get("default");
                        }
                        if (fieldPackager == null) {
                            throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
                        }
                        b = fieldPackager.pack(c);
                        if (len + b.length > this.length) {
                            break;
                        }
                        len += b.length;
                        l.add(b);
                    }
                } else if (!tagsStarted && fld.length > (Integer) c.getKey() && fld[(Integer) c.getKey()] != null) {
                    b = fld[(Integer) c.getKey()].pack(c);
                    len += b.length;
                    l.add(b);
                } else {
                    int tagNumber = (Integer) c.getKey();
                    String tag = ISOUtil.padleft(String.valueOf(tagNumber), this.tag.length(), '0');
                    ISOTaggedField isoTaggedField = new ISOTaggedField(tag, c);
                    if (fld.length > tagNumber) {
                        b = fld[(Integer) c.getKey()].pack(isoTaggedField);
                    } else {
                        ISOFieldPackager fieldPackager = (ISOFieldPackager) packagerMap.get(tag);
                        if (fieldPackager == null) {
                            fieldPackager = (ISOFieldPackager) packagerMap.get("default");
                        }
                        if (fieldPackager == null) {
                            throw new ISOException("No default tag packager and no field packager configured for tag: " + tag);
                        }
                        b = fieldPackager.pack(isoTaggedField);
                        if (len + b.length > this.length) {
                            break;
                        }
                    }
                    len += b.length;
                    l.add(b);
                }
            }
            if (m instanceof OffsetIndexedComposite) {
                ((OffsetIndexedComposite) m).incOffset();
            }
        }
        int k = 0;
        byte[] d = new byte[len];
        for (byte[] b : l) {
            System.arraycopy(b, 0, d, k, b.length);
            k += b.length;
        }
        if (// save a few CPU cycle if no logger available
        logger != null)
            evt.addMessage(ISOUtil.hexString(d));
        return d;
    } catch (ISOException e) {
        evt.addMessage(e);
        throw e;
    } catch (Exception e) {
        evt.addMessage(e);
        throw new ISOException(e);
    } finally {
        Logger.log(evt);
    }
}
Also used : ISOComponent(org.jpos.iso.ISOComponent) OffsetIndexedComposite(org.jpos.tlv.OffsetIndexedComposite) LogEvent(org.jpos.util.LogEvent) ArrayList(java.util.ArrayList) ISOFieldPackager(org.jpos.iso.ISOFieldPackager) ISOException(org.jpos.iso.ISOException) IOException(java.io.IOException) ISOException(org.jpos.iso.ISOException) Iterator(java.util.Iterator) ISOTaggedField(org.jpos.tlv.ISOTaggedField) TreeMap(java.util.TreeMap) Map(java.util.Map)

Aggregations

ISOFieldPackager (org.jpos.iso.ISOFieldPackager)28 Test (org.junit.Test)24 ISOException (org.jpos.iso.ISOException)12 ISOMsg (org.jpos.iso.ISOMsg)12 ISOField (org.jpos.iso.ISOField)5 Logger (org.jpos.util.Logger)4 IOException (java.io.IOException)3 IFA_LCHAR (org.jpos.iso.IFA_LCHAR)3 ISOBinaryField (org.jpos.iso.ISOBinaryField)3 ISOComponent (org.jpos.iso.ISOComponent)3 ISOTaggedField (org.jpos.tlv.ISOTaggedField)3 LogEvent (org.jpos.util.LogEvent)3 IFA_AMOUNT (org.jpos.iso.IFA_AMOUNT)2 IFA_LLLLCHAR (org.jpos.iso.IFA_LLLLCHAR)2 IFE_CHAR (org.jpos.iso.IFE_CHAR)2 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 ConfigurationException (org.jpos.core.ConfigurationException)1