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 2010/07/06 07:49:47 UTC
svn commit: r960792 - in /camel/trunk/components:
camel-mina/src/main/java/org/apache/camel/component/mina/
camel-netty/src/main/java/org/apache/camel/component/netty/
camel-netty/src/main/java/org/apache/camel/component/netty/handlers/
camel-netty/src...
Author: davsclaus
Date: Tue Jul 6 05:49:47 2010
New Revision: 960792
URL: http://svn.apache.org/viewvc?rev=960792&view=rev
Log:
CAMEL-2908: Added textline delimiter configuration and auto append missing delimiter options.
Added:
camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java (with props)
camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyNullDelimiterTest.java
- copied, changed from r960773, camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java
Modified:
camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/TextLineDelimiter.java
camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyHelper.java
camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java
camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTcpWithInOutUsingPlainSocketTest.java
camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java
camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyUdpWithInOutUsingPlainSocketTest.java
Modified: camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/TextLineDelimiter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/TextLineDelimiter.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/TextLineDelimiter.java (original)
+++ camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/TextLineDelimiter.java Tue Jul 6 05:49:47 2010
@@ -17,7 +17,7 @@
package org.apache.camel.component.mina;
/**
- * Possible text line delmiters to be used with the textline codec.
+ * Possible text line delimiters to be used with the textline codec.
*/
public enum TextLineDelimiter {
DEFAULT, AUTO, UNIX, WINDOWS, MAC
Modified: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java (original)
+++ camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java Tue Jul 6 05:49:47 2010
@@ -30,6 +30,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.netty.channel.ChannelDownstreamHandler;
import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
+import org.jboss.netty.handler.codec.frame.Delimiters;
import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
import org.jboss.netty.handler.codec.serialization.ObjectEncoder;
import org.jboss.netty.handler.codec.string.StringDecoder;
@@ -52,6 +54,9 @@ public class NettyConfiguration implemen
private boolean reuseAddress = true;
private boolean sync = true;
private boolean textline;
+ private TextLineDelimiter delimiter = TextLineDelimiter.LINE;
+ private boolean autoAppendDelimiter = true;
+ private int decorderMaxLineLength = 1024;
private String encoding;
private String passphrase;
private File keyStoreFile;
@@ -123,10 +128,12 @@ public class NettyConfiguration implemen
if (isTextline()) {
Charset charset = getEncoding() != null ? Charset.forName(getEncoding()) : CharsetUtil.UTF_8;
encoders.add(new StringEncoder(charset));
+ decoders.add(new DelimiterBasedFrameDecoder(decorderMaxLineLength, true, delimiter == TextLineDelimiter.LINE ? Delimiters.lineDelimiter() : Delimiters.nulDelimiter()));
decoders.add(new StringDecoder(charset));
if (LOG.isDebugEnabled()) {
- LOG.debug("Using textline encoders and decoders with charset: " + charset);
+ LOG.debug("Using textline encoders and decoders with charset: " + charset + ", delimiter: "
+ + delimiter + " and decoderMaxLineLength: " + decorderMaxLineLength);
}
} else {
// object serializable is then used
@@ -158,7 +165,7 @@ public class NettyConfiguration implemen
return Charset.forName(encoding).name();
}
- protected boolean isTcp() {
+ public boolean isTcp() {
return protocol.equalsIgnoreCase("tcp");
}
@@ -242,6 +249,30 @@ public class NettyConfiguration implemen
this.textline = textline;
}
+ public int getDecorderMaxLineLength() {
+ return decorderMaxLineLength;
+ }
+
+ public void setDecorderMaxLineLength(int decorderMaxLineLength) {
+ this.decorderMaxLineLength = decorderMaxLineLength;
+ }
+
+ public TextLineDelimiter getDelimiter() {
+ return delimiter;
+ }
+
+ public void setDelimiter(TextLineDelimiter delimiter) {
+ this.delimiter = delimiter;
+ }
+
+ public boolean isAutoAppendDelimiter() {
+ return autoAppendDelimiter;
+ }
+
+ public void setAutoAppendDelimiter(boolean autoAppendDelimiter) {
+ this.autoAppendDelimiter = autoAppendDelimiter;
+ }
+
public String getEncoding() {
return encoding;
}
Modified: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyHelper.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyHelper.java (original)
+++ camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyHelper.java Tue Jul 6 05:49:47 2010
@@ -20,6 +20,7 @@ import java.net.SocketAddress;
import org.apache.camel.CamelExchangeException;
import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.netty.channel.Channel;
@@ -39,11 +40,49 @@ public final class NettyHelper {
}
/**
+ * Gets the string body to be used when sending with the textline codec.
+ *
+ * @param body the current body
+ * @param exchange the exchange
+ * @param delimiter the textline delimiter
+ * @param autoAppendDelimiter whether absent delimiter should be auto appended
+ * @return the string body to send
+ * @throws NoTypeConversionAvailableException is thrown if the current body could not be converted to a String type
+ */
+ public static String getTextlineBody(Object body, Exchange exchange, TextLineDelimiter delimiter, boolean autoAppendDelimiter) throws NoTypeConversionAvailableException {
+ String s = exchange.getContext().getTypeConverter().mandatoryConvertTo(String.class, exchange, body);
+
+ // auto append delimiter if missing?
+ if (autoAppendDelimiter) {
+ if (TextLineDelimiter.LINE.equals(delimiter)) {
+ // line delimiter so ensure it ends with newline
+ if (!s.endsWith("\n")) {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Auto appending missing newline delimiter to body");
+ }
+ s = s + "\n";
+ }
+ } else {
+ // null delimiter so ensure it ends with null
+ if (!s.endsWith("\u0000")) {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Auto appending missing null delimiter to body");
+ }
+ s = s + "\u0000";
+ }
+ }
+ }
+
+ return s;
+ }
+
+ /**
* Writes the given body to Netty channel. Will wait until the body has been written.
*
- * @param channel the Netty channel
- * @param body the body to write (send)
- * @param exchange the exchange
+ * @param channel the Netty channel
+ * @param remoteAddress the remote address when using UDP
+ * @param body the body to write (send)
+ * @param exchange the exchange
* @throws CamelExchangeException is thrown if the body could not be written for some reasons
* (eg remote connection is closed etc.)
*/
@@ -69,6 +108,11 @@ public final class NettyHelper {
}
}
+ /**
+ * Closes the given channel
+ *
+ * @param channel the channel to close
+ */
public static void close(Channel channel) {
if (channel != null) {
if (LOG.isTraceEnabled()) {
Modified: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java (original)
+++ camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java Tue Jul 6 05:49:47 2010
@@ -129,10 +129,11 @@ public class NettyProducer extends Defau
callback.done(true);
return true;
}
+
// if textline enabled then covert to a String which must be used for textline
if (getConfiguration().isTextline()) {
try {
- body = context.getTypeConverter().mandatoryConvertTo(String.class, exchange, body);
+ body = NettyHelper.getTextlineBody(body, exchange, getConfiguration().getDelimiter(), getConfiguration().isAutoAppendDelimiter());
} catch (NoTypeConversionAvailableException e) {
exchange.setException(e);
callback.done(true);
Added: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java?rev=960792&view=auto
==============================================================================
--- camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java (added)
+++ camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java Tue Jul 6 05:49:47 2010
@@ -0,0 +1,10 @@
+package org.apache.camel.component.netty;
+
+/**
+ * Possible text line delimiters to be used with the textline codec.
+ *
+ * @version $Revision$
+ */
+public enum TextLineDelimiter {
+ LINE, NULL;
+}
Propchange: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/TextLineDelimiter.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java (original)
+++ camel/trunk/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java Tue Jul 6 05:49:47 2010
@@ -135,17 +135,17 @@ public class ServerChannelHandler extend
} else {
// if textline enabled then covert to a String which must be used for textline
if (consumer.getConfiguration().isTextline()) {
- body = consumer.getContext().getTypeConverter().mandatoryConvertTo(String.class, exchange, body);
+ body = NettyHelper.getTextlineBody(body, exchange, consumer.getConfiguration().getDelimiter(), consumer.getConfiguration().isAutoAppendDelimiter());
}
// we got a body to write
if (LOG.isDebugEnabled()) {
LOG.debug("Writing body: " + body);
}
- if (consumer.getConfiguration().getProtocol().equalsIgnoreCase("udp")) {
- NettyHelper.writeBodySync(messageEvent.getChannel(), messageEvent.getRemoteAddress(), body, exchange);
- } else {
+ if (consumer.getConfiguration().isTcp()) {
NettyHelper.writeBodySync(messageEvent.getChannel(), null, body, exchange);
+ } else {
+ NettyHelper.writeBodySync(messageEvent.getChannel(), messageEvent.getRemoteAddress(), body, exchange);
}
}
Modified: camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTcpWithInOutUsingPlainSocketTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTcpWithInOutUsingPlainSocketTest.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTcpWithInOutUsingPlainSocketTest.java (original)
+++ camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTcpWithInOutUsingPlainSocketTest.java Tue Jul 6 05:49:47 2010
@@ -89,7 +89,8 @@ public class NettyTcpWithInOutUsingPlain
InputStream is = null;
try {
os = soc.getOutputStream();
- os.write(input.getBytes());
+ // must append the line delimiter
+ os.write((input + "\n").getBytes());
is = soc.getInputStream();
int len = is.read(buf);
Copied: camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyNullDelimiterTest.java (from r960773, camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyNullDelimiterTest.java?p2=camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyNullDelimiterTest.java&p1=camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java&r1=960773&r2=960792&rev=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java (original)
+++ camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyNullDelimiterTest.java Tue Jul 6 05:49:47 2010
@@ -23,13 +23,13 @@ import org.junit.Test;
/**
* @version $Revision$
*/
-public class NettyTextlineInOnlyTest extends CamelTestSupport {
+public class NettyTextlineInOnlyNullDelimiterTest extends CamelTestSupport {
@Test
- public void testTextlineInOnly() throws Exception {
- getMockEndpoint("mock:result").expectedBodiesReceived("Hello World\nHow are you?");
-
- template.sendBody("netty:tcp://localhost:5149?textline=true&sync=false", "Hello World\nHow are you?");
+ public void testTextlineInOnlyNull() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+ template.sendBody("netty:tcp://localhost:5149?textline=true&delimiter=NULL&sync=false", "Hello World\u0000");
assertMockEndpointsSatisfied();
}
@@ -39,11 +39,11 @@ public class NettyTextlineInOnlyTest ext
return new RouteBuilder() {
@Override
public void configure() throws Exception {
- from("netty:tcp://localhost:5149?textline=true&sync=false")
+ from("netty:tcp://localhost:5149?textline=true&delimiter=NULL&sync=false")
// body should be a String when using textline codec
.validate(body().isInstanceOf(String.class))
.to("mock:result");
}
};
}
-}
+}
\ No newline at end of file
Modified: camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java (original)
+++ camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTextlineInOnlyTest.java Tue Jul 6 05:49:47 2010
@@ -26,10 +26,28 @@ import org.junit.Test;
public class NettyTextlineInOnlyTest extends CamelTestSupport {
@Test
+ public void testTextlineInOnlyDual() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("Hello World", "how are you?");
+
+ template.sendBody("netty:tcp://localhost:5149?textline=true&sync=false", "Hello World\nhow are you?\n");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Test
+ public void testTextlineInOnlyAutoAppend() throws Exception {
+ getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+ template.sendBody("netty:tcp://localhost:5149?textline=true&sync=false", "Hello World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Test
public void testTextlineInOnly() throws Exception {
- getMockEndpoint("mock:result").expectedBodiesReceived("Hello World\nHow are you?");
-
- template.sendBody("netty:tcp://localhost:5149?textline=true&sync=false", "Hello World\nHow are you?");
+ getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+ template.sendBody("netty:tcp://localhost:5149?textline=true&sync=false", "Hello World\n");
assertMockEndpointsSatisfied();
}
Modified: camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyUdpWithInOutUsingPlainSocketTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyUdpWithInOutUsingPlainSocketTest.java?rev=960792&r1=960791&r2=960792&view=diff
==============================================================================
--- camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyUdpWithInOutUsingPlainSocketTest.java (original)
+++ camel/trunk/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyUdpWithInOutUsingPlainSocketTest.java Tue Jul 6 05:49:47 2010
@@ -39,14 +39,15 @@ public class NettyUdpWithInOutUsingPlain
public void testSendAndReceiveOnce() throws Exception {
String out = sendAndReceiveUdpMessages("World");
assertNotNull("should receive data", out);
- assertEquals("Hello World", out);
+ assertEquals("Hello World\n", out);
}
private String sendAndReceiveUdpMessages(String input) throws Exception {
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("127.0.0.1");
- byte[] data = input.getBytes();
+ // must append delimiter
+ byte[] data = (input + "\n").getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, address, PORT);
LOG.debug("+++ Sending data +++");