package org.jpos.jposext.isomsgaction.testing.service.support;
import java.util.Arrays;
import java.util.Comparator;
import org.jpos.iso.ISOBitMap;
import org.jpos.iso.ISOComponent;
import org.jpos.iso.ISOField;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISOUtil;
import org.jpos.jposext.isomsgaction.testing.model.ComparisonContext;
public class ISOComponentComparator implements Comparator<ISOComponent> {
private String path;
private ComparisonContext comparisonContext;
private String currentId;
private boolean skipBitmapComparison;
public ISOComponentComparator(ComparisonContext comparisonContext,
String path, String id) {
super();
this.comparisonContext = comparisonContext;
this.path = path;
this.currentId = id;
this.skipBitmapComparison = true;
}
public ISOComponentComparator(ComparisonContext comparisonContext,
String path, String id, boolean skipBitmapComparison) {
super();
this.comparisonContext = comparisonContext;
this.path = path;
this.currentId = id;
this.skipBitmapComparison = skipBitmapComparison;
}
/*
* (non-Javadoc)
*
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(ISOComponent cmp0, ISOComponent cmp1) {
boolean oneAtLeastIsNull = false;
String currentPath = String.format("%s%s%s", path,
("".equals(path) ? "" : "."), currentId);
if (comparisonContext.isManualCheck(currentPath)) {
return 0;
}
if (null != cmp0) {
if (null == cmp1) {
comparisonContext
.addDiff(currentPath, String.format(
"Field %s : Expected=[SET], Current=NULL",
currentPath));
oneAtLeastIsNull = true;
}
} else {
if (null == cmp1) {
} else {
comparisonContext
.addDiff(currentPath, String.format(
"Field %s : Expected=NULL, Current=[SET]",
currentPath));
oneAtLeastIsNull = true;
}
}
if (!oneAtLeastIsNull) {
if (cmp0.getClass() != cmp1.getClass()) {
comparisonContext
.addDiff(
currentPath,
String.format(
"Field %s : Expected data type=%s, Current data type=%s",
currentPath, cmp0.getClass(),
cmp1.getClass()));
return -1;
}
}
if (cmp0 instanceof ISOMsg) {
ISOMsgComparator comparator = new ISOMsgComparator(
comparisonContext, currentPath, skipBitmapComparison);
return comparator.compare((ISOMsg) cmp0, (ISOMsg) cmp1);
} else if (cmp0 instanceof ISOField) {
ISOFieldComparator comparator = new ISOFieldComparator(
comparisonContext, currentPath);
return comparator.compare((ISOField) cmp0, (ISOField) cmp1);
} else if (cmp0 instanceof ISOBitMap) {
if (!skipBitmapComparison) {
ISOBitMapComparator comparator = new ISOBitMapComparator(
comparisonContext, currentPath);
return comparator.compare((ISOBitMap) cmp0, (ISOBitMap) cmp1);
} else {
return 0;
}
} else {
if (null == cmp1) {
return -1;
} else {
try {
boolean same = Arrays.equals(cmp0.getBytes(),
cmp1.getBytes());
if (!same) {
comparisonContext
.addDiff(
currentPath,
String.format(
"Field %s : Expected(HEXA)=%s, Current(HEXA)=%s",
currentPath, ISOUtil
.hexString(cmp0
.getBytes()),
ISOUtil.hexString(cmp1
.getBytes())));
}
return same ? 0 : -1;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
public boolean isSkipBitmapComparison() {
return skipBitmapComparison;
}
public void setSkipBitmapComparison(boolean skipBitmapComparison) {
this.skipBitmapComparison = skipBitmapComparison;
}
}