CAMEL-6804: camel-facebook - Problem with jsonStoreEnabled option

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/271226c4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/271226c4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/271226c4

Branch: refs/heads/camel-2.12.x
Commit: 271226c40e0e9dddcdb70e7e496a307b9af781e7
Parents: 1c14a20
Author: Claus Ibsen <[email protected]>
Authored: Tue Oct 1 08:49:33 2013 +0200
Committer: Claus Ibsen <[email protected]>
Committed: Tue Oct 1 08:53:22 2013 +0200

----------------------------------------------------------------------
 .../component/facebook/FacebookComponent.java   |  5 ++-
 .../component/facebook/FacebookConstants.java   |  1 +
 .../component/facebook/FacebookConsumer.java    | 41 ++++++++++++--------
 .../component/facebook/FacebookEndpoint.java    | 11 +++++-
 .../component/facebook/FacebookProducer.java    | 29 +++++++++++---
 .../facebook/FacebookComponentConsumerTest.java | 23 ++++++++---
 .../facebook/FacebookComponentProducerTest.java | 16 ++++++--
 7 files changed, 94 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookComponent.java
 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookComponent.java
index 4ae234f..fb45b71 100644
--- 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookComponent.java
+++ 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookComponent.java
@@ -54,7 +54,10 @@ public class FacebookComponent extends UriEndpointComponent {
 
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         FacebookEndpointConfiguration config = copyComponentProperties();
-        return new FacebookEndpoint(uri, this, remaining, config);
+        final FacebookEndpoint endpoint = new FacebookEndpoint(uri, this, 
remaining, config);
+        // set endpoint property inBody so that it's available in initState()
+        setProperties(endpoint, parameters);
+        return endpoint;
     }
 
     private FacebookEndpointConfiguration copyComponentProperties() throws 
Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConstants.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConstants.java
 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConstants.java
index e7f9f3d..7893396 100644
--- 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConstants.java
+++ 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConstants.java
@@ -33,4 +33,5 @@ public interface FacebookConstants {
     // date format used by Facebook Reading since and until fields
     String FACEBOOK_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
 
+    String RAW_JSON_HEADER = FACEBOOK_PROPERTY_PREFIX + "rawJSON";
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConsumer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConsumer.java
 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConsumer.java
index 459768e..0448a0e 100644
--- 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConsumer.java
+++ 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookConsumer.java
@@ -18,18 +18,8 @@ package org.apache.camel.component.facebook;
 
 import java.lang.reflect.Array;
 import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
-
-import facebook4j.Reading;
-
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.component.facebook.data.FacebookMethodsType;
@@ -41,6 +31,10 @@ import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import facebook4j.Facebook;
+import facebook4j.Reading;
+import facebook4j.json.DataObjectFactory;
+
 import static 
org.apache.camel.component.facebook.FacebookConstants.FACEBOOK_DATE_FORMAT;
 import static 
org.apache.camel.component.facebook.FacebookConstants.READING_PPROPERTY;
 import static 
org.apache.camel.component.facebook.FacebookConstants.READING_PREFIX;
@@ -133,8 +127,20 @@ public class FacebookConsumer extends 
ScheduledPollConsumer {
         // invoke the consumer method
         final Map<String, Object> args = getMethodArguments();
         try {
-            Object result = 
invokeMethod(endpoint.getConfiguration().getFacebook(),
-                method, args);
+            // also check whether we need to get raw JSON
+            String rawJSON = null;
+            Object result;
+            if (endpoint.getConfiguration().getJsonStoreEnabled() == null
+                || !endpoint.getConfiguration().getJsonStoreEnabled()) {
+                result = 
invokeMethod(endpoint.getConfiguration().getFacebook(),
+                    method, args);
+            } else {
+                final Facebook facebook = 
endpoint.getConfiguration().getFacebook();
+                synchronized (facebook) {
+                    result = invokeMethod(facebook, method, args);
+                    rawJSON = DataObjectFactory.getRawJSON(result);
+                }
+            }
 
             // process result according to type
             if (result != null && (result instanceof Collection || 
result.getClass().isArray())) {
@@ -142,11 +148,11 @@ public class FacebookConsumer extends 
ScheduledPollConsumer {
                 final Object array = getResultAsArray(result);
                 final int length = Array.getLength(array);
                 for (int i = 0; i < length; i++) {
-                    processResult(Array.get(array, i));
+                    processResult(Array.get(array, i), rawJSON);
                 }
                 return length;
             } else {
-                processResult(result);
+                processResult(result, rawJSON);
                 return 1; // number of messages polled
             }
         } catch (Throwable t) {
@@ -154,9 +160,12 @@ public class FacebookConsumer extends 
ScheduledPollConsumer {
         }
     }
 
-    private void processResult(Object result) throws Exception {
+    private void processResult(Object result, String rawJSON) throws Exception 
{
         Exchange exchange = endpoint.createExchange();
         exchange.getIn().setBody(result);
+        if (rawJSON != null) {
+            exchange.getIn().setHeader(FacebookConstants.RAW_JSON_HEADER, 
rawJSON);
+        }
         try {
             // send message to next processor in the route
             getProcessor().process(exchange);

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookEndpoint.java
 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookEndpoint.java
index 51eb324..02e9245 100644
--- 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookEndpoint.java
+++ 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookEndpoint.java
@@ -72,6 +72,10 @@ public class FacebookEndpoint extends DefaultEndpoint 
implements FacebookConstan
     }
 
     public Consumer createConsumer(Processor processor) throws Exception {
+        // make sure inBody is not set for consumers
+        if (inBody != null) {
+            throw new IllegalArgumentException("Option inBody is not supported 
for consumer endpoint");
+        }
         final FacebookConsumer consumer = new FacebookConsumer(this, 
processor);
         // also set consumer.* properties
         configureConsumer(consumer);
@@ -108,7 +112,12 @@ public class FacebookEndpoint extends DefaultEndpoint 
implements FacebookConstan
 
     private void initState() {
         // get endpoint property names
-        final Set<String> arguments = getEndpointPropertyNames(configuration);
+        final Set<String> arguments = new HashSet<String>();
+        arguments.addAll(getEndpointPropertyNames(configuration));
+        // add inBody argument for producers
+        if (inBody != null) {
+            arguments.add(inBody);
+        }
         final String[] argNames = arguments.toArray(new 
String[arguments.size()]);
 
         candidates = new ArrayList<FacebookMethodsType>();

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookProducer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookProducer.java
 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookProducer.java
index 15f1035..6a5d695 100644
--- 
a/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookProducer.java
+++ 
b/components/camel-facebook/src/main/java/org/apache/camel/component/facebook/FacebookProducer.java
@@ -35,9 +35,11 @@ import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import facebook4j.Facebook;
+import facebook4j.json.DataObjectFactory;
+
 import static 
org.apache.camel.component.facebook.data.FacebookMethodsTypeHelper.MatchType;
 import static 
org.apache.camel.component.facebook.data.FacebookMethodsTypeHelper.filterMethods;
-import static 
org.apache.camel.component.facebook.data.FacebookMethodsTypeHelper.getCandidateMethods;
 import static 
org.apache.camel.component.facebook.data.FacebookMethodsTypeHelper.getMissingProperties;
 import static 
org.apache.camel.component.facebook.data.FacebookPropertiesHelper.getEndpointProperties;
 import static 
org.apache.camel.component.facebook.data.FacebookPropertiesHelper.getExchangeProperties;
@@ -56,9 +58,6 @@ public class FacebookProducer extends DefaultAsyncProducer {
     public FacebookProducer(FacebookEndpoint endpoint) {
         super(endpoint);
         this.endpoint = endpoint;
-
-        // get candidate methods using endpoint configuration
-        getCandidateMethods(endpoint.getEndpointUri());
     }
 
     @Override
@@ -86,13 +85,31 @@ public class FacebookProducer extends DefaultAsyncProducer {
                         LOG.debug("Invoking method {} with {}", 
method.getName(), properties.keySet());
                     }
 
-                    Object result = FacebookMethodsTypeHelper.invokeMethod(
-                        endpoint.getConfiguration().getFacebook(), method, 
properties);
+                    // also check whether we need to get Raw JSON
+                    Object result;
+                    String rawJSON = null;
+                    if (endpoint.getConfiguration().getJsonStoreEnabled() == 
null
+                        || !endpoint.getConfiguration().getJsonStoreEnabled()) 
{
+                        result = FacebookMethodsTypeHelper.invokeMethod(
+                            endpoint.getConfiguration().getFacebook(), method, 
properties);
+                    } else {
+                        final Facebook facebook = 
endpoint.getConfiguration().getFacebook();
+                        // lock out the underlying Facebook object from other 
threads
+                        synchronized (facebook) {
+                            result = FacebookMethodsTypeHelper.invokeMethod(
+                                facebook, method, properties);
+                            rawJSON = DataObjectFactory.getRawJSON(result);
+                        }
+                    }
 
                     // producer returns a single response, even for methods 
with List return types
                     exchange.getOut().setBody(result);
                     // copy headers
                     
exchange.getOut().setHeaders(exchange.getIn().getHeaders());
+                    if (rawJSON != null) {
+                        
exchange.getOut().setHeader(FacebookConstants.FACEBOOK_PROPERTY_PREFIX + 
"rawJSON",
+                            rawJSON);
+                    }
 
                 } catch (Throwable t) {
                     
exchange.setException(ObjectHelper.wrapRuntimeCamelException(t));

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
 
b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
index b64832b..51ca80e 100644
--- 
a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
+++ 
b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentConsumerTest.java
@@ -26,7 +26,6 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 import facebook4j.api.SearchMethods;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.Test;
@@ -64,14 +63,25 @@ public class FacebookComponentConsumerTest extends 
CamelFacebookTestSupport {
         assertMockEndpointsSatisfied();
     }
 
+    @Test
+    public void testJsonStoreEnabled() throws Exception {
+        final MockEndpoint mock = getMockEndpoint("mock:testJsonStoreEnabled");
+        mock.expectedMinimumMessageCount(1);
+        mock.assertIsSatisfied();
+
+        final String rawJSON = 
mock.getExchanges().get(0).getIn().getHeader(FacebookConstants.RAW_JSON_HEADER, 
String.class);
+        assertNotNull("Null rawJSON", rawJSON);
+        assertFalse("Empty rawJSON", rawJSON.isEmpty());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
-            public void configure() {
+            public void configure() throws Exception {
 
-                // start with a 7 day window for the first delayed poll
-                String since = new 
SimpleDateFormat(FacebookConstants.FACEBOOK_DATE_FORMAT).format(
-                    new Date(System.currentTimeMillis() - 
TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)));
+                // start with a 30 day window for the first delayed poll
+                String since = "RAW(" + new 
SimpleDateFormat(FacebookConstants.FACEBOOK_DATE_FORMAT).format(
+                    new Date(System.currentTimeMillis() - 
TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS))) + ")";
 
                 for (String name : searchNames) {
                     if (!excludedNames.contains(name)) {
@@ -87,6 +97,9 @@ public class FacebookComponentConsumerTest extends 
CamelFacebookTestSupport {
                         .to("mock:consumeQueryResult" + name);
                 }
 
+                from("facebook://me?jsonStoreEnabled=true&" + getOauthParams())
+                    .to("mock:testJsonStoreEnabled");
+
                 // TODO add tests for the rest of the supported methods
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/271226c4/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
 
b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
index 21e4709..c9d9015 100644
--- 
a/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
+++ 
b/components/camel-facebook/src/test/java/org/apache/camel/component/facebook/FacebookComponentProducerTest.java
@@ -21,13 +21,12 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-
-import facebook4j.Facebook;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.Test;
 
+import facebook4j.Facebook;
+
 public class FacebookComponentProducerTest extends CamelFacebookTestSupport {
 
     private final Set<String> noArgNames = new HashSet<String>();
@@ -84,6 +83,13 @@ public class FacebookComponentProducerTest extends 
CamelFacebookTestSupport {
         assertMockEndpointsSatisfied();
     }
 
+    @Test
+    public void testJsonStoreEnabled() throws Exception {
+        final String rawJSON = 
template().requestBody("direct://testJsonStoreEnabled", new String[] { "me" }, 
String.class);
+        assertNotNull("NULL rawJSON", rawJSON);
+        assertFalse("Empty rawJSON", rawJSON.isEmpty());
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
@@ -120,6 +126,10 @@ public class FacebookComponentProducerTest extends 
CamelFacebookTestSupport {
                     }
                 }
 
+                from("direct://testJsonStoreEnabled")
+                    .to("facebook://users?inBody=ids&jsonStoreEnabled=true&" + 
getOauthParams())
+                    .setBody(simple("header." + 
FacebookConstants.RAW_JSON_HEADER));
+
                 // TODO add tests for the rest of the supported methods
             }
         };

Reply via email to