Search in sources :

Example 1 with OffsetIndexedComposite

use of org.jpos.tlv.OffsetIndexedComposite 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

IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 ISOComponent (org.jpos.iso.ISOComponent)1 ISOException (org.jpos.iso.ISOException)1 ISOFieldPackager (org.jpos.iso.ISOFieldPackager)1 ISOTaggedField (org.jpos.tlv.ISOTaggedField)1 OffsetIndexedComposite (org.jpos.tlv.OffsetIndexedComposite)1 LogEvent (org.jpos.util.LogEvent)1