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