You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2016/12/02 09:44:26 UTC
[2/3] camel git commit: SmppNLSTSplitter for sending messages using
National Language Shit Table
SmppNLSTSplitter for sending messages using National Language Shit Table
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b1b67bda
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b1b67bda
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b1b67bda
Branch: refs/heads/master
Commit: b1b67bdafd58ad105668e19699b8bbd27f1ec99b
Parents: 32143e8
Author: Engin Dumlu <en...@gmail.com>
Authored: Wed Nov 30 20:00:35 2016 +0300
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Fri Dec 2 10:40:51 2016 +0100
----------------------------------------------------------------------
.../camel/component/smpp/SmppConstants.java | 2 +
.../camel/component/smpp/SmppNLSTSplitter.java | 100 +++++++++++++++++++
.../camel/component/smpp/SmppSmCommand.java | 12 ++-
.../component/smpp/SmppSubmitSmCommand.java | 7 +-
.../component/smpp/SmppNLSTSplitterTest.java | 63 ++++++++++++
5 files changed, 180 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/b1b67bda/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java
index 80c47d6..b9f3d08 100644
--- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java
+++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppConstants.java
@@ -27,6 +27,7 @@ public interface SmppConstants {
String COMMAND_ID = "CamelSmppCommandId";
String COMMAND_STATUS = "CamelSmppCommandStatus";
String DATA_CODING = "CamelSmppDataCoding";
+ String DATA_SPLITTER = "CamelSmppSplitter";
String DELIVERED = "CamelSmppDelivered";
String DEST_ADDR = "CamelSmppDestAddr";
String DEST_ADDR_NPI = "CamelSmppDestAddrNpi";
@@ -34,6 +35,7 @@ public interface SmppConstants {
String DONE_DATE = "CamelSmppDoneDate";
String ENCODING = "CamelSmppEncoding";
String ERROR = "CamelSmppError";
+ String ESM_CLASS = "CamelSmppClass";
String ESME_ADDR = "CamelSmppEsmeAddr";
String ESME_ADDR_NPI = "CamelSmppEsmeAddrNpi";
String ESME_ADDR_TON = "CamelSmppEsmeAddrTon";
http://git-wip-us.apache.org/repos/asf/camel/blob/b1b67bda/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppNLSTSplitter.java
----------------------------------------------------------------------
diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppNLSTSplitter.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppNLSTSplitter.java
new file mode 100644
index 0000000..4e0bd39
--- /dev/null
+++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppNLSTSplitter.java
@@ -0,0 +1,100 @@
+package org.apache.camel.component.smpp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by engin on 30/11/2016.
+ */
+class SmppNLSTSplitter extends SmppSplitter{
+
+ protected static final int UDHIE_NLI_SINGLE_MSG_HEADER_LENGTH = 0x03; // header length for single message
+ protected static final int UDHIE_NLI_SINGLE_MSG_HEADER_REAL_LENGTH = UDHIE_NLI_SINGLE_MSG_HEADER_LENGTH + 1;
+
+ protected static final int UDHIE_NLI_MULTI_MSG_HEADER_LENGTH = 0x08; // header length for multi message
+ protected static final int UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH = UDHIE_NLI_MULTI_MSG_HEADER_LENGTH + 1;
+
+
+ protected static final int UDHIE_SAR_REF_NUM_LENGTH = 1;
+// protected static final byte UDHIE_IDENTIFIER_SAR = 0x00;
+// protected static final byte UDHIE_SAR_LENGTH = 0x03;
+// protected static final int MAX_SEG_COUNT = 255;
+
+ protected static final int UDHIE_NLI_IDENTIFIER = 0x25;
+ protected static final int UDHIE_NLI_HEADER_LENGTH = 0x01;
+
+ public static final int MAX_MSG_CHAR_SIZE = (MAX_MSG_BYTE_LENGTH * 8 / 7) - (UDHIE_NLI_SINGLE_MSG_HEADER_REAL_LENGTH + 1); // 155 for NLST
+ public static final int MAX_SEG_BYTE_SIZE = (MAX_MSG_BYTE_LENGTH - UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH) * 8 / 7;
+
+ private byte languageIdentifier;
+ private final Logger logger = LoggerFactory.getLogger(SmppNLSTSplitter.class);
+
+ SmppNLSTSplitter(int currentLength, byte languageIdentifier) {
+ super(MAX_MSG_CHAR_SIZE, MAX_SEG_BYTE_SIZE, currentLength);
+ this.languageIdentifier = languageIdentifier;
+ }
+
+ public byte[][] split(byte[] message) {
+ if (!isSplitRequired()) {
+ byte[] nli_message = new byte[UDHIE_NLI_SINGLE_MSG_HEADER_REAL_LENGTH + message.length];
+ nli_message[0] = (byte) UDHIE_NLI_SINGLE_MSG_HEADER_LENGTH;
+ nli_message[1] = (byte) UDHIE_NLI_IDENTIFIER;
+ nli_message[2] = (byte) UDHIE_NLI_HEADER_LENGTH;
+ nli_message[3] = this.languageIdentifier;
+ System.arraycopy(message, 0, nli_message, 4, message.length);
+ return new byte[][]{nli_message};
+ }
+
+ int segmentLength = getSegmentLength();
+
+ // determine how many messages
+ int segmentNum = message.length / segmentLength;
+ int messageLength = message.length;
+ if (segmentNum > MAX_SEG_COUNT) {
+ // this is too long, can't fit, so chop
+ segmentNum = MAX_SEG_COUNT;
+ messageLength = segmentNum * segmentLength;
+ }
+ if ((messageLength % segmentLength) > 0) {
+ segmentNum++;
+ }
+
+ byte[][] segments = new byte[segmentNum][];
+
+ int lengthOfData;
+ byte refNum = getReferenceNumber();
+ for (int i = 0; i < segmentNum; i++) {
+ logger.info("segment number = {}", i);
+ if (segmentNum - i == 1) {
+ lengthOfData = messageLength - i * segmentLength;
+ } else {
+ lengthOfData = segmentLength;
+ }
+ logger.info("Length of data = {}", lengthOfData);
+
+ segments[i] = new byte[UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH + lengthOfData];
+ logger.info("segments[{}].length = {}", i, segments[i].length);
+
+ segments[i][0] = UDHIE_NLI_MULTI_MSG_HEADER_LENGTH; // doesn't include itself, is header length
+ // SAR identifier
+ segments[i][1] = UDHIE_IDENTIFIER_SAR;
+ // SAR length
+ segments[i][2] = UDHIE_SAR_LENGTH;
+ // DATAGRAM REFERENCE NUMBER
+ segments[i][3] = refNum;
+ // total number of segments
+ segments[i][4] = (byte) segmentNum;
+ // segment #
+ segments[i][5] = (byte) (i + 1);
+
+ // language stuff
+ segments[i][6] = (byte) UDHIE_NLI_IDENTIFIER;
+ segments[i][7] = (byte) UDHIE_NLI_HEADER_LENGTH;
+ segments[i][8] = this.languageIdentifier;
+
+ // now copy the data
+ System.arraycopy(message, i * segmentLength, segments[i], UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH, lengthOfData);
+ }
+ return segments;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/b1b67bda/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
----------------------------------------------------------------------
diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
index c308e4d..71b2171 100644
--- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
+++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
@@ -76,11 +76,19 @@ public abstract class SmppSmCommand extends AbstractSmppCommand {
}
protected SmppSplitter createSplitter(Message message) {
- Alphabet alphabet = determineAlphabet(message);
+ SmppSplitter splitter;
+ // use the splitter if provided via header
+ if (message.getHeaders().containsKey(SmppConstants.DATA_SPLITTER)){
+ splitter = message.getHeader(SmppConstants.DATA_SPLITTER, SmppSplitter.class);
+ if (null != splitter){
+ return splitter;
+ }
+ logger.warn("Invalid splitter given. Must be instance of SmppSplitter");
+ }
+ Alphabet alphabet = determineAlphabet(message);
String body = message.getBody(String.class);
- SmppSplitter splitter;
if (SmppUtils.is8Bit(alphabet)) {
splitter = new Smpp8BitSplitter(body.length());
} else if (alphabet == Alphabet.ALPHA_UCS2) {
http://git-wip-us.apache.org/repos/asf/camel/blob/b1b67bda/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
----------------------------------------------------------------------
diff --git a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
index 542266f..7ac8955 100644
--- a/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
+++ b/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
@@ -95,8 +95,11 @@ public class SmppSubmitSmCommand extends SmppSmCommand {
SubmitSm template = createSubmitSmTemplate(exchange);
byte[][] segments = splitBody(exchange.getIn());
- // multipart message
- if (segments.length > 1) {
+ ESMClass esmClass = exchange.getIn().getHeader(SmppConstants.ESM_CLASS, ESMClass.class);
+ if (null != esmClass) {
+ template.setEsmClass(esmClass.value());
+ // multipart message
+ }else if (segments.length > 1) {
template.setEsmClass(new ESMClass(MessageMode.DEFAULT, MessageType.DEFAULT, GSMSpecificFeature.UDHI).value());
}
http://git-wip-us.apache.org/repos/asf/camel/blob/b1b67bda/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppNLSTSplitterTest.java
----------------------------------------------------------------------
diff --git a/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppNLSTSplitterTest.java b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppNLSTSplitterTest.java
new file mode 100644
index 0000000..2dfcabc
--- /dev/null
+++ b/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppNLSTSplitterTest.java
@@ -0,0 +1,63 @@
+package org.apache.camel.component.smpp;
+
+import java.nio.charset.Charset;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by engin on 30/11/2016.
+ */
+public class SmppNLSTSplitterTest {
+
+ @Test
+ public void splitTurkishShortMessageWith155Character() {
+ String message = "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
+ + "123456789012345678901234567890123456789012345678901234567890123456789012345"; // 155 single message
+
+ byte turkishLanguageIdentifier = 0x01;
+ SmppSplitter splitter = new SmppNLSTSplitter(message.length(), turkishLanguageIdentifier);
+ SmppSplitter.resetCurrentReferenceNumber();
+ byte[][] result = splitter.split(message.getBytes());
+
+ assertEquals(1, result.length);
+ assertArrayEquals(new byte[]{SmppNLSTSplitter.UDHIE_NLI_SINGLE_MSG_HEADER_LENGTH, SmppNLSTSplitter.UDHIE_NLI_IDENTIFIER, SmppNLSTSplitter.UDHIE_NLI_HEADER_LENGTH, turkishLanguageIdentifier,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53}, result[0]);
+ }
+
+ @Test
+ public void splitShortMessageWith156Character() {
+ String message = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" + // first part 149
+ "0123456"; // second part 7
+
+ byte turkishLanguageIdentifier = 0x01;
+ SmppSplitter splitter = new SmppNLSTSplitter(message.length(), turkishLanguageIdentifier);
+ SmppSplitter.resetCurrentReferenceNumber();
+ byte[][] result = splitter.split(message.getBytes());
+
+ assertEquals(2, result.length);
+ assertArrayEquals(new byte[]{
+ SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_LENGTH, SmppNLSTSplitter.UDHIE_IDENTIFIER_SAR, SmppNLSTSplitter.UDHIE_SAR_LENGTH, 1, 2, 1,
+ SmppNLSTSplitter.UDHIE_NLI_IDENTIFIER, SmppNLSTSplitter.UDHIE_NLI_HEADER_LENGTH, turkishLanguageIdentifier,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57}, result[0]);
+
+ assertArrayEquals(new byte[]{
+ SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_LENGTH, SmppNLSTSplitter.UDHIE_IDENTIFIER_SAR, SmppNLSTSplitter.UDHIE_SAR_LENGTH, 1, 2, 2,
+ SmppNLSTSplitter.UDHIE_NLI_IDENTIFIER, SmppNLSTSplitter.UDHIE_NLI_HEADER_LENGTH, turkishLanguageIdentifier,
+ 48, 49, 50, 51, 52, 53, 54}, result[1]);
+
+ String firstShortMessage = new String(result[0], SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH, result[0].length - SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH);
+ String secondShortMessage = new String(result[1], SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH, result[1].length - SmppNLSTSplitter.UDHIE_NLI_MULTI_MSG_HEADER_REAL_LENGTH);
+ assertEquals(message, firstShortMessage + secondShortMessage);
+ }
+}
\ No newline at end of file