diff --git a/jpos/src/main/java/org/jpos/q2/iso/QMUX.java b/jpos/src/main/java/org/jpos/q2/iso/QMUX.java index 6cb5e0bba7..17d230d306 100644 --- a/jpos/src/main/java/org/jpos/q2/iso/QMUX.java +++ b/jpos/src/main/java/org/jpos/q2/iso/QMUX.java @@ -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); } @@ -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) { @@ -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; diff --git a/jpos/src/test/java/org/jpos/q2/iso/QMUXTest.java b/jpos/src/test/java/org/jpos/q2/iso/QMUXTest.java index 7057be2f94..3d4bb34dbd 100644 --- a/jpos/src/test/java/org/jpos/q2/iso/QMUXTest.java +++ b/jpos/src/test/java/org/jpos/q2/iso/QMUXTest.java @@ -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();