You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by cm...@apache.org on 2012/11/05 13:54:50 UTC

svn commit: r1405775 - in /camel/trunk/components/camel-smpp/src: main/java/org/apache/camel/component/smpp/ test/java/org/apache/camel/component/smpp/

Author: cmueller
Date: Mon Nov  5 12:54:49 2012
New Revision: 1405775

URL: http://svn.apache.org/viewvc?rev=1405775&view=rev
Log:
CAMEL-5718: Bodies of SMs with 8-bit data_coding are mangled
Thanks to Francois Kritzinger for the patch

Modified:
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java
    camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
    camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java
    camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java
    camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java
    camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java
    camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppBinding.java Mon Nov  5 12:54:49 2012
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.apache.camel.Exchange;
 import org.jsmpp.bean.AlertNotification;
+import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.Command;
 import org.jsmpp.bean.DataSm;
 import org.jsmpp.bean.DeliverSm;
@@ -104,8 +105,12 @@ public class SmppBinding {
         } else {
             smppMessage.setHeader(SmppConstants.MESSAGE_TYPE, SmppMessageType.DeliverSm.toString());
             if (deliverSm.getShortMessage() != null) {
-                smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
-                        configuration.getEncoding())));
+                if (SmppUtils.parseAlphabetFromDataCoding(deliverSm.getDataCoding()) == Alphabet.ALPHA_8_BIT) {
+                    smppMessage.setBody(new String(deliverSm.getShortMessage()));
+                } else {
+                    smppMessage.setBody(String.valueOf(new String(deliverSm.getShortMessage(),
+                                                                  configuration.getEncoding())));
+                }
             } else if (deliverSm.getOptionalParametes() != null && deliverSm.getOptionalParametes().length > 0) {
                 List<OptionalParameter> oplist = Arrays.asList(deliverSm.getOptionalParametes());
 

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppMessage.java Mon Nov  5 12:54:49 2012
@@ -21,6 +21,7 @@ import java.nio.charset.Charset;
 
 import org.apache.camel.impl.DefaultMessage;
 import org.jsmpp.bean.AlertNotification;
+import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.Command;
 import org.jsmpp.bean.DataSm;
 import org.jsmpp.bean.DeliverSm;
@@ -77,11 +78,13 @@ public class SmppMessage extends Default
     @Override
     protected Object createBody() {
         if (command instanceof MessageRequest) {
-            byte[] shortMessage = ((MessageRequest) command).getShortMessage();
+            MessageRequest msgRequest = (MessageRequest)command;
+            byte[] shortMessage = msgRequest.getShortMessage();
             if (shortMessage == null || shortMessage.length == 0) {
                 return null;
             }
-            if (Charset.isSupported(configuration.getEncoding())) {
+            if (SmppUtils.parseAlphabetFromDataCoding(msgRequest.getDataCoding()) != Alphabet.ALPHA_8_BIT
+                && Charset.isSupported(configuration.getEncoding())) {
                 try {
                     return new String(shortMessage, configuration.getEncoding());
                 } catch (UnsupportedEncodingException e) {

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppReplaceSmCommand.java Mon Nov  5 12:54:49 2012
@@ -21,7 +21,6 @@ import java.util.Date;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
-import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.NumberingPlanIndicator;
 import org.jsmpp.bean.RegisteredDelivery;
 import org.jsmpp.bean.ReplaceSm;
@@ -36,16 +35,7 @@ public class SmppReplaceSmCommand extend
 
     @Override
     public void execute(Exchange exchange) throws SmppException {
-        String body = exchange.getIn().getBody(String.class);
-
-        byte providedAlphabet = getProvidedAlphabet(exchange);
-        Alphabet determinedAlphabet = determineAlphabet(exchange);
-        Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value());
-
-        byte[] message = null;
-        if (body != null) {
-            message = body.getBytes(charset);
-        }
+        byte[] message = getShortMessage(exchange.getIn());
 
         ReplaceSm replaceSm = createReplaceSmTempate(exchange);
         replaceSm.setShortMessage(message);

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSmCommand.java Mon Nov  5 12:54:49 2012
@@ -18,7 +18,6 @@ package org.apache.camel.component.smpp;
 
 import java.nio.charset.Charset;
 
-import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.jsmpp.bean.Alphabet;
 import org.jsmpp.session.SMPPSession;
@@ -32,18 +31,60 @@ public abstract class SmppSmCommand exte
         this.charset = Charset.forName(config.getEncoding());
     }
 
-    protected byte getProvidedAlphabet(Exchange exchange) {
-        Message in = exchange.getIn();
+    protected SmppSplitter createSplitter(Message message) {
+        Alphabet alphabet = determineAlphabet(message);
 
+        String body = message.getBody(String.class);
+
+        SmppSplitter splitter;
+        switch (alphabet) {
+        case ALPHA_8_BIT:
+            splitter = new Smpp8BitSplitter(body.length());
+            break;
+        case ALPHA_UCS2:
+            splitter = new SmppUcs2Splitter(body.length());
+            break;
+        case ALPHA_DEFAULT:
+        default:
+            splitter = new SmppDefaultSplitter(body.length());
+            break;
+        }
+
+        return splitter;
+    }
+
+    protected final byte[] getShortMessage(Message message) {
+        if (has8bitDataCoding(message)) {
+            return message.getBody(byte[].class);
+        } else {
+            byte providedAlphabet = getProvidedAlphabet(message);
+            Alphabet determinedAlphabet = determineAlphabet(message);
+            Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value());
+            String body = message.getBody(String.class);
+            return body.getBytes(charset);
+        }
+    }
+
+    private static boolean has8bitDataCoding(Message message) {
+        Byte dcs = message.getHeader(SmppConstants.DATA_CODING, Byte.class);
+        if (dcs != null) {
+            return SmppUtils.parseAlphabetFromDataCoding(dcs.byteValue()) == Alphabet.ALPHA_8_BIT;
+        } else {
+            Byte alphabet = message.getHeader(SmppConstants.ALPHABET, Byte.class);
+            return alphabet != null && alphabet.equals(Alphabet.ALPHA_8_BIT.value());
+        }
+    }
+
+    private byte getProvidedAlphabet(Message message) {
         byte alphabet = config.getAlphabet();
-        if (in.getHeaders().containsKey(SmppConstants.ALPHABET)) {
-            alphabet = in.getHeader(SmppConstants.ALPHABET, Byte.class);
+        if (message.getHeaders().containsKey(SmppConstants.ALPHABET)) {
+            alphabet = message.getHeader(SmppConstants.ALPHABET, Byte.class);
         }
 
         return alphabet;
     }
 
-    protected Charset determineCharset(byte providedAlphabet, byte determinedAlphabet) {
+    private Charset determineCharset(byte providedAlphabet, byte determinedAlphabet) {
         if (providedAlphabet == SmppConstants.UNKNOWN_ALPHABET && determinedAlphabet == Alphabet.ALPHA_UCS2.value()) {
             return Charset.forName(SmppConstants.UCS2_ENCODING); // change charset to use multilang messages
         }
@@ -51,14 +92,14 @@ public abstract class SmppSmCommand exte
         return charset;
     }
 
-    protected Alphabet determineAlphabet(Exchange exchange) {
-        String body = exchange.getIn().getBody(String.class);
-        byte alphabet = getProvidedAlphabet(exchange);
+    private Alphabet determineAlphabet(Message message) {
+        String body = message.getBody(String.class);
+        byte alphabet = getProvidedAlphabet(message);
 
         Alphabet alphabetObj;
         if (alphabet == SmppConstants.UNKNOWN_ALPHABET) {
-            byte[] message = body.getBytes(charset);
-            if (SmppUtils.isGsm0338Encodeable(message)) {
+            byte[] messageBytes = body.getBytes(charset);
+            if (SmppUtils.isGsm0338Encodeable(messageBytes)) {
                 alphabetObj = Alphabet.ALPHA_DEFAULT;
             } else {
                 alphabetObj = Alphabet.ALPHA_UCS2;
@@ -69,27 +110,4 @@ public abstract class SmppSmCommand exte
 
         return alphabetObj;
     }
-
-    protected SmppSplitter createSplitter(Exchange exchange) {
-        Alphabet alphabet = determineAlphabet(exchange);
-
-        Message in = exchange.getIn();
-        String body = in.getBody(String.class);
-
-        SmppSplitter splitter;
-        switch (alphabet) {
-        case ALPHA_8_BIT:
-            splitter = new Smpp8BitSplitter(body.length());
-            break;
-        case ALPHA_UCS2:
-            splitter = new SmppUcs2Splitter(body.length());
-            break;
-        case ALPHA_DEFAULT:
-        default:
-            splitter = new SmppDefaultSplitter(body.length());
-            break;
-        }
-
-        return splitter;
-    }
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitMultiCommand.java Mon Nov  5 12:54:49 2012
@@ -27,7 +27,6 @@ import java.util.Map;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.jsmpp.bean.Address;
-import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.DataCoding;
 import org.jsmpp.bean.ESMClass;
 import org.jsmpp.bean.GSMSpecificFeature;
@@ -122,14 +121,8 @@ public class SmppSubmitMultiCommand exte
     }
 
     protected SubmitMulti[] createSubmitMulti(Exchange exchange) {
-        String body = exchange.getIn().getBody(String.class);
-
-        byte providedAlphabet = getProvidedAlphabet(exchange);
-        Alphabet determinedAlphabet = determineAlphabet(exchange);
-        SmppSplitter splitter = createSplitter(exchange);
-        Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value());
-
-        byte[][] segments = splitter.split(body.getBytes(charset));
+        SmppSplitter splitter = createSplitter(exchange.getIn());
+        byte[][] segments = splitter.split(getShortMessage(exchange.getIn()));
 
         ESMClass esmClass;
         // multipart message

Modified: camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java (original)
+++ camel/trunk/components/camel-smpp/src/main/java/org/apache/camel/component/smpp/SmppSubmitSmCommand.java Mon Nov  5 12:54:49 2012
@@ -23,7 +23,6 @@ import java.util.List;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
-import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.DataCoding;
 import org.jsmpp.bean.ESMClass;
 import org.jsmpp.bean.GSMSpecificFeature;
@@ -91,15 +90,10 @@ public class SmppSubmitSmCommand extends
     }
 
     protected SubmitSm[] createSubmitSm(Exchange exchange) {
-        String body = exchange.getIn().getBody(String.class);
+        byte[] shortMessage = getShortMessage(exchange.getIn());
 
-        byte providedAlphabet = getProvidedAlphabet(exchange);
-        Alphabet determinedAlphabet = determineAlphabet(exchange);
-        Charset charset = determineCharset(providedAlphabet, determinedAlphabet.value());
-        byte[] shortMessage = body.getBytes(charset);
-        
         SubmitSm template = createSubmitSmTemplate(exchange);
-        SmppSplitter splitter = createSplitter(exchange);
+        SmppSplitter splitter = createSplitter(exchange.getIn());
         byte[][] segments = splitter.split(shortMessage);
 
         // multipart message

Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppBindingTest.java Mon Nov  5 12:54:49 2012
@@ -16,7 +16,9 @@
  */
 package org.apache.camel.component.smpp;
 
+import java.nio.charset.Charset;
 import java.util.Date;
+import java.util.Set;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultCamelContext;
@@ -33,6 +35,7 @@ import org.jsmpp.util.DeliveryReceiptSta
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -202,6 +205,41 @@ public class SmppBindingTest {
     }
 
     @Test
+    public void createSmppMessageFrom8bitDataCodingDeliverSmShouldNotModifyBody() throws Exception {
+        final Set<String> encodings = Charset.availableCharsets().keySet();
+
+        final byte[] dataCodings = {
+            (byte)0x02,
+            (byte)0x04,
+            (byte)0xF6,
+            (byte)0xF4
+        };
+
+        byte[] body = {
+            (byte)0xFF, 'A', 'B', (byte)0x00,
+            (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF
+        };
+
+        DeliverSm deliverSm = new DeliverSm();
+
+        for (byte dataCoding : dataCodings) {
+            deliverSm.setDataCoding(dataCoding);
+            deliverSm.setShortMessage(body);
+
+            for (String encoding : encodings) {
+                binding.getConfiguration().setEncoding(encoding);
+                SmppMessage smppMessage = binding.createSmppMessage(deliverSm);
+                assertArrayEquals(
+                    String.format("data coding=0x%02X; encoding=%s",
+                                  dataCoding,
+                                  encoding),
+                    body,
+                    smppMessage.getBody(String.class).getBytes());
+            }
+        }
+    }
+
+    @Test
     public void getterShouldReturnTheSetValues() {
         SmppConfiguration configuration = new SmppConfiguration();
         binding.setConfiguration(configuration);

Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppMessageTest.java Mon Nov  5 12:54:49 2012
@@ -16,11 +16,15 @@
  */
 package org.apache.camel.component.smpp;
 
+import java.nio.charset.Charset;
+import java.util.Set;
+
 import org.jsmpp.bean.AlertNotification;
 import org.jsmpp.bean.DataSm;
 import org.jsmpp.bean.DeliverSm;
 import org.junit.Test;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -94,6 +98,40 @@ public class SmppMessageTest {
         assertNull(msg.getCommand());
         assertTrue(msg.getHeaders().isEmpty());
     }
+
+    @Test
+    public void createBodyShouldNotMangle8bitDataCodingShortMessage() {
+        final Set<String> encodings = Charset.availableCharsets().keySet();
+
+        final byte[] dataCodings = {
+            (byte)0x02,
+            (byte)0x04,
+            (byte)0xF6,
+            (byte)0xF4
+        };
+
+        byte[] body = {
+            (byte)0xFF, 'A', 'B', (byte)0x00,
+            (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF
+        };
+
+        DeliverSm command = new DeliverSm();
+        SmppConfiguration config = new SmppConfiguration();
+
+        for (byte dataCoding : dataCodings) {
+            command.setDataCoding(dataCoding);
+            command.setShortMessage(body);
+            for (String encoding : encodings) {
+                config.setEncoding(encoding);
+                message = new SmppMessage(command, config);
+                assertArrayEquals(
+                    String.format("data coding=0x%02X; encoding=%s",
+                                  dataCoding,
+                                  encoding),
+                    body, ((String) message.createBody()).getBytes());
+            }
+        }
+    }
     
     @Test
     public void createBodyShouldReturnNullIfTheCommandIsNull() {

Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppReplaceSmCommandTest.java Mon Nov  5 12:54:49 2012
@@ -23,6 +23,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultExchange;
+import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.NumberingPlanIndicator;
 import org.jsmpp.bean.RegisteredDelivery;
 import org.jsmpp.bean.SMSCDeliveryReceipt;
@@ -136,4 +137,172 @@ public class SmppReplaceSmCommandTest {
         
         assertEquals("1", exchange.getOut().getHeader(SmppConstants.ID));
     }
+
+    @Test
+    public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x00; /* SMSC-default */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(bodyNarrowed));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(bodyNarrowed));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithSMPP8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0x04; /* SMPP 8-bit */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(body));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithGSM8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0xF7; /* GSM 8-bit class 3 */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(body));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception {
+        final int binDataCoding = 0xF7; /* GSM 8-bit class 3 */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(body));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void latin1DataCodingOverridesEightBitAlphabet() throws Exception {
+        final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(),
+                                                ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "ReplaceSm");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding);
+        exchange.getIn().setBody(body);
+
+        session.replaceShortMessage((String) isNull(),
+                                    eq(TypeOfNumber.UNKNOWN),
+                                    eq(NumberingPlanIndicator.UNKNOWN),
+                                    eq("1616"),
+                                    (String) isNull(),
+                                    (String) isNull(),
+                                    eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                    eq((byte) 0),
+                                    aryEq(bodyNarrowed));
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitMultiCommandTest.java Mon Nov  5 12:54:49 2012
@@ -25,6 +25,7 @@ import org.apache.camel.ExchangePattern;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.DefaultExchange;
 import org.jsmpp.bean.Address;
+import org.jsmpp.bean.Alphabet;
 import org.jsmpp.bean.DataCoding;
 import org.jsmpp.bean.ESMClass;
 import org.jsmpp.bean.NumberingPlanIndicator;
@@ -177,4 +178,249 @@ public class SmppSubmitMultiCommandTest 
         assertEquals(1, exchange.getOut().getHeader(SmppConstants.SENT_MESSAGE_COUNT));
         assertNull(exchange.getOut().getHeader(SmppConstants.ERROR));
     }
+
+    @Test
+    public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x00; /* SMSC-default */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(dataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(bodyNarrowed),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(dataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(bodyNarrowed),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithSMPP8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0x04; /* SMPP 8-bit */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(dataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(body),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithGSM8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0xF7; /* GSM 8-bit class 3 */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(dataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(body),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception {
+        final int binDataCoding = 0x04; /* SMPP 8-bit */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(binDataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(body),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void latin1DataCodingOverridesEightBitAlphabet() throws Exception {
+        final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitMulti");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding);
+        exchange.getIn().setBody(body);
+        Address[] destAddrs = new Address[] {
+            new Address(TypeOfNumber.UNKNOWN,
+                        NumberingPlanIndicator.UNKNOWN,
+                        "1717")
+        };
+
+        expect(session.submitMultiple(eq("CMT"),
+                                      eq(TypeOfNumber.UNKNOWN),
+                                      eq(NumberingPlanIndicator.UNKNOWN),
+                                      eq("1616"),
+                                      aryEq(destAddrs),
+                                      eq(new ESMClass()),
+                                      eq((byte) 0),
+                                      eq((byte) 1),
+                                      (String) isNull(),
+                                      (String) isNull(),
+                                      eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                      eq(ReplaceIfPresentFlag.DEFAULT),
+                                      eq(DataCoding.newInstance(latin1DataCoding)),
+                                      eq((byte) 0),
+                                      aryEq(bodyNarrowed),
+                                      aryEq(new OptionalParameter[0])))
+            .andReturn(new SubmitMultiResult("1"));
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
 }
\ No newline at end of file

Modified: camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java?rev=1405775&r1=1405774&r2=1405775&view=diff
==============================================================================
--- camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java (original)
+++ camel/trunk/components/camel-smpp/src/test/java/org/apache/camel/component/smpp/SmppSubmitSmCommandTest.java Mon Nov  5 12:54:49 2012
@@ -225,4 +225,219 @@ public class SmppSubmitSmCommandTest {
         
         verify(session);
     }
+    
+    @Test
+    public void bodyWithSmscDefaultDataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x00; /* SMSC-default */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(dataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(bodyNarrowed)))
+            .andReturn("1");
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithLatin1DataCodingNarrowedToCharset() throws Exception {
+        final int dataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(dataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(bodyNarrowed)))
+            .andReturn("1");
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithSMPP8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0x04; /* SMPP 8-bit */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(dataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(body)))
+            .andReturn("1");
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void bodyWithGSM8bitDataCodingNotModified() throws Exception {
+        final int dataCoding = 0xF7; /* GSM 8-bit class 3 */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, dataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(dataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(body)))
+            .andReturn("1");
+        
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void eightBitDataCodingOverridesDefaultAlphabet() throws Exception {
+        final int binDataCoding = 0x04; /* SMPP 8-bit */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_DEFAULT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, binDataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(binDataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(body)))
+            .andReturn("1");
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
+
+    @Test
+    public void latin1DataCodingOverridesEightBitAlphabet() throws Exception {
+        final int latin1DataCoding = 0x03; /* ISO-8859-1 (Latin1) */
+        byte[] body = {(byte)0xFF, 'A', 'B', (byte)0x00, (byte)0xFF, (byte)0x7F, 'C', (byte)0xFF};
+        byte[] bodyNarrowed = {'?', 'A', 'B', '\0', '?', (byte)0x7F, 'C', '?'};
+
+        Exchange exchange = new DefaultExchange(new DefaultCamelContext(), ExchangePattern.InOut);
+        exchange.getIn().setHeader(SmppConstants.COMMAND, "SubmitSm");
+        exchange.getIn().setHeader(SmppConstants.ALPHABET, Alphabet.ALPHA_8_BIT.value());
+        exchange.getIn().setHeader(SmppConstants.DATA_CODING, latin1DataCoding);
+        exchange.getIn().setBody(body);
+        expect(session.submitShortMessage(eq("CMT"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1616"),
+                                          eq(TypeOfNumber.UNKNOWN),
+                                          eq(NumberingPlanIndicator.UNKNOWN),
+                                          eq("1717"),
+                                          eq(new ESMClass()),
+                                          eq((byte) 0),
+                                          eq((byte) 1),
+                                          (String) isNull(),
+                                          (String) isNull(),
+                                          eq(new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE)),
+                                          eq(ReplaceIfPresentFlag.DEFAULT.value()),
+                                          eq(DataCoding.newInstance(latin1DataCoding)),
+                                          eq((byte) 0),
+                                          aryEq(bodyNarrowed)))
+            .andReturn("1");
+
+        replay(session);
+        
+        command.execute(exchange);
+        
+        verify(session);
+    }
 }
\ No newline at end of file