Some(CamelService) (containing the current CamelService)
diff --git a/akka-camel/src/main/scala/Message.scala b/akka-camel/src/main/scala/Message.scala
index 7c503009e8..55fc4e58f9 100644
--- a/akka-camel/src/main/scala/Message.scala
+++ b/akka-camel/src/main/scala/Message.scala
@@ -1,30 +1,35 @@
/**
* Copyright (C) 2009-2010 Scalable Solutions AB clazz
- * argument. Conversion is done using Camel's type converter. The type converter is obtained
- * from the CamelContext managed by CamelContextManager. Applications have to ensure proper
- * initialization of CamelContextManager.
- *
- * @see CamelContextManager.
+ * Creates a Message with given body and empty headers map.
*/
- def bodyAs[T](clazz: Class[T]): T =
- CamelContextManager.mandatoryContext.getTypeConverter.mandatoryConvertTo[T](clazz, body)
+ def this(body: Any) = this(body, Map.empty[String, Any])
+
+ /**
+ * Creates a Message with given body and headers map. A copy of the headers map is made.
+ *
+ * Java API
+ */
+ def this(body: Any, headers: JMap[String, Any]) = this(body, headers.toMap)
/**
* Returns the body of the message converted to the type T. Conversion is done
@@ -34,76 +39,143 @@ case class Message(val body: Any, val headers: Map[String, Any] = Map.empty) {
*
* @see CamelContextManager.
*/
- def bodyAs[T](implicit m: Manifest[T]): T =
- CamelContextManager.mandatoryContext.getTypeConverter.mandatoryConvertTo[T](m.erasure.asInstanceOf[Class[T]], body)
+ def bodyAs[T](implicit m: Manifest[T]): T = getBodyAs(m.erasure.asInstanceOf[Class[T]])
+
+ /**
+ * Returns the body of the message converted to the type as given by the clazz
+ * parameter. Conversion is done using Camel's type converter. The type converter is obtained
+ * from the CamelContext managed by CamelContextManager. Applications have to ensure proper
+ * initialization of CamelContextManager.
+ *
+ * Java API
+ *
+ * @see CamelContextManager.
+ */
+ def getBodyAs[T](clazz: Class[T]): T =
+ CamelContextManager.mandatoryContext.getTypeConverter.mandatoryConvertTo[T](clazz, body)
/**
* Returns those headers from this message whose name is contained in names.
*/
def headers(names: Set[String]): Map[String, Any] = headers.filter(names contains _._1)
+ /**
+ * Returns those headers from this message whose name is contained in names.
+ * The returned headers map is backed up by an immutable headers map. Any attempt to modify
+ * the returned map will throw an exception.
+ *
+ * Java API + */ + def getHeaders(names: JSet[String]): JMap[String, Any] = headers.filter(names contains _._1) + + /** + * Returns all headers from this message. The returned headers map is backed up by this + * message's immutable headers map. Any attempt to modify the returned map will throw an + * exception. + *
+ * Java API
+ */
+ def getHeaders: JMap[String, Any] = headers
+
/**
* Returns the header with given name. Throws NoSuchElementException
* if the header doesn't exist.
*/
def header(name: String): Any = headers(name)
+ /**
+ * Returns the header with given name. Throws NoSuchElementException
+ * if the header doesn't exist.
+ *
+ * Java API
+ */
+ def getHeader(name: String): Any = header(name)
+
/**
* Returns the header with given name converted to type T. Throws
* NoSuchElementException if the header doesn't exist.
*/
def headerAs[T](name: String)(implicit m: Manifest[T]): T =
- CamelContextManager.mandatoryContext.getTypeConverter.mandatoryConvertTo[T](m.erasure.asInstanceOf[Class[T]], header(name))
+ getHeaderAs(name, m.erasure.asInstanceOf[Class[T]])
/**
- * Returns the header with given name converted to type given by the clazz
- * argument. Throws NoSuchElementException if the header doesn't exist.
+ * Returns the header with given name converted to type as given by the clazz
+ * parameter. Throws NoSuchElementException if the header doesn't exist.
+ *
+ * Java API
*/
- def headerAs[T](name: String, clazz: Class[T]): T =
+ def getHeaderAs[T](name: String, clazz: Class[T]): T =
CamelContextManager.mandatoryContext.getTypeConverter.mandatoryConvertTo[T](clazz, header(name))
/**
- * Creates a Message with a new body using a transformer function.
+ * Creates a Message with a transformed body using a transformer function.
*/
def transformBody[A](transformer: A => Any): Message = setBody(transformer(body.asInstanceOf[A]))
/**
- * Creates a Message with a new body converted to type clazz.
- *
- * @see Message#bodyAs(Class)
+ * Creates a Message with a transformed body using a transformer function.
+ *
+ * Java API
*/
- @deprecated("use setBodyAs[T](implicit m: Manifest[T]): Message instead")
- def setBodyAs[T](clazz: Class[T]): Message = setBody(bodyAs(clazz))
+ def transformBody[A](transformer: JFunction[A, Any]): Message = setBody(transformer(body.asInstanceOf[A]))
/**
- * Creates a Message with a new body converted to type T.
- *
- * @see Message#bodyAs(Class)
+ * Creates a Message with current body converted to type T.
*/
- def setBodyAs[T](implicit m: Manifest[T]): Message = setBody(bodyAs[T])
+ def setBodyAs[T](implicit m: Manifest[T]): Message = setBodyAs(m.erasure.asInstanceOf[Class[T]])
/**
- * Creates a Message with a new body.
+ * Creates a Message with current body converted to type clazz.
+ *
+ * Java API
+ */
+ def setBodyAs[T](clazz: Class[T]): Message = setBody(getBodyAs(clazz))
+
+ /**
+ * Creates a Message with a given body.
*/
def setBody(body: Any) = new Message(body, this.headers)
/**
- * Creates a new Message with new headers.
+ * Creates a new Message with given headers.
*/
- def setHeaders(headers: Map[String, Any]) = copy(this.body, headers)
+ def setHeaders(headers: Map[String, Any]): Message = copy(this.body, headers)
/**
- * Creates a new Message with the headers argument added to the existing headers.
+ * Creates a new Message with given headers. A copy of the headers map is made.
+ *
+ * Java API
*/
- def addHeaders(headers: Map[String, Any]) = copy(this.body, this.headers ++ headers)
+ def setHeaders(headers: JMap[String, Any]): Message = setHeaders(headers.toMap)
/**
- * Creates a new Message with the header argument added to the existing headers.
+ * Creates a new Message with given headers added to the current headers.
*/
- def addHeader(header: (String, Any)) = copy(this.body, this.headers + header)
+ def addHeaders(headers: Map[String, Any]): Message = copy(this.body, this.headers ++ headers)
/**
- * Creates a new Message where the header with name headerName is removed from
+ * Creates a new Message with given headers added to the current headers.
+ * A copy of the headers map is made.
+ *
+ * Java API
+ */
+ def addHeaders(headers: JMap[String, Any]): Message = addHeaders(headers.toMap)
+
+ /**
+ * Creates a new Message with the given header added to the current headers.
+ */
+ def addHeader(header: (String, Any)): Message = copy(this.body, this.headers + header)
+
+ /**
+ * Creates a new Message with the given header, represented by name and
+ * value added to the existing headers.
+ *
+ * Java API
+ */
+ def addHeader(name: String, value: Any): Message = addHeader((name, value))
+
+ /**
+ * Creates a new Message where the header with given headerName is removed from
* the existing headers.
*/
def removeHeader(headerName: String) = copy(this.body, this.headers - headerName)
@@ -127,7 +199,7 @@ object Message {
/**
* Creates a new Message with body as message body and an empty header map.
*/
- def apply(body: Any) = new Message(body)
+ //def apply(body: Any) = new Message(body)
/**
* Creates a canonical form of the given message msg. If msg of type
@@ -147,15 +219,43 @@ object Message {
*
* @author Martin Krasser
*/
-case class Failure(val cause: Exception, val headers: Map[String, Any] = Map.empty)
+case class Failure(val cause: Exception, val headers: Map[String, Any] = Map.empty) {
+
+ /**
+ * Creates a Failure with cause body and empty headers map.
+ */
+ def this(cause: Exception) = this(cause, Map.empty[String, Any])
+
+ /**
+ * Creates a Failure with given cause and headers map. A copy of the headers map is made.
+ *
+ * Java API + */ + def this(cause: Exception, headers: JMap[String, Any]) = this(cause, headers.toMap) + + /** + * Returns the cause of this Failure. + *
+ * Java API. + */ + def getCause = cause + + /** + * Returns all headers from this failure message. The returned headers map is backed up by + * this message's immutable headers map. Any attempt to modify the returned map will throw + * an exception. + *
+ * Java API
+ */
+ def getHeaders: JMap[String, Any] = headers
+}
/**
- * Adapter for converting an org.apache.camel.Exchange to and from Message and Failure objects.
+ * Adapter for converting an org.apache.camel.Exchange to and from Message and Failure objects.
*
- * @author Martin Krasser
+ * @author Martin Krasser
*/
class CamelExchangeAdapter(exchange: Exchange) {
-
import CamelMessageConversion.toMessageAdapter
/**
@@ -256,10 +356,7 @@ class CamelMessageAdapter(val cm: CamelMessage) {
*/
def toMessage(headers: Map[String, Any]): Message = Message(cm.getBody, cmHeaders(headers, cm))
- import scala.collection.JavaConversions._
-
- private def cmHeaders(headers: Map[String, Any], cm: CamelMessage) =
- headers ++ cm.getHeaders
+ private def cmHeaders(headers: Map[String, Any], cm: CamelMessage) = headers ++ cm.getHeaders
}
/**
diff --git a/akka-camel/src/test/java/se/scalablesolutions/akka/camel/MessageJavaTestBase.java b/akka-camel/src/test/java/se/scalablesolutions/akka/camel/MessageJavaTestBase.java
new file mode 100644
index 0000000000..0db2f2b214
--- /dev/null
+++ b/akka-camel/src/test/java/se/scalablesolutions/akka/camel/MessageJavaTestBase.java
@@ -0,0 +1,129 @@
+package se.scalablesolutions.akka.camel;
+
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import se.scalablesolutions.akka.camel.CamelContextManager;
+import se.scalablesolutions.akka.camel.Message;
+import se.scalablesolutions.akka.japi.Function;
+
+import java.io.InputStream;
+import java.util.*;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author Martin Krasser
+ */
+public class MessageJavaTestBase {
+
+ @BeforeClass
+ public static void setUpBeforeClass() {
+ CamelContextManager.init();
+ }
+
+ @Test public void shouldConvertDoubleBodyToString() {
+ assertEquals("1.4", new Message("1.4").getBodyAs(String.class));
+ }
+
+ @Test(expected=NoTypeConversionAvailableException.class)
+ public void shouldThrowExceptionWhenConvertingDoubleBodyToInputStream() {
+ new Message(1.4).getBodyAs(InputStream.class);
+ }
+
+ @Test public void shouldReturnDoubleHeader() {
+ Message message = new Message("test" , createMap("test", 1.4));
+ assertEquals(1.4, message.getHeader("test"));
+ }
+
+ @Test public void shouldConvertDoubleHeaderToString() {
+ Message message = new Message("test" , createMap("test", 1.4));
+ assertEquals("1.4", message.getHeaderAs("test", String.class));
+ }
+
+ @Test public void shouldReturnSubsetOfHeaders() {
+ Message message = new Message("test" , createMap("A", "1", "B", "2"));
+ assertEquals(createMap("B", "2"), message.getHeaders(createSet("B")));
+ }
+
+ @Test(expected=UnsupportedOperationException.class)
+ public void shouldReturnSubsetOfHeadersUnmodifiable() {
+ Message message = new Message("test" , createMap("A", "1", "B", "2"));
+ message.getHeaders(createSet("B")).put("x", "y");
+ }
+
+ @Test public void shouldReturnAllHeaders() {
+ Message message = new Message("test" , createMap("A", "1", "B", "2"));
+ assertEquals(createMap("A", "1", "B", "2"), message.getHeaders());
+ }
+
+ @Test(expected=UnsupportedOperationException.class)
+ public void shouldReturnAllHeadersUnmodifiable() {
+ Message message = new Message("test" , createMap("A", "1", "B", "2"));
+ message.getHeaders().put("x", "y");
+ }
+
+ @Test public void shouldTransformBodyAndPreserveHeaders() {
+ assertEquals(
+ new Message("ab", createMap("A", "1")),
+ new Message("a" , createMap("A", "1")).transformBody((Function)new TestTransformer()));
+ }
+
+ @Test public void shouldConvertBodyAndPreserveHeaders() {
+ assertEquals(
+ new Message("1.4", createMap("A", "1")),
+ new Message(1.4 , createMap("A", "1")).setBodyAs(String.class));
+ }
+
+ @Test public void shouldSetBodyAndPreserveHeaders() {
+ assertEquals(
+ new Message("test2" , createMap("A", "1")),
+ new Message("test1" , createMap("A", "1")).setBody("test2"));
+ }
+
+ @Test public void shouldSetHeadersAndPreserveBody() {
+ assertEquals(
+ new Message("test1" , createMap("C", "3")),
+ new Message("test1" , createMap("A", "1")).setHeaders(createMap("C", "3")));
+ }
+
+ @Test public void shouldAddHeaderAndPreserveBodyAndHeaders() {
+ assertEquals(
+ new Message("test1" , createMap("A", "1", "B", "2")),
+ new Message("test1" , createMap("A", "1")).addHeader("B", "2"));
+ }
+
+ @Test public void shouldAddHeadersAndPreserveBodyAndHeaders() {
+ assertEquals(
+ new Message("test1" , createMap("A", "1", "B", "2")),
+ new Message("test1" , createMap("A", "1")).addHeaders(createMap("B", "2")));
+ }
+
+ @Test public void shouldRemoveHeadersAndPreserveBodyAndRemainingHeaders() {
+ assertEquals(
+ new Message("test1" , createMap("A", "1")),
+ new Message("test1" , createMap("A", "1", "B", "2")).removeHeader("B"));
+ }
+
+ private static Set