You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/04/26 10:59:40 UTC

svn commit: r1476113 - in /camel/trunk/components: camel-mina/src/main/java/org/apache/camel/component/mina/ camel-mina/src/test/java/org/apache/camel/component/mina/ camel-mina2/src/main/java/org/apache/camel/component/mina2/ camel-mina2/src/test/java...

Author: davsclaus
Date: Fri Apr 26 08:59:40 2013
New Revision: 1476113

URL: http://svn.apache.org/r1476113
Log:
CAMEL-6302: Mina udp codec should use byte[] instead of String. Thanks to Thomas Termin for the patches.

Modified:
    camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java
    camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaUdpProtocolCodecFactory.java
    camel/trunk/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaUdpUsingTemplateTest.java
    camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Consumer.java
    camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Producer.java
    camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2UdpProtocolCodecFactory.java
    camel/trunk/components/camel-mina2/src/test/java/org/apache/camel/component/mina2/Mina2UdpUsingTemplateTest.java

Modified: camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java (original)
+++ camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java Fri Apr 26 08:59:40 2013
@@ -330,12 +330,10 @@ public class MinaComponent extends Defau
     protected void configureDataGramCodecFactory(final String type, final IoServiceConfig config, final MinaConfiguration configuration) {
         ProtocolCodecFactory codecFactory = configuration.getCodec();
         if (codecFactory == null) {
-            final Charset charset = getEncodingParameter(type, configuration);
-            
-            codecFactory = new MinaUdpProtocolCodecFactory(getCamelContext(), charset);
+            codecFactory = new MinaUdpProtocolCodecFactory(getCamelContext());
 
             if (LOG.isDebugEnabled()) {
-                LOG.debug("{}: Using CodecFactory: {} using encoding: {}", new Object[]{type, codecFactory, charset});
+                LOG.debug("{}: Using CodecFactory: {}", new Object[]{type, codecFactory});
             }
         }
 

Modified: camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaUdpProtocolCodecFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaUdpProtocolCodecFactory.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaUdpProtocolCodecFactory.java (original)
+++ camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaUdpProtocolCodecFactory.java Fri Apr 26 08:59:40 2013
@@ -17,8 +17,6 @@
 package org.apache.camel.component.mina;
 
 import java.nio.charset.CharacterCodingException;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.NoTypeConversionAvailableException;
@@ -31,27 +29,21 @@ import org.apache.mina.filter.codec.Prot
 import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 
 /**
- * @version 
+ * @version
  */
 public class MinaUdpProtocolCodecFactory implements ProtocolCodecFactory {
 
-    private final Charset charset;
     private final CamelContext context;
 
-    public MinaUdpProtocolCodecFactory(CamelContext context, Charset charset) {
+    public MinaUdpProtocolCodecFactory(CamelContext context) {
         this.context = context;
-        this.charset = charset;
     }
 
     public ProtocolEncoder getEncoder() throws Exception {
         return new ProtocolEncoder() {
-            private CharsetEncoder encoder;
 
             public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
-                if (encoder == null) {
-                    encoder = charset.newEncoder();
-                }
-                ByteBuffer buf = toByteBuffer(message, encoder);
+                ByteBuffer buf = toByteBuffer(message);
                 buf.flip();
                 out.write(buf);
             }
@@ -64,10 +56,11 @@ public class MinaUdpProtocolCodecFactory
 
     public ProtocolDecoder getDecoder() throws Exception {
         return new ProtocolDecoder() {
-            public void decode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws Exception {
-                // convert to bytes to write, we can not pass in the byte buffer as it could be sent to
-                // multiple mina sessions so we must convert it to bytes
-                byte[] bytes = context.getTypeConverter().convertTo(byte[].class, in);
+            public void decode(IoSession session, ByteBuffer in,
+                               ProtocolDecoderOutput out) throws Exception {
+                // convert to bytes to write, we can not pass in the byte buffer
+                // as it could be sent to multiple mina sessions so we must convert it to bytes
+                byte[] bytes = context.getTypeConverter().mandatoryConvertTo(byte[].class, in);
                 out.write(bytes);
             }
 
@@ -81,17 +74,15 @@ public class MinaUdpProtocolCodecFactory
         };
     }
 
-    private ByteBuffer toByteBuffer(Object message, CharsetEncoder encoder)
-        throws CharacterCodingException, NoTypeConversionAvailableException {
-        String value = context.getTypeConverter().convertTo(String.class, message);
+    private ByteBuffer toByteBuffer(Object message) throws CharacterCodingException, NoTypeConversionAvailableException {
+        // try to convert it to a byte array
+        byte[] value = context.getTypeConverter().tryConvertTo(byte[].class, message);
         if (value != null) {
-            ByteBuffer answer = ByteBuffer.allocate(value.length()).setAutoExpand(false);
-            answer.putString(value, encoder);
+            ByteBuffer answer = ByteBuffer.allocate(value.length).setAutoExpand(false);
+            answer.put(value);
             return answer;
         }
-
-        // failback to use a byte buffer converter
+        // fallback to use a byte buffer converter
         return context.getTypeConverter().mandatoryConvertTo(ByteBuffer.class, message);
     }
-
 }

Modified: camel/trunk/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaUdpUsingTemplateTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaUdpUsingTemplateTest.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaUdpUsingTemplateTest.java (original)
+++ camel/trunk/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaUdpUsingTemplateTest.java Fri Apr 26 08:59:40 2013
@@ -24,7 +24,7 @@ import org.apache.camel.component.mock.M
 import org.junit.Test;
 
 /**
- * @version 
+ * @version
  */
 public class MinaUdpUsingTemplateTest extends BaseMinaTest {
 
@@ -37,8 +37,6 @@ public class MinaUdpUsingTemplateTest ex
         endpoint.expectedBodiesReceived("Hello Message: 0", "Hello Message: 1", "Hello Message: 2");
 
         sendUdpMessages();
-        // sleeping for while to let the mock endpoint get all the message
-        Thread.sleep(2000);
 
         assertMockEndpointsSatisfied();
     }
@@ -57,9 +55,6 @@ public class MinaUdpUsingTemplateTest ex
         byte[] in = "Hello from bytes".getBytes();
         template.sendBody("mina:udp://127.0.0.1:{{port}}?sync=false", in);
 
-        // sleeping for while to let the mock endpoint get all the message
-        Thread.sleep(2000);
-
         assertMockEndpointsSatisfied();
         List<Exchange> list = endpoint.getReceivedExchanges();
         byte[] out = list.get(0).getIn().getBody(byte[].class);
@@ -69,10 +64,49 @@ public class MinaUdpUsingTemplateTest ex
         }
     }
 
+    @Test
+    public void testSendingRawByteMessage() throws Exception {
+        MockEndpoint endpoint = getMockEndpoint("mock:result");
+        endpoint.expectedMessageCount(1);
+
+        String toSend = "ef3e00559f5faf0262f5ff0962d9008daa91001cd46b0fa9330ef0f3030fff250e46f72444d1cc501678c351e04b8004c"
+                + "4000002080000fe850bbe011030000008031b031bfe9251305441593830354720020800050440ff";
+        byte[] in = fromHexString(toSend);
+        template.sendBody("mina:udp://127.0.0.1:{{port}}?sync=false", in);
+
+        assertMockEndpointsSatisfied();
+        List<Exchange> list = endpoint.getReceivedExchanges();
+        byte[] out = list.get(0).getIn().getBody(byte[].class);
+
+        for (int i = 0; i < in.length; i++) {
+            assertEquals("The bytes should be the same", in[i], out[i]);
+        }
+        assertEquals("The strings should be the same", toSend, byteArrayToHex(out));
+    }
+
+    private String byteArrayToHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    private byte[] fromHexString(String hexstr) {
+        byte data[] = new byte[hexstr.length() / 2];
+        int i = 0;
+        for (int n = hexstr.length(); i < n; i += 2) {
+            data[i / 2] = (Integer.decode("0x" + hexstr.charAt(i)
+                    + hexstr.charAt(i + 1))).byteValue();
+        }
+        return data;
+    }
+
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("mina:udp://127.0.0.1:{{port}}?sync=false&minaLogger=true").to("mock:result");
+                from("mina:udp://127.0.0.1:{{port}}?sync=false&minaLogger=true")
+                        .to("mock:result");
             }
         };
     }

Modified: camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Consumer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Consumer.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Consumer.java (original)
+++ camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Consumer.java Fri Apr 26 08:59:40 2013
@@ -224,12 +224,10 @@ public class Mina2Consumer extends Defau
     protected void configureDataGramCodecFactory(final String type, final IoService service, final Mina2Configuration configuration) {
         ProtocolCodecFactory codecFactory = configuration.getCodec();
         if (codecFactory == null) {
-            final Charset charset = getEncodingParameter(type, configuration);
-
-            codecFactory = new Mina2UdpProtocolCodecFactory(this.getEndpoint().getCamelContext(), charset);
+            codecFactory = new Mina2UdpProtocolCodecFactory(this.getEndpoint().getCamelContext());
 
             if (LOG.isDebugEnabled()) {
-                LOG.debug("{}: Using CodecFactory: {} using encoding: {}", new Object[]{type, codecFactory, charset});
+                LOG.debug("{}: Using CodecFactory: {}", new Object[]{type, codecFactory});
             }
         }
 

Modified: camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Producer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Producer.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Producer.java (original)
+++ camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2Producer.java Fri Apr 26 08:59:40 2013
@@ -388,12 +388,10 @@ public class Mina2Producer extends Defau
     protected void configureDataGramCodecFactory(final String type, final IoService service, final Mina2Configuration configuration) {
         ProtocolCodecFactory codecFactory = configuration.getCodec();
         if (codecFactory == null) {
-            final Charset charset = getEncodingParameter(type, configuration);
-
-            codecFactory = new Mina2UdpProtocolCodecFactory(this.getEndpoint().getCamelContext(), charset);
+            codecFactory = new Mina2UdpProtocolCodecFactory(this.getEndpoint().getCamelContext());
 
             if (LOG.isDebugEnabled()) {
-                LOG.debug("{}: Using CodecFactory: {} using encoding: {}", new Object[]{type, codecFactory, charset});
+                LOG.debug("{}: Using CodecFactory: {}", new Object[]{type, codecFactory});
             }
         }
 

Modified: camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2UdpProtocolCodecFactory.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2UdpProtocolCodecFactory.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2UdpProtocolCodecFactory.java (original)
+++ camel/trunk/components/camel-mina2/src/main/java/org/apache/camel/component/mina2/Mina2UdpProtocolCodecFactory.java Fri Apr 26 08:59:40 2013
@@ -17,8 +17,6 @@
 package org.apache.camel.component.mina2;
 
 import java.nio.charset.CharacterCodingException;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.NoTypeConversionAvailableException;
@@ -31,28 +29,21 @@ import org.apache.mina.filter.codec.Prot
 import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 
 /**
- * @version 
+ * @version
  */
 public class Mina2UdpProtocolCodecFactory implements ProtocolCodecFactory {
 
-    private final Charset charset;
     private final CamelContext context;
 
-    public Mina2UdpProtocolCodecFactory(CamelContext context, Charset charset) {
+    public Mina2UdpProtocolCodecFactory(CamelContext context) {
         this.context = context;
-        this.charset = charset;
     }
 
     public ProtocolEncoder getEncoder(IoSession session) throws Exception {
         return new ProtocolEncoder() {
 
-            private CharsetEncoder encoder;
-
             public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
-                if (encoder == null) {
-                    encoder = charset.newEncoder();
-                }
-                IoBuffer buf = toIoBuffer(message, encoder);
+                IoBuffer buf = toIoBuffer(message);
                 buf.flip();
                 out.write(buf);
             }
@@ -83,16 +74,16 @@ public class Mina2UdpProtocolCodecFactor
         };
     }
 
-    private IoBuffer toIoBuffer(Object message, CharsetEncoder encoder)
-        throws CharacterCodingException, NoTypeConversionAvailableException {
-        String value = context.getTypeConverter().convertTo(String.class, message);
+    private IoBuffer toIoBuffer(Object message) throws CharacterCodingException, NoTypeConversionAvailableException {
+        //try to convert it to a byte array
+        byte[] value = context.getTypeConverter().tryConvertTo(byte[].class, message);
         if (value != null) {
-            IoBuffer answer = IoBuffer.allocate(value.length()).setAutoExpand(true);
-            answer.putString(value, encoder);
+            IoBuffer answer = IoBuffer.allocate(value.length).setAutoExpand(true);
+            answer.put(value);
             return answer;
         }
 
-        // failback to use a byte buffer converter
+        // fallback to use a byte buffer converter
         return context.getTypeConverter().mandatoryConvertTo(IoBuffer.class, message);
     }
 }

Modified: camel/trunk/components/camel-mina2/src/test/java/org/apache/camel/component/mina2/Mina2UdpUsingTemplateTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina2/src/test/java/org/apache/camel/component/mina2/Mina2UdpUsingTemplateTest.java?rev=1476113&r1=1476112&r2=1476113&view=diff
==============================================================================
--- camel/trunk/components/camel-mina2/src/test/java/org/apache/camel/component/mina2/Mina2UdpUsingTemplateTest.java (original)
+++ camel/trunk/components/camel-mina2/src/test/java/org/apache/camel/component/mina2/Mina2UdpUsingTemplateTest.java Fri Apr 26 08:59:40 2013
@@ -24,7 +24,7 @@ import org.apache.camel.component.mock.M
 import org.junit.Test;
 
 /**
- * @version 
+ * @version
  */
 public class Mina2UdpUsingTemplateTest extends BaseMina2Test {
 
@@ -37,8 +37,6 @@ public class Mina2UdpUsingTemplateTest e
         endpoint.expectedBodiesReceived("Hello Message: 0", "Hello Message: 1", "Hello Message: 2");
 
         sendUdpMessages();
-        // sleeping for while to let the mock endpoint get all the message
-        Thread.sleep(2000);
 
         assertMockEndpointsSatisfied();
     }
@@ -57,9 +55,6 @@ public class Mina2UdpUsingTemplateTest e
         byte[] in = "Hello from bytes".getBytes();
         template.sendBody(String.format("mina2:udp://127.0.0.1:%1$s?sync=false", getPort()), in);
 
-        // sleeping for while to let the mock endpoint get all the message
-        Thread.sleep(2000);
-
         assertMockEndpointsSatisfied();
         List<Exchange> list = endpoint.getReceivedExchanges();
         byte[] out = list.get(0).getIn().getBody(byte[].class);
@@ -69,6 +64,44 @@ public class Mina2UdpUsingTemplateTest e
         }
     }
 
+    @Test
+    public void testSendingRawByteMessage() throws Exception {
+        MockEndpoint endpoint = getMockEndpoint("mock:result");
+        endpoint.expectedMessageCount(1);
+
+        String toSend = "ef3e00559f5faf0262f5ff0962d9008daa91001cd46b0fa9330ef0f3030fff250e46f72444d1cc501678c351e04b8004c"
+                + "4000002080000fe850bbe011030000008031b031bfe9251305441593830354720020800050440ff";
+        byte[] in = fromHexString(toSend);
+        template.sendBody(String.format("mina2:udp://127.0.0.1:%1$s?sync=false", getPort()), in);
+
+        assertMockEndpointsSatisfied();
+        List<Exchange> list = endpoint.getReceivedExchanges();
+        byte[] out = list.get(0).getIn().getBody(byte[].class);
+
+        for (int i = 0; i < in.length; i++) {
+            assertEquals("The bytes should be the same", in[i], out[i]);
+        }
+        assertEquals("The strings should be the same", toSend, byteArrayToHex(out));
+    }
+
+    private String byteArrayToHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    private byte[] fromHexString(String hexstr) {
+        byte data[] = new byte[hexstr.length() / 2];
+        int i = 0;
+        for (int n = hexstr.length(); i < n; i += 2) {
+            data[i / 2] = (Integer.decode("0x" + hexstr.charAt(i)
+                    + hexstr.charAt(i + 1))).byteValue();
+        }
+        return data;
+    }
+
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {