Repository: camel Updated Branches: refs/heads/master e451fd6ab -> 75745c5a6
CAMEL-8872 Camel-Hazelcast: Add new operations to HazelcastAtomicNumber producer, add compareAndSet Operation Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/68c62b68 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/68c62b68 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/68c62b68 Branch: refs/heads/master Commit: 68c62b6852f4f99538090f74d81e791638a2119a Parents: e451fd6 Author: Andrea Cosentino <anco...@gmail.com> Authored: Mon Jun 15 14:01:26 2015 +0200 Committer: Andrea Cosentino <anco...@gmail.com> Committed: Mon Jun 15 17:29:41 2015 +0200 ---------------------------------------------------------------------- .../hazelcast/HazelcastComponentHelper.java | 1 + .../component/hazelcast/HazelcastConstants.java | 2 ++ .../HazelcastAtomicnumberProducer.java | 24 ++++++++++++++++++++ ...elcastAtomicnumberProducerForSpringTest.java | 20 ++++++++++++++++ .../HazelcastAtomicnumberProducerTest.java | 24 ++++++++++++++++++++ .../spring/test-camel-context-atomicnumber.xml | 8 +++++++ 6 files changed, 79 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastComponentHelper.java ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastComponentHelper.java b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastComponentHelper.java index 448bc56..cad9f64 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastComponentHelper.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastComponentHelper.java @@ -110,6 +110,7 @@ public final class HazelcastComponentHelper { addMapping("decrement", HazelcastConstants.DECREMENT_OPERATION); addMapping("setvalue", HazelcastConstants.SETVALUE_OPERATION); addMapping("destroy", HazelcastConstants.DESTROY_OPERATION); + addMapping("compareAndSet", HazelcastConstants.COMPARE_AND_SET_OPERATION); // queue addMapping("add", HazelcastConstants.ADD_OPERATION); http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastConstants.java ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastConstants.java b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastConstants.java index 11c775e..a8f15c3 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastConstants.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/HazelcastConstants.java @@ -40,6 +40,7 @@ public final class HazelcastConstants { public static final String TTL_VALUE = "CamelHazelcastObjectTtlValue"; public static final String TTL_UNIT = "CamelHazelcastObjectTtlUnit"; public static final String QUERY = "CamelHazelcastQuery"; + public static final String EXPECTED_VALUE = "CamelHazelcastExpectedValue"; /* * outgoing header properties @@ -77,6 +78,7 @@ public final class HazelcastConstants { public static final int DECREMENT_OPERATION = 21; public static final int SETVALUE_OPERATION = 22; public static final int DESTROY_OPERATION = 23; + public static final int COMPARE_AND_SET_OPERATION = 24; // queue public static final int ADD_OPERATION = 31; http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/atomicnumber/HazelcastAtomicnumberProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/atomicnumber/HazelcastAtomicnumberProducer.java b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/atomicnumber/HazelcastAtomicnumberProducer.java index 08ee1d1..a4827ee 100644 --- a/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/atomicnumber/HazelcastAtomicnumberProducer.java +++ b/components/camel-hazelcast/src/main/java/org/apache/camel/component/hazelcast/atomicnumber/HazelcastAtomicnumberProducer.java @@ -16,13 +16,17 @@ */ package org.apache.camel.component.hazelcast.atomicnumber; +import java.util.Map; + import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IAtomicLong; + import org.apache.camel.Exchange; import org.apache.camel.component.hazelcast.HazelcastComponentHelper; import org.apache.camel.component.hazelcast.HazelcastConstants; import org.apache.camel.component.hazelcast.HazelcastDefaultEndpoint; import org.apache.camel.component.hazelcast.HazelcastDefaultProducer; +import org.apache.camel.util.ObjectHelper; public class HazelcastAtomicnumberProducer extends HazelcastDefaultProducer { @@ -35,6 +39,14 @@ public class HazelcastAtomicnumberProducer extends HazelcastDefaultProducer { public void process(Exchange exchange) throws Exception { + Map<String, Object> headers = exchange.getIn().getHeaders(); + + long expectedValue = 0L; + + if (headers.containsKey(HazelcastConstants.EXPECTED_VALUE)) { + expectedValue = (long) headers.get(HazelcastConstants.EXPECTED_VALUE); + } + int operation = lookupOperationNumber(exchange); switch (operation) { @@ -46,6 +58,10 @@ public class HazelcastAtomicnumberProducer extends HazelcastDefaultProducer { case HazelcastConstants.DECREMENT_OPERATION: this.decrement(exchange); break; + + case HazelcastConstants.COMPARE_AND_SET_OPERATION: + this.compare(expectedValue, exchange); + break; case HazelcastConstants.SETVALUE_OPERATION: this.set(exchange); @@ -78,6 +94,14 @@ public class HazelcastAtomicnumberProducer extends HazelcastDefaultProducer { private void decrement(Exchange exchange) { exchange.getOut().setBody(this.atomicnumber.decrementAndGet()); } + + private void compare(long expected, Exchange exchange) { + long update = exchange.getIn().getBody(Long.class); + if (ObjectHelper.isEmpty(expected)) { + throw new IllegalArgumentException("Expected value must be specified"); + } + exchange.getOut().setBody(this.atomicnumber.compareAndSet(expected, update)); + } private void set(Exchange exchange) { this.atomicnumber.set(exchange.getIn().getBody(Long.class)); http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerForSpringTest.java ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerForSpringTest.java b/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerForSpringTest.java index deb35e2..3f7105d 100644 --- a/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerForSpringTest.java +++ b/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerForSpringTest.java @@ -16,8 +16,12 @@ */ package org.apache.camel.component.hazelcast; +import java.util.HashMap; +import java.util.Map; + import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IAtomicLong; + import org.junit.After; import org.junit.Test; import org.mockito.Mock; @@ -89,5 +93,21 @@ public class HazelcastAtomicnumberProducerForSpringTest extends HazelcastCamelSp template.sendBody("direct:destroy", null); verify(atomicNumber).destroy(); } + + @Test + public void testCompareAndSet() { + Map<String, Object> headersOk = new HashMap(); + headersOk.put(HazelcastConstants.EXPECTED_VALUE, 1234L); + when(atomicNumber.compareAndSet(1234L, 1235L)).thenReturn(true); + when(atomicNumber.compareAndSet(1233L, 1235L)).thenReturn(false); + boolean result = template.requestBodyAndHeaders("direct:compareAndSet", 1235L, headersOk, Boolean.class); + verify(atomicNumber).compareAndSet(1234L, 1235L); + assertEquals(true, result); + Map<String, Object> headersKo = new HashMap(); + headersKo.put(HazelcastConstants.EXPECTED_VALUE, 1233L); + result = template.requestBodyAndHeaders("direct:compareAndSet", 1235L, headersKo, Boolean.class); + verify(atomicNumber).compareAndSet(1233L, 1235L); + assertEquals(false, result); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerTest.java b/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerTest.java index 6768e66..a7bf3ad 100644 --- a/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerTest.java +++ b/components/camel-hazelcast/src/test/java/org/apache/camel/component/hazelcast/HazelcastAtomicnumberProducerTest.java @@ -16,13 +16,18 @@ */ package org.apache.camel.component.hazelcast; +import java.util.HashMap; +import java.util.Map; + import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IAtomicLong; + import org.apache.camel.CamelExecutionException; import org.apache.camel.builder.RouteBuilder; import org.junit.After; import org.junit.Test; import org.mockito.Mock; + import static org.mockito.Mockito.*; public class HazelcastAtomicnumberProducerTest extends HazelcastCamelTestSupport { @@ -97,6 +102,22 @@ public class HazelcastAtomicnumberProducerTest extends HazelcastCamelTestSupport template.sendBody("direct:setWithOperationName", 5711); verify(atomicNumber).set(5711); } + + @Test + public void testCompareAndSet() { + Map<String, Object> headersOk = new HashMap(); + headersOk.put(HazelcastConstants.EXPECTED_VALUE, 1234L); + when(atomicNumber.compareAndSet(1234L, 1235L)).thenReturn(true); + when(atomicNumber.compareAndSet(1233L, 1235L)).thenReturn(false); + boolean result = template.requestBodyAndHeaders("direct:compareAndSet", 1235L, headersOk, Boolean.class); + verify(atomicNumber).compareAndSet(1234L, 1235L); + assertEquals(true, result); + Map<String, Object> headersKo = new HashMap(); + headersKo.put(HazelcastConstants.EXPECTED_VALUE, 1233L); + result = template.requestBodyAndHeaders("direct:compareAndSet", 1235L, headersKo, Boolean.class); + verify(atomicNumber).compareAndSet(1233L, 1235L); + assertEquals(false, result); + } @Override protected RouteBuilder createRouteBuilder() throws Exception { @@ -120,6 +141,9 @@ public class HazelcastAtomicnumberProducerTest extends HazelcastCamelTestSupport from("direct:destroy").setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.DESTROY_OPERATION)).to( String.format("hazelcast:%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX)); + + from("direct:compareAndSet").setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.COMPARE_AND_SET_OPERATION)).to( + String.format("hazelcast:%sfoo", HazelcastConstants.ATOMICNUMBER_PREFIX)); from("direct:setWithOperationNumber").toF("hazelcast:%sfoo?operation=%s", HazelcastConstants.ATOMICNUMBER_PREFIX, HazelcastConstants.SETVALUE_OPERATION); from("direct:setWithOperationName").toF("hazelcast:%sfoo?operation=setvalue", HazelcastConstants.ATOMICNUMBER_PREFIX); http://git-wip-us.apache.org/repos/asf/camel/blob/68c62b68/components/camel-hazelcast/src/test/resources/META-INF/spring/test-camel-context-atomicnumber.xml ---------------------------------------------------------------------- diff --git a/components/camel-hazelcast/src/test/resources/META-INF/spring/test-camel-context-atomicnumber.xml b/components/camel-hazelcast/src/test/resources/META-INF/spring/test-camel-context-atomicnumber.xml index 9206648..949d808 100644 --- a/components/camel-hazelcast/src/test/resources/META-INF/spring/test-camel-context-atomicnumber.xml +++ b/components/camel-hazelcast/src/test/resources/META-INF/spring/test-camel-context-atomicnumber.xml @@ -54,6 +54,14 @@ </setHeader> <to uri="hazelcast:atomicvalue:foo" /> </route> + + <route> + <from uri="direct:compareAndSet" /> + <setHeader headerName="CamelHazelcastOperationType"> + <constant>compareAndSet</constant> + </setHeader> + <to uri="hazelcast:atomicvalue:foo" /> + </route> <route> <from uri="direct:destroy" />