/*
* jPOS Project [http://jpos.org]
* Copyright (C) 2000-2017 jPOS Software SRL
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jpos.fsdpackager;
import java.util.LinkedHashMap;
import java.util.Map;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOUtil;
public class FSDMsgX extends AFSDFieldPackager {
public String dump(String prefix, Map<String, String> setfields) {
// TODO Auto-generated method stub
return dump(prefix);
}
private Map<String, AFSDFieldPackager> fieldPackagers = new LinkedHashMap<String, AFSDFieldPackager>();
private Map<String, String> setfields = new LinkedHashMap<String, String>();
public FSDMsgX(String name) {
setName(name);
}
private FSDMsgX() {
};
public void add(String name, AFSDFieldPackager fsdFieldPackager) {
getFields().put(name,fsdFieldPackager);
}
public void add(AFSDFieldPackager fsdFieldPackager) {
getFields().put(fsdFieldPackager.getName(), fsdFieldPackager);
}
@Override
public byte[] pack(Map<String, String> setfields) throws ISOException {
this.setSetfields(setfields);
return pack();
}
@Override
public int unpack(byte[] inStream, int offset, Map<String, String> fields) throws ISOException {
// TODO Auto-generated method stub
Map<String, AFSDFieldPackager> f = getFields();
int innerOffset = unpack(inStream, offset);
for (Map.Entry<String, String> entry : getSetfields().entrySet()) {
fields.put(entry.getKey(), entry.getValue());
}
return innerOffset;
}
public void set(String fieldName, String value) {
IFSDFieldPackager p = getFields().get(fieldName);
getSetfields().put(fieldName, value);
if (p != null)
p.setValue(value);
}
public String get(String fieldName) {
return setfields.get(fieldName);
}
public int unpack(byte[] inStream, int offset) throws ISOException {
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
FSDField f = new FSDField();
f.setName(entry.getKey());
offset = entry.getValue().unpack(inStream, offset, getSetfields());
getSetfields().put(entry.getValue().getName(), entry.getValue().getValue());
}
return offset;
}
public int unpack(byte[] inStream) throws ISOException {
int offset = 0;
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
FSDField f = new FSDField();
f.setName(entry.getKey());
offset = entry.getValue().unpack(inStream, offset, getSetfields());
getSetfields().put(entry.getValue().getName(), entry.getValue().getValue());
}
return offset;
}
public byte[] pack() throws ISOException {
byte[] outStream = null;
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
byte[] temp = entry.getValue().pack(getSetfields());
if (temp != null) {
if (outStream == null) {
outStream = temp;
} else {
byte[] outStream2 = new byte[outStream.length + temp.length];
System.arraycopy(outStream, 0, outStream2, 0, outStream.length);
System.arraycopy(temp, 0, outStream2, outStream.length, temp.length);
outStream = outStream2;
}
}
}
return outStream;
}
public String dump(String prefix) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("%s<fsdmsgX name=\"%s\">%n", prefix, getName()));
String inner_prefix = prefix + "\t";
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
sb.append(entry.getValue().dump(inner_prefix, getSetfields()));
}
sb.append(String.format("%s</fsdmsgX>%n", prefix));
return sb.toString();
}
public String hexDump(String prefix) {
StringBuilder sb = new StringBuilder();
byte[] outStream = null;
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
Map<String, String> setFieldmap = getSetfields();
Map<String, AFSDFieldPackager> fieldPackager = getFields();
AFSDFieldPackager fPkgr = entry.getValue();
if (fPkgr instanceof FSDMsgX) {
byte[] innerOutStream = hexDump(prefix, ((FSDMsgX) fPkgr).getSetfields());
if (innerOutStream != null) {
if (outStream == null) {
outStream = innerOutStream;
} else {
byte[] outStream2 = new byte[outStream.length + innerOutStream.length];
System.arraycopy(outStream, 0, outStream2, 0, outStream.length);
System.arraycopy(innerOutStream, 0, outStream2, outStream.length, innerOutStream.length);
outStream = outStream2;
}
}
} else {
byte[] temp = entry.getValue().hexDump("", getSetfields());
if (temp != null) {
if (outStream == null) {
outStream = temp;
} else {
byte[] outStream2 = new byte[outStream.length + temp.length];
System.arraycopy(outStream, 0, outStream2, 0, outStream.length);
System.arraycopy(temp, 0, outStream2, outStream.length, temp.length);
outStream = outStream2;
}
}
}
}
sb.append(ISOUtil.hexdump(outStream));
sb.append(System.lineSeparator());
return sb.toString();
}
public Map<String, AFSDFieldPackager> getFields() {
return fieldPackagers;
}
public void setFields(Map<String, AFSDFieldPackager> fields) {
this.fieldPackagers = fields;
}
public Map<String, String> getSetfields() {
return setfields;
}
public void setSetfields(Map<String, String> setfields) {
this.setfields = setfields;
}
@Override
public byte[] hexDump(String prefix, Map<String, String> setfields) {
byte[] outStream = null;
for (Map.Entry<String, AFSDFieldPackager> entry : fieldPackagers.entrySet()) {
byte[] temp = entry.getValue().hexDump(prefix, getSetfields());
if (temp != null) {
if (outStream == null) {
outStream = temp;
} else {
byte[] outStream2 = new byte[outStream.length + temp.length];
System.arraycopy(outStream, 0, outStream2, 0, outStream.length);
System.arraycopy(temp, 0, outStream2, outStream.length, temp.length);
outStream = outStream2;
}
}
}
return outStream;
// sb.append(ISOUtil.hexdump(outStream));
}
@Override
public String getParserTree(String prefix) {
StringBuilder sb = new StringBuilder(String.format("%s[%s]%n", prefix,getName()));
for (Map.Entry<String, AFSDFieldPackager> entry : getFields().entrySet()) {
AFSDFieldPackager fPkgr = entry.getValue();
sb.append(fPkgr.getParserTree(prefix));
}
return sb.toString();
}
}