You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bi...@apache.org on 2013/09/11 13:30:03 UTC

git commit: New Infinispan component. It is still alpha, not supposed to be released yet

Updated Branches:
  refs/heads/master 5fdb8b00d -> 6726d0429


New Infinispan component. It is still alpha, not supposed to be released yet


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6726d042
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6726d042
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6726d042

Branch: refs/heads/master
Commit: 6726d04298d26c07036b5b5ca87716768beff4ca
Parents: 5fdb8b0
Author: Bilgin Ibryam <bi...@apache.org>
Authored: Wed Sep 11 12:29:32 2013 +0100
Committer: Bilgin Ibryam <bi...@apache.org>
Committed: Wed Sep 11 12:29:32 2013 +0100

----------------------------------------------------------------------
 components/camel-infinispan/pom.xml             |  62 ++++++++++
 .../InfinispanAsyncEventListener.java           |  13 +++
 .../infinispan/InfinispanComponent.java         |  16 +++
 .../infinispan/InfinispanConfiguration.java     |  68 +++++++++++
 .../infinispan/InfinispanConstants.java         |  15 +++
 .../infinispan/InfinispanConsumer.java          |  65 +++++++++++
 .../infinispan/InfinispanEndpoint.java          |  35 ++++++
 .../infinispan/InfinispanOperation.java         |  74 ++++++++++++
 .../infinispan/InfinispanProducer.java          |  53 +++++++++
 .../infinispan/InfinispanSyncEventListener.java |  45 ++++++++
 .../InfinispanIdempotentRepository.java         |  92 +++++++++++++++
 .../org/apache/camel/component/infinispan       |   1 +
 .../src/main/resources/log4j.properties         |  16 +++
 .../infinispan/InfinispanComponentTest.java     |  48 ++++++++
 .../infinispan/InfinispanConsumerTest.java      |  41 +++++++
 .../infinispan/InfinispanProducerTest.java      | 115 +++++++++++++++++++
 .../InfinispanRemoteProducerTest.java           |  35 ++++++
 .../infinispan/InfinispanSyncConsumerTest.java  |  38 ++++++
 .../infinispan/InfinispanTestSupport.java       |  40 +++++++
 ...finispanDefaultIdempotentRepositoryTest.java |  25 ++++
 .../InfinispanIdempotentRepositoryTest.java     |  74 ++++++++++++
 components/pom.xml                              |   1 +
 parent/pom.xml                                  |   1 +
 23 files changed, 973 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/pom.xml b/components/camel-infinispan/pom.xml
new file mode 100644
index 0000000..fe9318e
--- /dev/null
+++ b/components/camel-infinispan/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>2.13-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-infinispan</artifactId>
+    <packaging>bundle</packaging>
+    <name>Camel-Infinispan Component</name>
+    <description>Camel Infinispan support</description>
+
+    <properties>
+        <camel.osgi.export.pkg>org.apache.camel.component.infinispan.*</camel.osgi.export.pkg>
+        <camel.osgi.export.service>org.apache.camel.spi.ComponentResolver;component=infinispan</camel.osgi.export.service>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.infinispan</groupId>
+            <artifactId>infinispan-core</artifactId>
+            <version>${infinispan-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.infinispan</groupId>
+            <artifactId>infinispan-client-hotrod</artifactId>
+            <version>${infinispan-version}</version>
+        </dependency>
+
+        <!-- testing -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>${mockito-version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanAsyncEventListener.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanAsyncEventListener.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanAsyncEventListener.java
new file mode 100644
index 0000000..28a4786
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanAsyncEventListener.java
@@ -0,0 +1,13 @@
+package org.apache.camel.component.infinispan;
+
+import java.util.Set;
+
+import org.infinispan.notifications.Listener;
+
+@Listener(sync = false)
+public class InfinispanAsyncEventListener extends InfinispanSyncEventListener {
+
+    public InfinispanAsyncEventListener(InfinispanConsumer consumer, Set<String> eventTypes) {
+        super(consumer, eventTypes);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanComponent.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanComponent.java
new file mode 100644
index 0000000..b065d3d
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanComponent.java
@@ -0,0 +1,16 @@
+package org.apache.camel.component.infinispan;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+public class InfinispanComponent extends DefaultComponent {
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        InfinispanConfiguration configuration = new InfinispanConfiguration();
+        configuration.setHost(remaining);
+        setProperties(configuration, parameters);
+        return new InfinispanEndpoint(uri, this, configuration);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConfiguration.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConfiguration.java
new file mode 100644
index 0000000..d6ed97f
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConfiguration.java
@@ -0,0 +1,68 @@
+package org.apache.camel.component.infinispan;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.infinispan.commons.api.BasicCacheContainer;
+
+public class InfinispanConfiguration {
+    private BasicCacheContainer cacheContainer;
+    private String caseName;
+    private String host;
+    private String command;
+    private boolean sync = true;
+    private Set<String> eventTypes;
+
+    public String getCommand() {
+        return command;
+    }
+
+    public void setCommand(String command) {
+        this.command = command;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public BasicCacheContainer getCacheContainer() {
+        return cacheContainer;
+    }
+
+    public void setCacheContainer(BasicCacheContainer cacheContainer) {
+        this.cacheContainer = cacheContainer;
+    }
+
+    public String getCasheName() {
+        return caseName;
+    }
+
+    public void setCaseName(String caseName) {
+        this.caseName = caseName;
+    }
+
+    public boolean isSync() {
+        return sync;
+    }
+
+    public void setSync(boolean sync) {
+        this.sync = sync;
+    }
+
+    public Set<String> getEventTypes() {
+        return eventTypes;
+    }
+
+    public void setEventTypes(Set<String> eventTypes) {
+        this.eventTypes = eventTypes;
+    }
+
+    public void setEventTypes(String eventTypes) {
+        this.eventTypes = new HashSet<String>(Arrays.asList(eventTypes.split(",")));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java
new file mode 100644
index 0000000..f8eb103
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConstants.java
@@ -0,0 +1,15 @@
+package org.apache.camel.component.infinispan;
+
+interface InfinispanConstants {
+    String EVENT_TYPE = "CamelInfinispanEventType";
+    String IS_PRE = "CamelInfinispanIsPre";
+    String CACHE_NAME = "CamelInfinispanCacheName";
+    String KEY = "CamelInfinispanKey";
+    String VALUE = "CamelInfinispanValue";
+    String OPERATION = "CamelInfinispanOperation";
+    String PUT = "CamelInfinispanOperationPut";
+    String GET = "CamelInfinispanOperationGet";
+    String REMOVE = "CamelInfinispanOperationRemove";
+    String CLEAR = "CamelInfinispanOperationClear";
+    String RESULT = "CamelInfinispanOperationResult";
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConsumer.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConsumer.java
new file mode 100644
index 0000000..ce4479b
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanConsumer.java
@@ -0,0 +1,65 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.impl.DefaultConsumer;
+import org.infinispan.Cache;
+import org.infinispan.manager.DefaultCacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InfinispanConsumer extends DefaultConsumer {
+    private static final transient Logger LOGGER = LoggerFactory.getLogger(InfinispanProducer.class);
+    private final InfinispanConfiguration configuration;
+    private final InfinispanSyncEventListener listener;
+    private DefaultCacheManager defaultCacheManager;
+
+    public InfinispanConsumer(InfinispanEndpoint endpoint, Processor processor, InfinispanConfiguration configuration) {
+        super(endpoint, processor);
+        this.configuration = configuration;
+        if (configuration.isSync()) {
+            listener = new InfinispanSyncEventListener(this, configuration.getEventTypes());
+        } else {
+            listener = new InfinispanAsyncEventListener(this, configuration.getEventTypes());
+        }
+    }
+
+    public void processEvent(String eventType, boolean isPre, String cacheName, Object key) {
+        Exchange exchange = getEndpoint().createExchange();
+        exchange.getOut().setHeader(InfinispanConstants.EVENT_TYPE, eventType);
+        exchange.getOut().setHeader(InfinispanConstants.IS_PRE, isPre);
+        exchange.getOut().setHeader(InfinispanConstants.CACHE_NAME, cacheName);
+        exchange.getOut().setHeader(InfinispanConstants.KEY, key);
+
+        try {
+            getProcessor().process(exchange);
+        } catch (Exception e) {
+            LOGGER.error("Error processing event ", e);
+        }
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        if (configuration.getCacheContainer() instanceof DefaultCacheManager) {
+            defaultCacheManager = (DefaultCacheManager) configuration.getCacheContainer();
+            Cache<Object, Object> cache;
+            if (configuration.getCasheName() != null) {
+                cache = defaultCacheManager.getCache(configuration.getCasheName());
+            } else {
+                cache = defaultCacheManager.getCache();
+            }
+            cache.addListener(listener);
+        } else {
+            throw new UnsupportedOperationException("Consumer not support for CacheContainer: " + configuration.getCacheContainer());
+        }
+        super.doStart();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (defaultCacheManager != null) {
+            defaultCacheManager.removeListener(listener);
+        }
+        super.doStop();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanEndpoint.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanEndpoint.java
new file mode 100644
index 0000000..bedeab9
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanEndpoint.java
@@ -0,0 +1,35 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultEndpoint;
+
+public class InfinispanEndpoint extends DefaultEndpoint {
+    private InfinispanConfiguration configuration;
+
+    public InfinispanEndpoint() {
+    }
+
+    public InfinispanEndpoint(String endpointUri) {
+        super(endpointUri);
+    }
+
+    public InfinispanEndpoint(String uri, InfinispanComponent component, InfinispanConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    public Producer createProducer() throws Exception {
+        return new InfinispanProducer(this, configuration);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        return new InfinispanConsumer(this, processor, configuration);
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanOperation.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanOperation.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanOperation.java
new file mode 100644
index 0000000..9aa688e
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanOperation.java
@@ -0,0 +1,74 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.api.BasicCacheContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InfinispanOperation {
+    private static final transient Logger LOGGER = LoggerFactory.getLogger(InfinispanOperation.class);
+    private BasicCache cache;
+
+    public InfinispanOperation(BasicCache cache) {
+        this.cache = cache;
+    }
+
+    public void process(Exchange exchange) {
+        Operation operation = getOperation(exchange);
+        operation.execute(cache, exchange);
+    }
+
+    private Operation getOperation(Exchange exchange) {
+        String operation = exchange.getIn().getHeader(InfinispanConstants.OPERATION, String.class);
+        if (operation == null) {
+            operation = InfinispanConstants.PUT;
+        }
+        LOGGER.trace("Operation: [{}]", operation);
+        return Operation.valueOf(operation.substring(InfinispanConstants.OPERATION.length()).toUpperCase());
+    }
+
+    enum Operation {
+        PUT {
+            @Override
+            void execute(BasicCache cache, Exchange exchange) {
+                Object result = cache.put(getKey(exchange), getValue(exchange));
+                setResult(result, exchange);
+            }
+        }, GET {
+            @Override
+            void execute(BasicCache cache, Exchange exchange) {
+                Object result = cache.get(getKey(exchange));
+                setResult(result, exchange);
+            }
+        }, REMOVE {
+            @Override
+            void execute(BasicCache cache, Exchange exchange) {
+                Object result = cache.remove(getKey(exchange));
+                setResult(result, exchange);
+            }
+
+
+        }, CLEAR {
+            @Override
+            void execute(BasicCache cache, Exchange exchange) {
+                cache.clear();
+            }
+        };
+
+        void setResult(Object result, Exchange exchange) {
+            exchange.getIn().setHeader(InfinispanConstants.RESULT, result);
+        }
+
+        Object getKey(Exchange exchange) {
+            return exchange.getIn().getHeader(InfinispanConstants.KEY);
+        }
+
+        Object getValue(Exchange exchange) {
+            return exchange.getIn().getHeader(InfinispanConstants.VALUE);
+        }
+
+        abstract void execute(BasicCache cache, Exchange exchange);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanProducer.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanProducer.java
new file mode 100644
index 0000000..de8b2e5d
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanProducer.java
@@ -0,0 +1,53 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultProducer;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.api.BasicCacheContainer;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InfinispanProducer extends DefaultProducer {
+    private static final transient Logger LOGGER = LoggerFactory.getLogger(InfinispanProducer.class);
+    private InfinispanConfiguration configuration;
+    private BasicCacheContainer cacheContainer;
+    private boolean isManagedCacheContainer;
+
+    public InfinispanProducer(InfinispanEndpoint endpoint, InfinispanConfiguration configuration) {
+        super(endpoint);
+        this.configuration = configuration;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        new InfinispanOperation(getCache(exchange)).process(exchange);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        cacheContainer = configuration.getCacheContainer();
+        if (cacheContainer == null) {
+            cacheContainer = new RemoteCacheManager(configuration.getHost());
+            cacheContainer.start();
+            isManagedCacheContainer = true;
+        }
+        super.doStart();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (isManagedCacheContainer) {
+            cacheContainer.stop();
+        }
+        super.doStop();
+    }
+
+    private BasicCache getCache(Exchange exchange) {
+        String cacheName = exchange.getIn().getHeader(InfinispanConstants.CACHE_NAME, String.class);
+        if (cacheName == null) {
+            cacheName = configuration.getCasheName();
+        }
+        LOGGER.trace("Cache[{}]", cacheName);
+        return cacheName != null ? cacheContainer.getCache(cacheName) : cacheContainer.getCache();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanSyncEventListener.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanSyncEventListener.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanSyncEventListener.java
new file mode 100644
index 0000000..987b7cb
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanSyncEventListener.java
@@ -0,0 +1,45 @@
+package org.apache.camel.component.infinispan;
+
+import java.util.Set;
+
+import org.infinispan.notifications.Listener;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryActivated;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryInvalidated;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryLoaded;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryPassivated;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
+import org.infinispan.notifications.cachelistener.event.CacheEntryEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Listener(sync = true)
+public class InfinispanSyncEventListener {
+    private final transient Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+    private final InfinispanConsumer infinispanConsumer;
+    private final Set<String> eventTypes;
+
+    public InfinispanSyncEventListener(InfinispanConsumer infinispanConsumer, Set<String> eventTypes) {
+        this.infinispanConsumer = infinispanConsumer;
+        this.eventTypes = eventTypes;
+    }
+
+    @CacheEntryActivated
+    @CacheEntryCreated
+    @CacheEntryInvalidated
+    @CacheEntryLoaded
+    @CacheEntryModified
+    @CacheEntryPassivated
+    @CacheEntryRemoved
+    @CacheEntryVisited
+    public void processEvent(CacheEntryEvent event) {
+        LOGGER.trace("Received CacheEntryEvent [{}]", event);
+
+        if (eventTypes == null || eventTypes.isEmpty() || eventTypes.contains(event.getType().toString())) {
+            infinispanConsumer.processEvent(event.getType().toString(), event.isPre(), event.getCache().getName(), event.getKey());
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepository.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepository.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepository.java
new file mode 100644
index 0000000..21a923a
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepository.java
@@ -0,0 +1,92 @@
+package org.apache.camel.component.infinispan.processor.idempotent;
+
+import org.apache.camel.api.management.ManagedAttribute;
+import org.apache.camel.api.management.ManagedOperation;
+import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.spi.IdempotentRepository;
+import org.apache.camel.support.ServiceSupport;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.api.BasicCacheContainer;
+import org.infinispan.manager.DefaultCacheManager;
+
+@ManagedResource(description = "Infinispan based message id repository")
+public class InfinispanIdempotentRepository extends ServiceSupport implements IdempotentRepository<Object> {
+    private final String cacheName;
+    private final BasicCacheContainer cacheContainer;
+    private boolean isManagedCacheContainer;
+
+    public InfinispanIdempotentRepository(BasicCacheContainer cacheContainer, String cacheName) {
+        this.cacheContainer = cacheContainer;
+        this.cacheName = cacheName;
+    }
+
+    public InfinispanIdempotentRepository(String cacheName) {
+        cacheContainer = new DefaultCacheManager();
+        this.cacheName = cacheName;
+        isManagedCacheContainer = true;
+    }
+
+    public InfinispanIdempotentRepository() {
+        this(null);
+    }
+
+    public static InfinispanIdempotentRepository infinispanIdempotentRepository(
+            BasicCacheContainer cacheContainer, String processorName) {
+        return new InfinispanIdempotentRepository(cacheContainer, processorName);
+    }
+
+    public static InfinispanIdempotentRepository infinispanIdempotentRepository(String processorName) {
+        return new InfinispanIdempotentRepository(processorName);
+    }
+
+    public static InfinispanIdempotentRepository infinispanIdempotentRepository() {
+        return new InfinispanIdempotentRepository();
+    }
+
+    @ManagedOperation(description = "Adds the key to the store")
+    public boolean add(Object key) {
+        Boolean put = getCache().put(key, true);
+        return put == null;
+    }
+
+    @ManagedOperation(description = "Does the store contain the given key")
+    public boolean contains(Object key) {
+        return getCache().containsKey(key);
+    }
+
+    @ManagedOperation(description = "Remove the key from the store")
+    public boolean remove(Object key) {
+        return getCache().remove(key) != null;
+    }
+
+    @ManagedAttribute(description = "The processor name")
+    public String getCacheName() {
+        return cacheName;
+    }
+
+    public boolean confirm(Object key) {
+        return true;
+    }
+
+    protected void doStart() throws Exception {
+        // noop
+    }
+
+    protected void doStop() throws Exception {
+        // noop
+    }
+
+    protected void doShutdown() throws Exception {
+        super.doShutdown();
+        if (isManagedCacheContainer) {
+            cacheContainer.stop();
+        }
+    }
+
+    private BasicCache<Object, Boolean> getCache() {
+        return cacheName != null
+                ? cacheContainer.<Object, Boolean>getCache(cacheName)
+                : cacheContainer.<Object, Boolean>getCache();
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/resources/META-INF/services/org/apache/camel/component/infinispan
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/resources/META-INF/services/org/apache/camel/component/infinispan b/components/camel-infinispan/src/main/resources/META-INF/services/org/apache/camel/component/infinispan
new file mode 100644
index 0000000..7fe423f
--- /dev/null
+++ b/components/camel-infinispan/src/main/resources/META-INF/services/org/apache/camel/component/infinispan
@@ -0,0 +1 @@
+class=org.apache.camel.component.infinispan.InfinispanComponent

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/resources/log4j.properties b/components/camel-infinispan/src/main/resources/log4j.properties
new file mode 100644
index 0000000..4621723
--- /dev/null
+++ b/components/camel-infinispan/src/main/resources/log4j.properties
@@ -0,0 +1,16 @@
+
+#
+# The logging properties used
+#
+log4j.rootLogger=INFO, out
+
+# uncomment the following line to turn on Camel debugging
+#log4j.logger.org.apache.camel=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
+#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
+log4j.throwableRenderer=org.apache.log4j.EnhancedThrowableRenderer
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanComponentTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanComponentTest.java
new file mode 100644
index 0000000..e1c94ac
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanComponentTest.java
@@ -0,0 +1,48 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+
+public class InfinispanComponentTest extends InfinispanTestSupport {
+
+    @Test
+    public void consumerReceivedEntryCreatedEventNotifications() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        currentCache().put(KEY_ONE, VALUE_ONE);
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void producerPublishesKeyAndValue() throws Exception {
+        template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.VALUE, VALUE_ONE);
+            }
+        });
+
+        Object value = currentCache().get(KEY_ONE);
+        assertThat(value.toString(), is(VALUE_ONE));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("infinispan://localhost?cacheContainer=#cacheContainer&eventTypes=CACHE_ENTRY_CREATED")
+                        .to("mock:result");
+
+                from("direct:start")
+                        .to("infinispan://localhost?cacheContainer=#cacheContainer");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanConsumerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanConsumerTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanConsumerTest.java
new file mode 100644
index 0000000..55fb65d
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanConsumerTest.java
@@ -0,0 +1,41 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class InfinispanConsumerTest extends InfinispanTestSupport {
+
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint mockResult;
+
+    @Test
+    public void consumerReceivedPreAndPostEntryCreatedEventNotifications() throws Exception {
+        mockResult.expectedMessageCount(2);
+
+        mockResult.message(0).outHeader(InfinispanConstants.EVENT_TYPE).isEqualTo("CACHE_ENTRY_CREATED");
+        mockResult.message(0).outHeader(InfinispanConstants.IS_PRE).isEqualTo(true);
+        mockResult.message(0).outHeader(InfinispanConstants.CACHE_NAME).isNotNull();
+        mockResult.message(0).outHeader(InfinispanConstants.KEY).isEqualTo(KEY_ONE);
+
+        mockResult.message(1).outHeader(InfinispanConstants.EVENT_TYPE).isEqualTo("CACHE_ENTRY_CREATED");
+        mockResult.message(1).outHeader(InfinispanConstants.IS_PRE).isEqualTo(false);
+        mockResult.message(1).outHeader(InfinispanConstants.CACHE_NAME).isNotNull();
+        mockResult.message(1).outHeader(InfinispanConstants.KEY).isEqualTo(KEY_ONE);
+
+        currentCache().put(KEY_ONE, VALUE_ONE);
+        mockResult.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("infinispan://localhost?cacheContainer=#cacheContainer&sync=false&eventTypes=CACHE_ENTRY_CREATED")
+                        .to("mock:result");
+            }
+        };
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanProducerTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanProducerTest.java
new file mode 100644
index 0000000..30d54a7
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanProducerTest.java
@@ -0,0 +1,115 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.core.Is.is;
+
+public class InfinispanProducerTest extends InfinispanTestSupport {
+
+    @Test
+    public void keyAndValueArePublishedWithDefaultOperation() throws Exception {
+        template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.VALUE, VALUE_ONE);
+            }
+        });
+
+        Object value = currentCache().get(KEY_ONE);
+        assertThat(value.toString(), is(VALUE_ONE));
+    }
+
+    @Test
+    public void publishKeyAndValueByExplicitlySpecifyingTheOperation() throws Exception {
+        template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.VALUE, VALUE_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.OPERATION, InfinispanConstants.PUT);
+            }
+        });
+
+        Object value = currentCache().get(KEY_ONE);
+        assertThat(value.toString(), is(VALUE_ONE));
+    }
+
+    @Test
+    public void putOperationReturnsThePreviousValue() throws Exception {
+        currentCache().put(KEY_ONE, "existing value");
+
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.VALUE, VALUE_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.OPERATION, InfinispanConstants.PUT);
+            }
+        });
+
+        assertThat(exchange.getIn().getHeader(InfinispanConstants.RESULT, String.class), is("existing value"));
+    }
+
+    @Test
+    public void retrievesAValueByKey() throws Exception {
+        currentCache().put(KEY_ONE, VALUE_ONE);
+
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.OPERATION, InfinispanConstants.GET);
+            }
+        });
+
+        assertThat(exchange.getIn().getHeader(InfinispanConstants.RESULT, String.class), is(VALUE_ONE));
+    }
+
+    @Test
+    public void deletesExistingValueByKey() throws Exception {
+        currentCache().put(KEY_ONE, VALUE_ONE);
+
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, KEY_ONE);
+                exchange.getIn().setHeader(InfinispanConstants.OPERATION, InfinispanConstants.REMOVE);
+            }
+        });
+
+        assertThat(exchange.getIn().getHeader(InfinispanConstants.RESULT, String.class), is(VALUE_ONE));
+
+        Object value = currentCache().get(KEY_ONE);
+        assertThat(value, is(nullValue()));
+    }
+
+    @Test
+    public void clearsAllValues() throws Exception {
+        currentCache().put(KEY_ONE, VALUE_ONE);
+        assertThat(currentCache().isEmpty(), is(false));
+
+        template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.OPERATION, InfinispanConstants.CLEAR);
+            }
+        });
+
+        assertThat(currentCache().isEmpty(), is(true));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                        .to("infinispan://localhost?cacheContainer=#cacheContainer");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteProducerTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteProducerTest.java
new file mode 100644
index 0000000..fd6200c
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteProducerTest.java
@@ -0,0 +1,35 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore //start local server with: ./bin/startServer.sh -r hotrod
+public class InfinispanRemoteProducerTest extends CamelTestSupport {
+
+    @Test
+    public void producerPublishesKeyAndValue() throws Exception {
+        Exchange request = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(InfinispanConstants.KEY, "keyOne");
+                exchange.getIn().setHeader(InfinispanConstants.VALUE, "valueOne");
+            }
+        });
+
+        assertNull(request.getException());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                        .to("infinispan://localhost");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanSyncConsumerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanSyncConsumerTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanSyncConsumerTest.java
new file mode 100644
index 0000000..690663d
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanSyncConsumerTest.java
@@ -0,0 +1,38 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.converter.AsyncProcessorTypeConverter;
+import org.apache.camel.util.AsyncProcessorConverterHelper;
+import org.junit.Test;
+
+public class InfinispanSyncConsumerTest extends InfinispanTestSupport {
+
+    @EndpointInject(uri = "mock:result")
+    private MockEndpoint mockResult;
+
+    @Test
+    public void consumerReceivedPreAndPostEntryCreatedEventNotifications() throws Exception {
+        mockResult.expectedMessageCount(2);
+        mockResult.setMinimumResultWaitTime(900);
+
+        currentCache().put(KEY_ONE, VALUE_ONE);
+        mockResult.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("infinispan://localhost?cacheContainer=#cacheContainer&sync=false&eventTypes=CACHE_ENTRY_CREATED")
+
+                        .delayer(500)
+                        .to("mock:result");
+            }
+        };
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanTestSupport.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanTestSupport.java
new file mode 100644
index 0000000..a628fa5
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanTestSupport.java
@@ -0,0 +1,40 @@
+package org.apache.camel.component.infinispan;
+
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.api.BasicCacheContainer;
+import org.infinispan.manager.DefaultCacheManager;
+import org.junit.Before;
+
+public class InfinispanTestSupport extends CamelTestSupport {
+    protected static final String KEY_ONE = "keyOne";
+    protected static final String VALUE_ONE = "valueOne";
+
+    protected BasicCacheContainer basicCacheContainer;
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        basicCacheContainer = new DefaultCacheManager();
+        basicCacheContainer.start();
+        super.setUp();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        basicCacheContainer.stop();
+        super.tearDown();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        registry.bind("cacheContainer", basicCacheContainer);
+        return registry;
+    }
+
+    protected BasicCache<Object, Object> currentCache() {
+        return basicCacheContainer.getCache();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanDefaultIdempotentRepositoryTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanDefaultIdempotentRepositoryTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanDefaultIdempotentRepositoryTest.java
new file mode 100644
index 0000000..b10449e
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanDefaultIdempotentRepositoryTest.java
@@ -0,0 +1,25 @@
+package org.apache.camel.component.infinispan.processor.idempotent;
+
+import org.junit.Test;
+
+import static org.jgroups.util.Util.assertFalse;
+import static org.jgroups.util.Util.assertTrue;
+
+public class InfinispanDefaultIdempotentRepositoryTest {
+
+    @Test
+    public void createsRepositoryUsingInternalCache() throws Exception {
+        InfinispanIdempotentRepository repository = InfinispanIdempotentRepository.infinispanIdempotentRepository();
+
+        assertFalse(repository.contains("One"));
+        assertFalse(repository.remove("One"));
+
+        assertTrue(repository.add("One"));
+
+        assertTrue(repository.contains("One"));
+        assertTrue(repository.remove("One"));
+
+        assertFalse(repository.contains("One"));
+        assertFalse(repository.remove("One"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepositoryTest.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepositoryTest.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepositoryTest.java
new file mode 100644
index 0000000..24357e9
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/processor/idempotent/InfinispanIdempotentRepositoryTest.java
@@ -0,0 +1,74 @@
+package org.apache.camel.component.infinispan.processor.idempotent;
+
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.commons.api.BasicCacheContainer;
+import org.infinispan.configuration.global.GlobalConfiguration;
+import org.infinispan.configuration.global.GlobalConfigurationBuilder;
+import org.infinispan.manager.DefaultCacheManager;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.jgroups.util.Util.assertFalse;
+import static org.jgroups.util.Util.assertTrue;
+
+public class InfinispanIdempotentRepositoryTest {
+    protected BasicCacheContainer basicCacheContainer;
+    protected InfinispanIdempotentRepository idempotentRepository;
+    protected String cacheName = "test";
+    public static final GlobalConfiguration GLOBAL_CONFIGURATION = new GlobalConfigurationBuilder().globalJmxStatistics().allowDuplicateDomains(true).build();
+
+    @Before
+    public void setUp() throws Exception {
+        basicCacheContainer = new DefaultCacheManager(GLOBAL_CONFIGURATION);
+        basicCacheContainer.start();
+        idempotentRepository = InfinispanIdempotentRepository.infinispanIdempotentRepository(basicCacheContainer, cacheName);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        basicCacheContainer.stop();
+    }
+
+    @Test
+    public void addsNewKeysToCache() throws Exception {
+        assertTrue(idempotentRepository.add("One"));
+        assertTrue(idempotentRepository.add("Two"));
+
+        assertTrue(getCache().containsKey("One"));
+        assertTrue(getCache().containsKey("Two"));
+    }
+
+    @Test
+    public void skipsAddingSecondTimeTheSameKey() throws Exception {
+        assertTrue(idempotentRepository.add("One"));
+        assertFalse(idempotentRepository.add("One"));
+    }
+
+    @Test
+    public void containsPreviouslyAddedKey() throws Exception {
+        assertFalse(idempotentRepository.contains("One"));
+
+        idempotentRepository.add("One");
+
+        assertTrue(idempotentRepository.contains("One"));
+    }
+
+    @Test
+    public void removesAnExistingKey() throws Exception {
+        idempotentRepository.add("One");
+
+        assertTrue(idempotentRepository.remove("One"));
+
+        assertFalse(idempotentRepository.contains("One"));
+    }
+
+    @Test
+    public void doesntRemoveMissingKey() throws Exception {
+        assertFalse(idempotentRepository.remove("One"));
+    }
+
+    private BasicCache<Object, Object> getCache() {
+        return basicCacheContainer.getCache(cacheName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/components/pom.xml
----------------------------------------------------------------------
diff --git a/components/pom.xml b/components/pom.xml
index 811c702..23dd79e 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -98,6 +98,7 @@
     <module>camel-hl7</module>
     <module>camel-ibatis</module>
     <module>camel-ical</module>
+    <module>camel-infinispan</module>
     <module>camel-irc</module>
     <module>camel-jackson</module>
     <module>camel-javaspace</module>

http://git-wip-us.apache.org/repos/asf/camel/blob/6726d042/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index f40a55d..1ba1841 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -181,6 +181,7 @@
     <httpclient-version>3.1</httpclient-version> 
     <ibatis-bundle-version>2.3.4.726_4</ibatis-bundle-version>
     <ibatis-version>2.3.4.726</ibatis-version>
+    <infinispan-version>6.0.0.Alpha1</infinispan-version>
     <irclib-bundle-version>1.10_5</irclib-bundle-version>
     <irclib-version>1.10</irclib-version>
     <isorelax-bundle-version>20050913_4</isorelax-bundle-version>