Repository: camel
Updated Branches:
  refs/heads/master d7339b2c5 -> 4496eea4f


http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerGetTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerGetTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerGetTest.java
new file mode 100644
index 0000000..9bf35dc
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerGetTest.java
@@ -0,0 +1,212 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.cache.Cache;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+import static org.hamcrest.Matchers.is;
+
+public class JCacheProducerGetTest extends JCacheComponentTestSupport {
+
+    @Test
+    public void testGet() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "GET");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:get", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:get");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+    }
+
+    @Test
+    public void testGetAndRemove() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "GETANDREMOVE");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:get-and-remove", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:get-and-remove");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertFalse(cache.containsKey(key));
+    }
+
+
+    @Test
+    public void testGetAndReplace() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key  = randomString();
+        final String val  = randomString();
+        final String val2 = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "GETANDREPLACE");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:get-and-replace", val2, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:get-and-replace");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val2, cache.get(key));
+    }
+
+    @Test
+    public void testGetAndPut() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key  = randomString();
+        final String val  = randomString();
+        final String val2 = randomString();
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "GETANDPUT");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:get-and-put", val2, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:get-and-put");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                return exchange.getIn().getBody() == null;
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val2, cache.get(key));
+    }
+
+    @Test
+    public void testGetAll() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        Map<Object, Object> values = new HashMap<>();
+        values.put(randomString(), randomString());
+        values.put(randomString(), randomString());
+
+        cache.putAll(values);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "GETALL");
+        headers.put(JCacheConstants.KEYS, values.keySet());
+
+        sendBody("direct:get-all", values, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:get-all");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEYS, values.keySet());
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                Map<Object, Object> values = 
exchange.getIn().getBody(Map.class);
+                assertThat(values, is(values));
+
+                return true;
+            }
+        });
+
+        mock.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:get")
+                    .to("jcache://test-cache")
+                        .to("mock:get");
+                from("direct:get-and-remove")
+                    .to("jcache://test-cache")
+                        .to("mock:get-and-remove");
+                from("direct:get-and-replace")
+                    .to("jcache://test-cache")
+                        .to("mock:get-and-replace");
+                from("direct:get-and-put")
+                    .to("jcache://test-cache")
+                        .to("mock:get-and-put");
+                from("direct:get-all")
+                    .to("jcache://test-cache")
+                        .to("mock:get-all");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerInvokeTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerInvokeTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerInvokeTest.java
new file mode 100644
index 0000000..724be28
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerInvokeTest.java
@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.cache.Cache;
+import javax.cache.processor.EntryProcessor;
+import javax.cache.processor.EntryProcessorException;
+import javax.cache.processor.EntryProcessorResult;
+import javax.cache.processor.MutableEntry;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class JCacheProducerInvokeTest extends JCacheComponentTestSupport {
+    private static final EntryProcessor<Object, Object, Object> 
ENTRY_PROCESSOR = new EntryProcessor<Object, Object, Object>() {
+        @Override
+        public Object process(MutableEntry<Object, Object> entry, Object... 
arguments) throws EntryProcessorException {
+            return "processor-" + entry.getValue();
+        }
+    };
+
+    @Test
+    public void testInvoke() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "INVOKE");
+        headers.put(JCacheConstants.KEY, key);
+        headers.put(JCacheConstants.ENTRY_PROCESSOR, ENTRY_PROCESSOR);
+
+        sendBody("direct:invoke", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:invoke");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                return 
exchange.getIn().getBody(String.class).equals("processor-" + val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val, cache.get(key));
+    }
+
+    @Test
+    public void testInvokeAll() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final Map<Object, Object> values1 = generateRandomMap(4);
+        final Map<Object, Object> values2 = generateRandomMap(2);
+
+        cache.putAll(values1);
+        cache.putAll(values2);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "INVOKE");
+        headers.put(JCacheConstants.KEYS, values2.keySet());
+        headers.put(JCacheConstants.ENTRY_PROCESSOR, ENTRY_PROCESSOR);
+
+        sendBody("direct:invoke-all", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:invoke-all");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEYS, values2.keySet());
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                Map<Object, EntryProcessorResult<Object>> map = 
exchange.getIn().getBody(Map.class);
+                for (Map.Entry<Object, Object> entry : values2.entrySet()) {
+                    assertTrue(map.containsKey(entry.getKey()));
+                    assertEquals("processor-" + entry.getValue(), 
map.get(entry.getKey()).get());
+                }
+
+                return true;
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        for (Map.Entry<Object, Object> entry : values1.entrySet()) {
+            assertTrue(cache.containsKey(entry.getKey()));
+            assertEquals(entry.getValue(), cache.get(entry.getKey()));
+        }
+
+        for (Map.Entry<Object, Object> entry : values2.entrySet()) {
+            assertTrue(cache.containsKey(entry.getKey()));
+            assertEquals(entry.getValue(), cache.get(entry.getKey()));
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:invoke")
+                    .to("jcache://test-cache")
+                        .to("mock:invoke");
+                from("direct:invoke-all")
+                    .to("jcache://test-cache")
+                        .to("mock:invoke-all");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerPutTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerPutTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerPutTest.java
new file mode 100644
index 0000000..2db9e03
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerPutTest.java
@@ -0,0 +1,160 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.cache.Cache;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class JCacheProducerPutTest extends JCacheComponentTestSupport {
+
+    @Test
+    public void testPut() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "PUT");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:put", val, headers);
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val, cache.get(key));
+    }
+
+    @Test
+    public void testPutWithDefaultAction() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache?action=PUT");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        headers.clear();
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:put-with-default-action", val, headers);
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val, cache.get(key));
+    }
+
+    @Test
+    public void testPutIfAbsent() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "PUTIFABSENT");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:put-if-absent", val, headers);
+
+        assertTrue(cache.containsKey(key));
+        assertEquals(val, cache.get(key));
+
+        MockEndpoint mock = getMockEndpoint("mock:put-if-absent");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, true);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+    }
+
+    @Test
+    public void testPutIfAbsentFailure() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "PUTIFABSENT");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:put-if-absent", val, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:put-if-absent");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, false);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+    }
+
+    @Test
+    public void testPutAll() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        Map<Object, Object> values = generateRandomMap(2);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "PUTALL");
+        headers.put(JCacheConstants.KEY, values);
+
+        sendBody("direct:put", values, headers);
+
+        for (Map.Entry<Object, Object> entry : values.entrySet()) {
+            assertTrue(cache.containsKey(entry.getKey()));
+            assertEquals(entry.getValue(), cache.get(entry.getKey()));
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:put")
+                    .to("jcache://test-cache");
+                from("direct:put-with-default-action")
+                    .to("jcache://test-cache?action=PUT");
+                from("direct:put-if-absent")
+                    .to("jcache://test-cache")
+                        .to("mock:put-if-absent");
+                from("direct:put-all")
+                    .to("jcache://test-cache");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerRemoveTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerRemoveTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerRemoveTest.java
new file mode 100644
index 0000000..a343176
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerRemoveTest.java
@@ -0,0 +1,165 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.cache.Cache;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class JCacheProducerRemoveTest extends JCacheComponentTestSupport {
+
+    @Test
+    public void testRemove() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REMOVE");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:remove", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:remove");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, true);
+        mock.assertIsSatisfied();
+
+        assertFalse(cache.containsKey(key));
+    }
+
+    @Test
+    public void testRemoveIf() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REMOVE");
+        headers.put(JCacheConstants.KEY, key);
+        headers.put(JCacheConstants.OLD_VALUE, val);
+        sendBody("direct:remove-if", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:remove-if");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, true);
+        mock.assertIsSatisfied();
+
+        assertFalse(cache.containsKey(key));
+    }
+
+    @Test
+    public void testRemoveIfFailure() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REMOVE");
+        headers.put(JCacheConstants.KEY, key);
+        headers.put(JCacheConstants.OLD_VALUE, "x");
+        sendBody("direct:remove-if-failure", null, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:remove-if-failure");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, false);
+        mock.assertIsSatisfied();
+
+        assertTrue(cache.containsKey(key));
+    }
+
+    @Test
+    public void testRemoveAll() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        Map<Object, Object> values = generateRandomMap(2);
+        cache.putAll(values);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REMOVEALL");
+        sendBody("direct:remove-all", null, headers);
+
+        for (Object key : values.keySet()) {
+            assertFalse(cache.containsKey(key));
+        }
+    }
+
+    @Test
+    public void testRemoveSubset() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        Map<Object, Object> values1 = generateRandomMap(4);
+        Map<Object, Object> values2 = generateRandomMap(2);
+
+        cache.putAll(values1);
+        cache.putAll(values2);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REMOVEALL");
+        headers.put(JCacheConstants.KEYS, values2.keySet());
+        sendBody("direct:remove-subset", null, headers);
+
+        for (Object key : values1.keySet()) {
+            assertTrue(cache.containsKey(key));
+        }
+
+        for (Object key : values2.keySet()) {
+            assertFalse(cache.containsKey(key));
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:remove")
+                    .to("jcache://test-cache")
+                        .to("mock:remove");
+                from("direct:remove-if")
+                    .to("jcache://test-cache")
+                        .to("mock:remove-if");
+                from("direct:remove-if-failure")
+                    .to("jcache://test-cache")
+                        .to("mock:remove-if-failure");
+                from("direct:remove-all")
+                    .to("jcache://test-cache");
+                from("direct:remove-subset")
+                    .to("jcache://test-cache");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerReplaceTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerReplaceTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerReplaceTest.java
new file mode 100644
index 0000000..c74b675
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/JCacheProducerReplaceTest.java
@@ -0,0 +1,176 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.cache.Cache;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class JCacheProducerReplaceTest extends JCacheComponentTestSupport {
+    @Test
+    public void testReplace() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key  = randomString();
+        final String val  = randomString();
+        final String val1 = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REPLACE");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:replace", val1, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:replace");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, true);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val1);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertEquals(val1, cache.get(key));
+    }
+
+    @Test
+    public void testReplaceIf() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key  = randomString();
+        final String val  = randomString();
+        final String val1 = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REPLACE");
+        headers.put(JCacheConstants.KEY, key);
+        headers.put(JCacheConstants.OLD_VALUE, val);
+        sendBody("direct:replace", val1, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:replace");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, true);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val1);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertEquals(val1, cache.get(key));
+    }
+
+    @Test
+    public void testReplaceIfFailure() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key  = randomString();
+        final String val  = randomString();
+        final String val1 = randomString();
+
+        cache.put(key, val);
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REPLACE");
+        headers.put(JCacheConstants.KEY, key);
+        headers.put(JCacheConstants.OLD_VALUE, val1);
+        sendBody("direct:replace", val1, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:replace");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, false);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val1);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertEquals(val, cache.get(key));
+    }
+
+    @Test
+    public void testReplaceFail() throws Exception {
+        final Map<String, Object> headers = new HashMap<>();
+        final Cache<Object, Object> cache = 
getCacheFromEndpoint("jcache://test-cache");
+
+        final String key = randomString();
+        final String val = randomString();
+
+        assertFalse(cache.containsKey(key));
+
+        headers.clear();
+        headers.put(JCacheConstants.ACTION, "REPLACE");
+        headers.put(JCacheConstants.KEY, key);
+        sendBody("direct:replace-fail", val, headers);
+
+        MockEndpoint mock = getMockEndpoint("mock:replace-fail");
+        mock.expectedMinimumMessageCount(1);
+        mock.expectedHeaderReceived(JCacheConstants.KEY, key);
+        mock.expectedHeaderReceived(JCacheConstants.RESULT, false);
+        mock.expectedMessagesMatches(new Predicate() {
+            @Override
+            public boolean matches(Exchange exchange) {
+                assertNotNull("body", exchange.getIn().getBody());
+                return exchange.getIn().getBody().equals(val);
+            }
+        });
+
+        mock.assertIsSatisfied();
+
+        assertFalse(cache.containsKey(key));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:replace")
+                    .to("jcache://test-cache")
+                        .to("mock:replace");
+                from("direct:replace-fail")
+                    .to("jcache://test-cache")
+                        .to("mock:replace-fail");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryRoutesTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryRoutesTest.java
new file mode 100644
index 0000000..83bc331
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryRoutesTest.java
@@ -0,0 +1,106 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache.processor.aggregate;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+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.processor.aggregate.AggregationStrategy;
+import org.junit.Test;
+
+
+public class JCacheAggregationRepositoryRoutesTest extends 
JCacheAggregationRepositoryTestSupport {
+
+    private static final String MOCK_GOTCHA = "mock:gotcha";
+    private static final String DIRECT_ONE = "direct:one";
+    private static final String DIRECT_TWO = "direct:two";
+
+    @EndpointInject(uri = MOCK_GOTCHA)
+    private MockEndpoint mock;
+
+    @Produce(uri = DIRECT_ONE)
+    private ProducerTemplate produceOne;
+
+    @Produce(uri = DIRECT_TWO)
+    private ProducerTemplate produceTwo;
+
+    @Test
+    public void checkAggregationFromTwoRoutes() throws Exception {
+        final JCacheAggregationRepository repoOne = createRepository(false);
+        final JCacheAggregationRepository repoTwo = createRepository(false);
+
+        final int completionSize = 4;
+        final String correlator = "CORRELATOR";
+        RouteBuilder rbOne = new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from(DIRECT_ONE).routeId("AggregatingRouteOne")
+                    .aggregate(header(correlator))
+                    .aggregationRepository(repoOne)
+                    .aggregationStrategy(new MyAggregationStrategy())
+                    .completionSize(completionSize)
+                    .to(MOCK_GOTCHA);
+            }
+        };
+
+        RouteBuilder rbTwo = new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from(DIRECT_TWO).routeId("AggregatingRouteTwo")
+                    .aggregate(header(correlator))
+                    .aggregationRepository(repoTwo)
+                    .aggregationStrategy(new MyAggregationStrategy())
+                    .completionSize(completionSize)
+                    .to(MOCK_GOTCHA);
+            }
+        };
+
+        context().addRoutes(rbOne);
+        context().addRoutes(rbTwo);
+        context().start();
+
+        mock.expectedMessageCount(1);
+        mock.expectedBodiesReceived(1 + 2 + 3 + 4);
+
+        produceOne.sendBodyAndHeader(1, correlator, correlator);
+        produceTwo.sendBodyAndHeader(2, correlator, correlator);
+        produceOne.sendBodyAndHeader(3, correlator, correlator);
+        produceOne.sendBodyAndHeader(4, correlator, correlator);
+
+        mock.assertIsSatisfied();
+    }
+
+    private class MyAggregationStrategy implements AggregationStrategy {
+        @Override
+        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+            if (oldExchange == null) {
+                return newExchange;
+            } else {
+                Integer n = newExchange.getIn().getBody(Integer.class);
+                Integer o = oldExchange.getIn().getBody(Integer.class);
+                Integer v = (o == null ? 0 : o) + (n == null ? 0 : n);
+
+                oldExchange.getIn().setBody(v, Integer.class);
+
+                return oldExchange;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTest.java
new file mode 100644
index 0000000..5d8cdb4
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTest.java
@@ -0,0 +1,154 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache.processor.aggregate;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultExchange;
+import org.junit.Test;
+
+
+public class JCacheAggregationRepositoryTest extends 
JCacheAggregationRepositoryTestSupport {
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void nonOptimisticRepoFailsOnOptimisticAdd() throws Exception {
+        JCacheAggregationRepository repo = createRepository(false);
+        repo.start();
+
+        try {
+            Exchange oldOne = new DefaultExchange(context());
+            Exchange newOne = new DefaultExchange(context());
+            repo.add(context(), "myKey", oldOne, newOne);
+
+            fail("OptimisticLockingException should has been thrown");
+        } finally {
+            repo.stop();
+        }
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void optimisticRepoFailsForNonOptimisticAdd() throws Exception {
+        JCacheAggregationRepository repo = createRepository(true);
+        repo.start();
+
+        try {
+            Exchange ex = new DefaultExchange(context());
+            repo.add(context(), "myKey", ex);
+        } finally {
+            repo.stop();
+        }
+    }
+
+    @Test
+    public void checkOptimisticAddOfNewExchange() throws Exception {
+        JCacheAggregationRepository repoOne = createRepository(true);
+        JCacheAggregationRepository repoTwo = createRepository(true);
+
+        repoOne.start();
+        repoTwo.start();
+
+        try {
+            final String testBody = "This is an optimistic test body. 
Sincerely yours, Captain Obvious.";
+            final String key = "optimisticKey";
+            Exchange newEx = createExchangeWithBody(testBody);
+            Exchange oldEx = repoOne.add(context(), key, null, newEx);
+
+            assertNull("Old exchange should be null.", oldEx);
+
+            final String theNewestBody = "This is the newest test body.";
+            Exchange theNewestEx = createExchangeWithBody(theNewestBody);
+
+            oldEx = repoTwo.add(context(), key, newEx, theNewestEx);
+            assertEquals(newEx.getIn().getBody(), oldEx.getIn().getBody());
+        } finally {
+            repoOne.stop();
+            repoTwo.stop();
+        }
+    }
+
+    @Test
+    public void checkThreadSafeAddOfNewExchange() throws Exception {
+        JCacheAggregationRepository repoOne = createRepository(false);
+        JCacheAggregationRepository repoTwo = createRepository(false);
+
+        repoOne.start();
+        repoTwo.start();
+
+        try {
+            final String testBody = "This is a thread-safe test body. 
Sincerely yours, Captain Obvious.";
+            final String key = "threadSafeKey";
+            Exchange newEx = createExchangeWithBody(testBody);
+            Exchange oldEx = repoOne.add(context(), key, newEx);
+
+            assertNull("Old exchange should be null.", oldEx);
+
+            final String theNewestBody = "This is the newest test body.";
+            Exchange theNewestEx = createExchangeWithBody(theNewestBody);
+
+            oldEx = repoTwo.add(context(), key, theNewestEx);
+            assertEquals(newEx.getIn().getBody(), oldEx.getIn().getBody());
+        } finally {
+            repoOne.stop();
+            repoTwo.stop();
+        }
+    }
+
+    @Test
+    public void checkOptimisticGet() throws Exception {
+        JCacheAggregationRepository repoOne = createRepository(true);
+        JCacheAggregationRepository repoTwo = createRepository(true);
+
+        repoOne.start();
+        repoTwo.start();
+
+        try {
+            final String testBody = "This is an optimistic test body. 
Sincerely yours, Captain Obvious.";
+            final String key = "optimisticKey";
+
+            Exchange ex = createExchangeWithBody(testBody);
+            repoOne.add(context(), key, null, ex);
+
+            Exchange gotEx = repoTwo.get(context(), key);
+            assertEquals("ex and gotEx should be equal", 
gotEx.getIn().getBody(), ex.getIn().getBody());
+        } finally {
+            repoOne.stop();
+            repoTwo.stop();
+        }
+    }
+
+    @Test
+    public void checkThreadSafeGet() throws Exception {
+        JCacheAggregationRepository repoOne = createRepository(false);
+        JCacheAggregationRepository repoTwo = createRepository(false);
+
+        repoOne.start();
+        repoTwo.start();
+
+        try {
+            final String testBody = "This is a thread-safe test body. 
Sincerely yours, Captain Obvious.";
+            final String key = "threadSafeKey";
+
+            Exchange ex = createExchangeWithBody(testBody);
+            repoOne.add(context(), key, ex);
+
+            Exchange gotEx = repoTwo.get(context(), key);
+            assertEquals("ex and gotEx should be equal", 
gotEx.getIn().getBody(), ex.getIn().getBody());
+        } finally {
+            repoOne.stop();
+            repoTwo.stop();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTestSupport.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTestSupport.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTestSupport.java
new file mode 100644
index 0000000..c4bc2a4
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/aggregate/JCacheAggregationRepositoryTestSupport.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache.processor.aggregate;
+
+import org.apache.camel.component.jcache.JCacheConfiguration;
+import org.apache.camel.test.junit4.CamelTestSupport;
+
+class JCacheAggregationRepositoryTestSupport extends CamelTestSupport {
+
+    protected JCacheAggregationRepository createRepository(boolean optimistic) 
throws Exception {
+        JCacheAggregationRepository repository = new 
JCacheAggregationRepository();
+        repository.setConfiguration(new JCacheConfiguration());
+        repository.setCacheName("aggregation-repository");
+        repository.setOptimistic(optimistic);
+
+        return repository;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryTest.java
 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryTest.java
new file mode 100644
index 0000000..0235654
--- /dev/null
+++ 
b/components/camel-jcache/src/test/java/org/apache/camel/component/jcache/processor/idempotent/JCacheIdempotentRepositoryTest.java
@@ -0,0 +1,104 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jcache.processor.idempotent;
+
+import javax.cache.Cache;
+
+import org.apache.camel.component.jcache.JCacheConfiguration;
+import org.apache.camel.component.jcache.JCacheManager;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class JCacheIdempotentRepositoryTest extends CamelTestSupport {
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(JCacheIdempotentRepositoryTest.class);
+
+    private JCacheManager<Object, Boolean> cacheManager;
+    private Cache<Object, Boolean> cache;
+    private JCacheIdempotentRepository repository;
+
+    @Before
+    public void setUp() throws Exception {
+        cacheManager = new JCacheManager<>(new JCacheConfiguration(), 
"idempotent-repository");
+        cache = cacheManager.getCache();
+
+        repository = new JCacheIdempotentRepository();
+        repository.setCache(cache);
+        repository.start();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        repository.stop();
+        cacheManager.close();
+    }
+
+    @Test
+    public void addsNewKeysToCache() throws Exception {
+        assertTrue(repository.add("One"));
+        assertTrue(repository.add("Two"));
+
+        assertTrue(cache.containsKey("One"));
+        assertTrue(cache.containsKey("Two"));
+    }
+
+    @Test
+    public void skipsAddingSecondTimeTheSameKey() throws Exception {
+        assertTrue(repository.add("One"));
+        assertFalse(repository.add("One"));
+    }
+
+    @Test
+    public void containsPreviouslyAddedKey() throws Exception {
+        assertFalse(repository.contains("One"));
+        repository.add("One");
+        assertTrue(repository.contains("One"));
+    }
+
+    @Test
+    public void removesAnExistingKey() throws Exception {
+        cache.clear();
+
+        repository.add("One");
+
+        assertTrue(repository.remove("One"));
+        assertFalse(repository.contains("One"));
+    }
+
+    @Test
+    public void doesNotRemoveMissingKey() throws Exception {
+        assertFalse(repository.remove("One"));
+    }
+    
+    @Test
+    public void clearCache() throws Exception {
+        assertTrue(repository.add("One"));
+        assertTrue(repository.add("Two"));
+
+        assertTrue(cache.containsKey("One"));
+        assertTrue(cache.containsKey("Two"));
+        
+        repository.clear();
+        
+        assertFalse(cache.containsKey("One"));
+        assertFalse(cache.containsKey("Two"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/camel-jcache/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-jcache/src/test/resources/log4j.properties 
b/components/camel-jcache/src/test/resources/log4j.properties
new file mode 100644
index 0000000..6290fb2
--- /dev/null
+++ b/components/camel-jcache/src/test/resources/log4j.properties
@@ -0,0 +1,35 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#
+# The logging properties used during tests..
+#
+#log4j.rootLogger=INFO, file
+
+log4j.rootLogger=INFO, file
+#log4j.logger.org.apache.camel.component.jcache=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d %-5p %c{1} - %m %n
+
+# File appender
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d %-5p %c{1} - %m %n
+log4j.appender.file.file=target/camel-beanio-test.log

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/components/pom.xml
----------------------------------------------------------------------
diff --git a/components/pom.xml b/components/pom.xml
index 291da33..1e762a1 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -134,6 +134,7 @@
     <module>camel-jaxb</module>
     <module>camel-jasypt</module>
     <module>camel-jbpm</module>
+    <module>camel-jcache</module>
     <module>camel-jclouds</module>
     <module>camel-jcr</module>
     <module>camel-jdbc</module>

http://git-wip-us.apache.org/repos/asf/camel/blob/4496eea4/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 7a19987..acb8cec 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -281,6 +281,7 @@
     <jboss-logging-version>3.3.0.Final</jboss-logging-version>
     <jboss-marshalling-version>1.4.10.Final</jboss-marshalling-version>
     <jboss-xnio-version>3.3.4.Final</jboss-xnio-version>
+    <jcache-bundle-version>1.0.0_1</jcache-bundle-version>
     <jclouds-version>1.9.2</jclouds-version>
     <!-- jclouds must use this guava version -->
     <jclouds-google-guava-version>16.0.1</jclouds-google-guava-version>

Reply via email to