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>