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" />

Reply via email to