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");
             }
         };
     }

Reply via email to