Updated Branches: refs/heads/camel-2.11.x ecd725de1 -> f4b48fcf6
CAMEL-6655: SMPP - add support of Vendor Specific Optional Parameter Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f4b48fcf Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f4b48fcf Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f4b48fcf Branch: refs/heads/camel-2.11.x Commit: f4b48fcf6becd70337d5b07305cddf531b6d4600 Parents: ecd725d Author: cmueller <cmuel...@apache.org> Authored: Sat Aug 24 23:23:52 2013 +0200 Committer: cmueller <cmuel...@apache.org> Committed: Sat Aug 24 23:24:49 2013 +0200 ---------------------------------------------------------------------- .../component/smpp/AbstractSmppCommand.java | 52 ++++++++++++++- .../component/smpp/SmppDataSmCommandTest.java | 66 ++++++++++++++++++++ .../smpp/SmppSubmitMultiCommandTest.java | 64 +++++++++++++++++++ .../component/smpp/SmppSubmitSmCommandTest.java | 63 +++++++++++++++++++ 4 files changed, 244 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/f4b48fcf/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/AbstractSmppCommand.java ---------------------------------------------------------------------- diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/AbstractSmppCommand.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/AbstractSmppCommand.java index 54d93da..145ce46 100644 --- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/AbstractSmppCommand.java +++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/AbstractSmppCommand.java @@ -55,8 +55,58 @@ public abstract class AbstractSmppCommand implements SmppCommand { return message; } + @SuppressWarnings({ "unchecked", "rawtypes" }) + protected List<OptionalParameter> createOptionalParameters(Map optinalParamaters) { + if (optinalParamaters == null || optinalParamaters.isEmpty()) { + return new ArrayList<OptionalParameter>(); + } + + Object firstKey = optinalParamaters.keySet().iterator().next(); + if (firstKey instanceof String) { + return createOptionalParametersByName(optinalParamaters); + } else { + return createOptionalParametersByCode(optinalParamaters); + } + } + + protected List<OptionalParameter> createOptionalParametersByCode(Map<Short, Object> optinalParamaters) { + List<OptionalParameter> optParams = new ArrayList<OptionalParameter>(); + + for (Entry<Short, Object> entry : optinalParamaters.entrySet()) { + OptionalParameter optParam = null; + Short key = entry.getKey(); + Object value = entry.getValue(); + + try { + if (value == null) { + optParam = new OptionalParameter.Null(key); + } else if (value instanceof byte[]) { + optParam = new OptionalParameter.OctetString(key, (byte[]) value); + } else if (value instanceof String) { + optParam = new OptionalParameter.COctetString(key, (String) value); + } else if (value instanceof Byte) { + optParam = new OptionalParameter.Byte(key, (Byte) value); + } else if (value instanceof Integer) { + optParam = new OptionalParameter.Int(key, (Integer) value); + } else if (value instanceof Short) { + optParam = new OptionalParameter.Short(key, (Short) value); + } else { + log.info("Couldn't determine optional parameter for value {} (type: {}). Skip this one.", value, value.getClass()); + continue; + } + + optParams.add(optParam); + } catch (Exception e) { + log.info("Couldn't determine optional parameter for key {} and value {}. Skip this one.", key, value); + } + } + + return optParams; + } + @SuppressWarnings("rawtypes") - protected List<OptionalParameter> createOptionalParameters(Map<String, String> optinalParamaters) { + @Deprecated + protected List<OptionalParameter> createOptionalParametersByName(Map<String, String> optinalParamaters) { List<OptionalParameter> optParams = new ArrayList<OptionalParameter>(); for (Entry<String, String> entry : optinalParamaters.entrySet()) { http://git-wip-us.apache.org/repos/asf/camel/blob/f4b48fcf/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppDataSmCommandTest.java ---------------------------------------------------------------------- diff --git a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppDataSmCommandTest.java b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppDataSmCommandTest.java index 28714ec..5374753 100644 --- a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppDataSmCommandTest.java +++ b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppDataSmCommandTest.java @@ -136,6 +136,13 @@ public class SmppDataSmCommandTest { optionalParameters.put("DEST_TELEMATICS_ID", "2"); optionalParameters.put("QOS_TIME_TO_LIVE", "3600000"); optionalParameters.put("ALERT_ON_MESSAGE_DELIVERY", null); + // fall back test for vendor specific optional parameter + optionalParameters.put("0x2150", "0815"); + optionalParameters.put("0x2151", "0816"); + optionalParameters.put("0x2152", "6"); + optionalParameters.put("0x2153", "9"); + optionalParameters.put("0x2154", "7400000"); + optionalParameters.put("0x2155", null); exchange.getIn().setHeader(SmppConstants.OPTIONAL_PARAMETERS, optionalParameters); expect(session.dataShortMessage(eq("CMT"), eq(TypeOfNumber.UNKNOWN), eq(NumberingPlanIndicator.UNKNOWN), eq("1616"), eq(TypeOfNumber.UNKNOWN), eq(NumberingPlanIndicator.UNKNOWN), eq("1717"), eq(new ESMClass()), @@ -168,4 +175,63 @@ public class SmppDataSmCommandTest { assertEquals("3600000", optParamMap.get("QOS_TIME_TO_LIVE")); assertNull(optParamMap.get("ALERT_ON_MESSAGE_DELIVERY")); } + + @SuppressWarnings("unchecked") + @Test + public void executeWithOptionalParameterNewStyle() throws Exception { + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "DataSm"); + Map<Short, Object> optionalParameters = new LinkedHashMap<Short, Object>(); + // standard optional parameter + optionalParameters.put(Short.valueOf((short) 0x0202), "1292".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x001D), "urgent"); + optionalParameters.put(Short.valueOf((short) 0x0005), Byte.valueOf("4")); + optionalParameters.put(Short.valueOf((short) 0x0008), Short.valueOf((short) 2)); + optionalParameters.put(Short.valueOf((short) 0x0017), Integer.valueOf(3600000)); + optionalParameters.put(Short.valueOf((short) 0x130C), null); + // vendor specific optional parameter + optionalParameters.put(Short.valueOf((short) 0x2150), "0815".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x2151), "0816"); + optionalParameters.put(Short.valueOf((short) 0x2152), Byte.valueOf("6")); + optionalParameters.put(Short.valueOf((short) 0x2153), Short.valueOf((short) 9)); + optionalParameters.put(Short.valueOf((short) 0x2154), Integer.valueOf(7400000)); + optionalParameters.put(Short.valueOf((short) 0x2155), null); + exchange.getIn().setHeader(SmppConstants.OPTIONAL_PARAMETERS, optionalParameters); + expect(session.dataShortMessage(eq("CMT"), eq(TypeOfNumber.UNKNOWN), eq(NumberingPlanIndicator.UNKNOWN), eq("1616"), + eq(TypeOfNumber.UNKNOWN), eq(NumberingPlanIndicator.UNKNOWN), eq("1717"), eq(new ESMClass()), + eq(new RegisteredDelivery((byte) 1)), eq(DataCoding.newInstance((byte) 0)), + eq(new OptionalParameter.OctetString(Tag.SOURCE_SUBADDRESS, "1292")), + eq(new OptionalParameter.COctetString(Tag.ADDITIONAL_STATUS_INFO_TEXT.code(), "urgent")), + eq(new OptionalParameter.Byte(Tag.DEST_ADDR_SUBUNIT, (byte) 4)), + eq(new OptionalParameter.Short(Tag.DEST_TELEMATICS_ID.code(), (short) 2)), + eq(new OptionalParameter.Int(Tag.QOS_TIME_TO_LIVE, 3600000)), + eq(new OptionalParameter.Null(Tag.ALERT_ON_MESSAGE_DELIVERY)), + eq(new OptionalParameter.OctetString((short) 0x2150, "1292", "UTF-8")), + eq(new OptionalParameter.COctetString((short) 0x2151, "0816")), + eq(new OptionalParameter.Byte((short) 0x2152, (byte) 6)), + eq(new OptionalParameter.Short((short) 0x2153, (short) 9)), + eq(new OptionalParameter.Int((short) 0x2154, 7400000)), + eq(new OptionalParameter.Null((short) 0x2155)))) + .andReturn(new DataSmResult(new MessageId("1"), new OptionalParameter[]{ + new OptionalParameter.OctetString(Tag.SOURCE_SUBADDRESS, "1292"), new OptionalParameter.COctetString(Tag.ADDITIONAL_STATUS_INFO_TEXT.code(), "urgent"), + new OptionalParameter.Byte(Tag.DEST_ADDR_SUBUNIT, (byte) 4), new OptionalParameter.Short(Tag.DEST_TELEMATICS_ID.code(), (short) 2), + new OptionalParameter.Int(Tag.QOS_TIME_TO_LIVE, 3600000), new OptionalParameter.Null(Tag.ALERT_ON_MESSAGE_DELIVERY)})); + + replay(session); + + command.execute(exchange); + + verify(session); + + assertEquals("1", exchange.getOut().getHeader(SmppConstants.ID)); + Map<String, String> optParamMap = exchange.getOut().getHeader(SmppConstants.OPTIONAL_PARAMETERS, Map.class); + assertEquals(6, optParamMap.size()); + assertEquals("1292", optParamMap.get("SOURCE_SUBADDRESS")); + // FIXME: fix required in JSMPP. See http://code.google.com/p/jsmpp/issues/detail?id=140 + //assertEquals("urgent", optParamMap.get("ADDITIONAL_STATUS_INFO_TEXT")); + assertEquals("4", optParamMap.get("DEST_ADDR_SUBUNIT")); + assertEquals("2", optParamMap.get("DEST_TELEMATICS_ID")); + assertEquals("3600000", optParamMap.get("QOS_TIME_TO_LIVE")); + assertNull(optParamMap.get("ALERT_ON_MESSAGE_DELIVERY")); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/f4b48fcf/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java ---------------------------------------------------------------------- diff --git a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java index 01e24de..3434d40 100644 --- a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java +++ b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java @@ -473,4 +473,68 @@ public class SmppSubmitMultiCommandTest { assertEquals(1, exchange.getOut().getHeader(SmppConstants.SENT_MESSAGE_COUNT)); assertNull(exchange.getOut().getHeader(SmppConstants.ERROR)); } + + @Test + public void executeWithOptionalParameterNewStyle() throws Exception { + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti"); + exchange.getIn().setHeader(SmppConstants.ID, "1"); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR_TON, TypeOfNumber.NATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR_NPI, NumberingPlanIndicator.NATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR, "1818"); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR_TON, TypeOfNumber.INTERNATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR_NPI, NumberingPlanIndicator.INTERNET.value()); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR, Arrays.asList("1919")); + exchange.getIn().setHeader(SmppConstants.SCHEDULE_DELIVERY_TIME, new Date(1111111)); + exchange.getIn().setHeader(SmppConstants.VALIDITY_PERIOD, new Date(2222222)); + exchange.getIn().setHeader(SmppConstants.PROTOCOL_ID, (byte) 1); + exchange.getIn().setHeader(SmppConstants.PRIORITY_FLAG, (byte) 2); + exchange.getIn().setHeader(SmppConstants.REGISTERED_DELIVERY, new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS).value()); + exchange.getIn().setHeader(SmppConstants.REPLACE_IF_PRESENT_FLAG, ReplaceIfPresentFlag.REPLACE.value()); + Map<Short, Object> optionalParameters = new LinkedHashMap<Short, Object>(); + // standard optional parameter + optionalParameters.put(Short.valueOf((short) 0x0202), "1292".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x001D), "urgent"); + optionalParameters.put(Short.valueOf((short) 0x0005), Byte.valueOf("4")); + optionalParameters.put(Short.valueOf((short) 0x0008), Short.valueOf((short) 2)); + optionalParameters.put(Short.valueOf((short) 0x0017), Integer.valueOf(3600000)); + optionalParameters.put(Short.valueOf((short) 0x130C), null); + // vendor specific optional parameter + optionalParameters.put(Short.valueOf((short) 0x2150), "0815".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x2151), "0816"); + optionalParameters.put(Short.valueOf((short) 0x2152), Byte.valueOf("6")); + optionalParameters.put(Short.valueOf((short) 0x2153), Short.valueOf((short) 9)); + optionalParameters.put(Short.valueOf((short) 0x2154), Integer.valueOf(7400000)); + optionalParameters.put(Short.valueOf((short) 0x2155), null); + exchange.getIn().setHeader(SmppConstants.OPTIONAL_PARAMETERS, optionalParameters); + exchange.getIn().setBody("short message body"); + expect(session.submitMultiple(eq("CMT"), eq(TypeOfNumber.NATIONAL), eq(NumberingPlanIndicator.NATIONAL), eq("1818"), + aryEq(new Address[]{new Address(TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.INTERNET, "1919")}), + eq(new ESMClass()), eq((byte) 1), eq((byte) 2), eq("-300101001831100-"), eq("-300101003702200-"), eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS)), + eq(ReplaceIfPresentFlag.REPLACE), eq(DataCoding.newInstance((byte) 0)), eq((byte) 0), aryEq("short message body".getBytes()), + aryEq(new OptionalParameter[]{ + new OptionalParameter.OctetString(Tag.SOURCE_SUBADDRESS, "1292"), + new OptionalParameter.COctetString(Tag.ADDITIONAL_STATUS_INFO_TEXT.code(), "urgent"), + new OptionalParameter.Byte(Tag.DEST_ADDR_SUBUNIT, (byte) 4), + new OptionalParameter.Short(Tag.DEST_TELEMATICS_ID.code(), (short) 2), + new OptionalParameter.Int(Tag.QOS_TIME_TO_LIVE, 3600000), + new OptionalParameter.Null(Tag.ALERT_ON_MESSAGE_DELIVERY), + new OptionalParameter.OctetString((short) 0x2150, "1292", "UTF-8"), + new OptionalParameter.COctetString((short) 0x2151, "0816"), + new OptionalParameter.Byte((short) 0x2152, (byte) 6), + new OptionalParameter.Short((short) 0x2153, (short) 9), + new OptionalParameter.Int((short) 0x2154, 7400000), + new OptionalParameter.Null((short) 0x2155)}))) + .andReturn(new SubmitMultiResult("1")); + + replay(session); + + command.execute(exchange); + + verify(session); + + assertEquals(Arrays.asList("1"), exchange.getOut().getHeader(SmppConstants.ID)); + assertEquals(1, exchange.getOut().getHeader(SmppConstants.SENT_MESSAGE_COUNT)); + assertNull(exchange.getOut().getHeader(SmppConstants.ERROR)); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/f4b48fcf/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java ---------------------------------------------------------------------- diff --git a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java index e13d0c04..9f32a95 100644 --- a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java +++ b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java @@ -221,6 +221,69 @@ public class SmppSubmitSmCommandTest { } @Test + public void executeWithOptionalParameterNewStyle() throws Exception { + Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); + exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm"); + exchange.getIn().setHeader(SmppConstants.ID, "1"); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR_TON, TypeOfNumber.NATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR_NPI, NumberingPlanIndicator.NATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.SOURCE_ADDR, "1818"); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR_TON, TypeOfNumber.INTERNATIONAL.value()); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR_NPI, NumberingPlanIndicator.INTERNET.value()); + exchange.getIn().setHeader(SmppConstants.DEST_ADDR, "1919"); + exchange.getIn().setHeader(SmppConstants.SCHEDULE_DELIVERY_TIME, new Date(1111111)); + exchange.getIn().setHeader(SmppConstants.VALIDITY_PERIOD, new Date(2222222)); + exchange.getIn().setHeader(SmppConstants.PROTOCOL_ID, (byte) 1); + exchange.getIn().setHeader(SmppConstants.PRIORITY_FLAG, (byte) 2); + exchange.getIn().setHeader(SmppConstants.REGISTERED_DELIVERY, new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS).value()); + exchange.getIn().setHeader(SmppConstants.REPLACE_IF_PRESENT_FLAG, ReplaceIfPresentFlag.REPLACE.value()); + exchange.getIn().setBody("short message body"); + Map<Short, Object> optionalParameters = new LinkedHashMap<Short, Object>(); + // standard optional parameter + optionalParameters.put(Short.valueOf((short) 0x0202), "1292".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x001D), "urgent"); + optionalParameters.put(Short.valueOf((short) 0x0005), Byte.valueOf("4")); + optionalParameters.put(Short.valueOf((short) 0x0008), Short.valueOf((short) 2)); + optionalParameters.put(Short.valueOf((short) 0x0017), Integer.valueOf(3600000)); + optionalParameters.put(Short.valueOf((short) 0x130C), null); + // vendor specific optional parameter + optionalParameters.put(Short.valueOf((short) 0x2150), "0815".getBytes("UTF-8")); + optionalParameters.put(Short.valueOf((short) 0x2151), "0816"); + optionalParameters.put(Short.valueOf((short) 0x2152), Byte.valueOf("6")); + optionalParameters.put(Short.valueOf((short) 0x2153), Short.valueOf((short) 9)); + optionalParameters.put(Short.valueOf((short) 0x2154), Integer.valueOf(7400000)); + optionalParameters.put(Short.valueOf((short) 0x2155), null); + exchange.getIn().setHeader(SmppConstants.OPTIONAL_PARAMETERS, optionalParameters); + expect(session.submitShortMessage(eq("CMT"), eq(TypeOfNumber.NATIONAL), eq(NumberingPlanIndicator.NATIONAL), eq("1818"), + eq(TypeOfNumber.INTERNATIONAL), eq(NumberingPlanIndicator.INTERNET), eq("1919"), + eq(new ESMClass()), eq((byte) 1), eq((byte) 2), eq("-300101001831100-"), eq("-300101003702200-"), eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS)), + eq(ReplaceIfPresentFlag.REPLACE.value()), eq(DataCoding.newInstance((byte) 0)), eq((byte) 0), + aryEq("short message body".getBytes()), + eq(new OptionalParameter.OctetString(Tag.SOURCE_SUBADDRESS, "1292")), + eq(new OptionalParameter.COctetString(Tag.ADDITIONAL_STATUS_INFO_TEXT.code(), "urgent")), + eq(new OptionalParameter.Byte(Tag.DEST_ADDR_SUBUNIT, (byte) 4)), + eq(new OptionalParameter.Short(Tag.DEST_TELEMATICS_ID.code(), (short) 2)), + eq(new OptionalParameter.Int(Tag.QOS_TIME_TO_LIVE, 3600000)), + eq(new OptionalParameter.Null(Tag.ALERT_ON_MESSAGE_DELIVERY)), + eq(new OptionalParameter.OctetString((short) 0x2150, "1292", "UTF-8")), + eq(new OptionalParameter.COctetString((short) 0x2151, "0816")), + eq(new OptionalParameter.Byte((short) 0x2152, (byte) 6)), + eq(new OptionalParameter.Short((short) 0x2153, (short) 9)), + eq(new OptionalParameter.Int((short) 0x2154, 7400000)), + eq(new OptionalParameter.Null((short) 0x2155)))) + .andReturn("1"); + + replay(session); + + command.execute(exchange); + + verify(session); + + assertEquals(Arrays.asList("1"), exchange.getOut().getHeader(SmppConstants.ID)); + assertEquals(1, exchange.getOut().getHeader(SmppConstants.SENT_MESSAGE_COUNT)); + } + + @Test public void executeWithValidityPeriodAsString() throws Exception { Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut); exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");