Start implementing the CoAP producer
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d7803241 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d7803241 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d7803241 Branch: refs/heads/master Commit: d7803241b619273896497c5aa35d933aaf21a201 Parents: cad2ca3 Author: Daniel Kulp <dk...@apache.org> Authored: Thu Aug 6 15:23:44 2015 -0400 Committer: Daniel Kulp <dk...@apache.org> Committed: Thu Aug 6 15:23:44 2015 -0400 ---------------------------------------------------------------------- .../org/apache/camel/coap/CoAPProducer.java | 68 ++++++++++++++++++-- .../apache/camel/coap/CoAPComponentTest.java | 22 +++++-- 2 files changed, 81 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/d7803241/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java index 70ab363..a3fead9 100644 --- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java +++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java @@ -16,17 +16,21 @@ */ package org.apache.camel.coap; +import java.net.URI; + import org.apache.camel.Exchange; +import org.apache.camel.Message; import org.apache.camel.impl.DefaultProducer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.eclipse.californium.core.CoapClient; +import org.eclipse.californium.core.CoapResponse; +import org.eclipse.californium.core.coap.MediaTypeRegistry; /** * The CoAP producer. */ public class CoAPProducer extends DefaultProducer { - private static final Logger LOG = LoggerFactory.getLogger(CoAPProducer.class); - private CoAPEndpoint endpoint; + private final CoAPEndpoint endpoint; + private CoapClient client; public CoAPProducer(CoAPEndpoint endpoint) { super(endpoint); @@ -34,7 +38,61 @@ public class CoAPProducer extends DefaultProducer { } public void process(Exchange exchange) throws Exception { - System.out.println(exchange.getIn().getBody()); + CoapClient client = getClient(exchange); + String ct = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); + if (ct == null) { + //?default? + ct = "application/octet-stream"; + } + String method = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class); + if (method == null) { + method = endpoint.getCoapMethod(); + } + if (method == null) { + Object body = exchange.getIn().getBody(); + if (body == null) { + method = "GET"; + } else { + method = "POST"; + } + } + int mediaType = MediaTypeRegistry.parse(ct); + CoapResponse response = null; + switch (method) { + case "GET": + response = client.get(); + break; + case "DELETE": + response = client.delete(); + break; + case "POST": + byte[] bodyPost = exchange.getIn().getBody(byte[].class); + response = client.post(bodyPost, mediaType); + break; + case "PUT": + byte[] bodyPut = exchange.getIn().getBody(byte[].class); + response = client.put(bodyPut, mediaType); + break; + default: + break; + } + + if (response != null) { + Message resp = exchange.getOut(); + String mt = MediaTypeRegistry.toString(response.getOptions().getContentFormat()); + resp.setHeader(org.apache.camel.Exchange.CONTENT_TYPE, mt); + resp.setBody(response.getPayload()); + } } + private synchronized CoapClient getClient(Exchange exchange) { + if (client == null) { + URI uri = exchange.getIn().getHeader("coapUri", URI.class); + if (uri == null) { + uri = endpoint.getUri(); + } + client = new CoapClient(uri); + } + return client; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/d7803241/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTest.java ---------------------------------------------------------------------- diff --git a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTest.java b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTest.java index e5dd94b..71c538d 100644 --- a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTest.java +++ b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPComponentTest.java @@ -16,7 +16,10 @@ */ package org.apache.camel.coap; +import org.apache.camel.Produce; +import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.AvailablePortFinder; import org.apache.camel.test.junit4.CamelTestSupport; import org.eclipse.californium.core.CoapClient; @@ -25,14 +28,23 @@ import org.eclipse.californium.core.network.config.NetworkConfig; import org.junit.Test; public class CoAPComponentTest extends CamelTestSupport { - int port = AvailablePortFinder.getNextAvailable(); + static final int PORT = AvailablePortFinder.getNextAvailable(); + + @Produce(uri = "direct:start") + protected ProducerTemplate sender; @Test public void testCoAP() throws Exception { NetworkConfig.createStandardWithoutFile(); - CoapClient client = new CoapClient("coap://localhost:" + port + "/TestResource"); + CoapClient client = new CoapClient("coap://localhost:" + PORT + "/TestResource"); CoapResponse rsp = client.get(); assertEquals("Hello ", rsp.getResponseText()); + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived("Hello"); + sender.sendBody("Hello"); + assertMockEndpointsSatisfied(); } @Override @@ -40,11 +52,13 @@ public class CoAPComponentTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("coap://localhost:" + port + "/TestResource") + from("coap://localhost:" + PORT + "/TestResource") .convertBodyTo(String.class) .to("log:exch") .transform(body().prepend("Hello ")) - .to("log:exch"); + .to("log:exch"); + + from("direct:start").to("coap://localhost:" + PORT + "/TestResource").to("mock:result"); } }; }