Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions jpos/src/main/java/org/jpos/q2/iso/QMUX.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@ public void initService () throws ConfigurationException {
for (Element keyElement : e.getChildren("key")) {
String mtiOverride = QFactory.getAttributeValue(keyElement, "mti");
if (mtiOverride != null && mtiOverride.length() >= 2) {
mtiKey.put (mtiOverride.substring(0,2), toStringArray(keyElement.getTextTrim(), ", ", null));
String pcode = sanitizePcode(QFactory.getAttributeValue(keyElement, "pcode"));
String mapKey = buildMtiKey(mtiOverride.substring(0,2), pcode);
mtiKey.put (mapKey, toStringArray(keyElement.getTextTrim(), ", ", null));
} else {
key = toStringArray(e.getChildTextTrim("key"), ", ", DEFAULT_KEY);
}
Expand Down Expand Up @@ -276,7 +278,16 @@ public String getKey (ISOMsg m) throws ISOException {
sb.append ('.');
}
boolean hasFields = false;
String[] k = mtiKey.getOrDefault(m.getMTI().substring(0,2), key);
String mti = m.getMTI();
String mtiPrefix = mti.substring(0,2);
String[] k = null;
String pcode = m.hasField(3) ? sanitizePcode(m.getString(3)) : null;
if (pcode != null) {
k = mtiKey.get(buildMtiKey(mtiPrefix, pcode));
}
if (k == null) {
k = mtiKey.getOrDefault(mtiPrefix, key);
}
for (String f : k) {
String v = m.getString(f);
if (v != null) {
Expand All @@ -298,6 +309,17 @@ public String getKey (ISOMsg m) throws ISOException {
return sb.toString();
}

private String sanitizePcode(String pcode) {
if (pcode == null)
return null;
String trimmed = pcode.trim();
return trimmed.isEmpty() ? null : trimmed;
}

private String buildMtiKey(String mtiPrefix, String pcode) {
return pcode == null ? mtiPrefix : mtiPrefix + ':' + pcode;
}

@Override
public Metrics getMetrics() {
return metrics;
Expand Down
84 changes: 84 additions & 0 deletions jpos/src/test/java/org/jpos/q2/iso/QMUXTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,90 @@ public void testRequestThrowsNullPointerException() throws Throwable {
}
}

@Test
public void testGetKeyResolvesPcodeSpecificMapping() throws Exception {
QMUX qmux = createPcodeAwareQMUX("qmux-pcode-1");
try {
ISOMsg msg = new ISOMsg("0200");
msg.set(3, "381000");
msg.set(7, "0102030405");
msg.set(11, "123");

String key = qmux.getKey(msg);
assertEquals("test.out.0200102030405000123", key);
} finally {
qmux.destroyService();
}
}

@Test
public void testGetKeyResolvesDifferentPcodeMapping() throws Exception {
QMUX qmux = createPcodeAwareQMUX("qmux-pcode-2");
try {
ISOMsg msg = new ISOMsg("0200");
msg.set(3, "261000");
msg.set(7, "0102030405");
msg.set(11, "123");
msg.set(41, "TERM01");

String key = qmux.getKey(msg);
assertEquals("test.out.020010203040500012300000000000TERM01", key);
} finally {
qmux.destroyService();
}
}

@Test
public void testGetKeyFallbacksToMtiWhenPcodeNotPresent() throws Exception {
QMUX qmux = createPcodeAwareQMUX("qmux-pcode-3");
try {
ISOMsg msg = new ISOMsg("0200");
msg.set(3, "999999");
msg.set(7, "2001010101");
msg.set(11, "456");

String key = qmux.getKey(msg);
assertEquals("test.out.0202001010101000456", key);
} finally {
qmux.destroyService();
}
}

private QMUX createPcodeAwareQMUX(String name) throws Exception {
QMUX qmux = new QMUX();
qmux.setConfiguration(new SimpleConfiguration());
qmux.setPersist(createPcodePersist());
qmux.setName(name);
qmux.initService();
return qmux;
}

private Element createPcodePersist() {
Element persist = new Element("qmux");
persist.addContent(new Element("space").setText("testspace"));
persist.addContent(new Element("in").setText("test.in"));
persist.addContent(new Element("out").setText("test.out"));

Element mtiOnlyKey = new Element("key");
mtiOnlyKey.setAttribute("mti", "0200");
mtiOnlyKey.setText("7 11");
persist.addContent(mtiOnlyKey);

Element pcode381000 = new Element("key");
pcode381000.setAttribute("mti", "0200");
pcode381000.setAttribute("pcode", "381000");
pcode381000.setText("7 11");
persist.addContent(pcode381000);

Element pcode261000 = new Element("key");
pcode261000.setAttribute("mti", "0200");
pcode261000.setAttribute("pcode", "261000");
pcode261000.setText("7 11 41");
persist.addContent(pcode261000);

return persist;
}

@Test
public void testSetInQueueThrowsNullPointerException() throws Throwable {
QMUX qMUX = new QMUX();
Expand Down