You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2016/02/22 15:27:19 UTC

[2/2] camel git commit: CAMEL-9624 Add Infinispan remote query operation

CAMEL-9624 Add Infinispan remote query operation

- Also add full integration tests with Infinispan server (optionally enabled with the "infinispan-itests" profile


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

Branch: refs/heads/master
Commit: 8a7aa4702182b4268920ab055d3cc171777ffa48
Parents: c608450
Author: Tristan Tarrant <tt...@redhat.com>
Authored: Thu Feb 18 20:51:07 2016 +0100
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Mon Feb 22 15:21:13 2016 +0100

----------------------------------------------------------------------
 components/camel-infinispan/README.md           |  12 ++
 components/camel-infinispan/pom.xml             | 170 +++++++++++++++++-
 .../infinispan/InfinispanConstants.java         |   2 +
 .../infinispan/InfinispanOperation.java         |  21 +++
 .../infinispan/InfinispanQueryBuilder.java      |  24 +++
 .../remote/InfinispanRemoteOperation.java       |  40 +++++
 .../InfinispanRemoteQueryProducerIT.java        | 180 +++++++++++++++++++
 .../camel/component/infinispan/UserUtils.java   |  74 ++++++++
 8 files changed, 521 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/README.md
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/README.md b/components/camel-infinispan/README.md
new file mode 100644
index 0000000..47b2631
--- /dev/null
+++ b/components/camel-infinispan/README.md
@@ -0,0 +1,12 @@
+# Camel Infinispan Component
+
+This component aims at integrating Infinispan 8+ for both embedded and 
+remote (HotRod) usage.
+
+## Integration testing
+
+Please note: the integration tests are disabled in the default Maven profile. 
+If you wish to run them, enable the 'infinispan-itests' profile as follows:
+
+    mvn clean verify -Pinfinispan-itests
+

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/pom.xml b/components/camel-infinispan/pom.xml
index 7dd09bd..36bc87e 100644
--- a/components/camel-infinispan/pom.xml
+++ b/components/camel-infinispan/pom.xml
@@ -42,12 +42,18 @@
         </dependency>
         <dependency>
             <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-embedded</artifactId>
+            <artifactId>infinispan-core</artifactId>
+            <version>${infinispan-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.infinispan</groupId>
+            <artifactId>infinispan-query-dsl</artifactId>
             <version>${infinispan-version}</version>
+            <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-remote</artifactId>
+            <artifactId>infinispan-client-hotrod</artifactId>
             <version>${infinispan-version}</version>
         </dependency>
 
@@ -65,6 +71,35 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.infinispan.server</groupId>
+            <artifactId>infinispan-server-testsuite</artifactId>
+            <version>${infinispan-version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jboss.remoting3</groupId>
+                    <artifactId>remoting-jmx</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.infinispan</groupId>
+                    <artifactId>infinispan-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.infinispan</groupId>
+                    <artifactId>infinispan-client-hotrod</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.infinispan</groupId>
+                    <artifactId>infinispan-query-dsl</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.infinispan</groupId>
+                    <artifactId>infinispan-remote-query-client</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <scope>test</scope>
@@ -100,5 +135,136 @@
                 </plugins>
             </build>
         </profile>
+        <profile>
+            <id>infinispan-itests</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <properties>
+                <server.dir.parent>${project.build.directory}</server.dir.parent>
+                <server.dir.name>infinispan-server-${infinispan-version}</server.dir.name>
+                <server.dir>${server.dir.parent}/${server.dir.name}</server.dir>
+            </properties>
+            <dependencies>
+                <dependency>
+                    <groupId>org.infinispan.server</groupId>
+                    <artifactId>infinispan-server</artifactId>
+                    <version>${infinispan-version}</version>
+                    <type>zip</type>
+                    <classifier>bin</classifier>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>unpack-server</id>
+                                <phase>generate-test-resources</phase>
+                                <goals>
+                                    <goal>unpack</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.infinispan.server</groupId>
+                                            <artifactId>infinispan-server</artifactId>
+                                            <version>${infinispan-version}</version>
+                                            <classifier>bin</classifier>
+                                            <type>zip</type>
+                                            <outputDirectory>${server.dir.parent}</outputDirectory>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>deploy-converter-factory</id>
+                                <phase>generate-test-resources</phase>
+                                <goals>
+                                    <goal>copy</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.infinispan.server</groupId>
+                                            <artifactId>infinispan-server-testsuite</artifactId>
+                                            <classifier>tests</classifier>
+                                            <version>${infinispan-version}</version>
+                                            <outputDirectory>${server.dir}/standalone/deployments</outputDirectory>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.wildfly.plugins</groupId>
+                        <artifactId>wildfly-maven-plugin</artifactId>
+                        <version>1.1.0.Alpha6</version>
+                        <executions>
+                            <execution>
+                                <id>start-server</id>
+                                <phase>pre-integration-test</phase>
+                                <goals>
+                                    <goal>start</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>${skipTests}</skip>
+                                    <jbossHome>${server.dir}</jbossHome>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>configure-caches</id>
+                                <phase>pre-integration-test</phase>
+                                <goals>
+                                    <goal>execute-commands</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>${skipTests}</skip>
+                                    <executeCommands>
+                                        <commands>
+                                            <!-- Separate cache for protobuf serialized objects. -->
+                                            <command>/subsystem=datagrid-infinispan/cache-container=local/local-cache=remote_query:add(configuration=default)</command>
+                                            <!-- Separate cache for converter factory which uses Int keys -->
+                                            <command>/subsystem=datagrid-infinispan/cache-container=local/local-cache=static_converter_factory:add(configuration=default)</command>
+                                            <!-- Separate cache for converter factory which uses Int keys -->
+                                            <command>/subsystem=datagrid-infinispan/cache-container=local/local-cache=static_filter_factory:add(configuration=default)</command>
+                                            <!-- Separate cache for @ClientListener(includeCurrentState=true) -->
+                                            <command>/subsystem=datagrid-infinispan/cache-container=local/local-cache=include_current_state:add(configuration=default)</command>
+                                        </commands>
+                                    </executeCommands>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>stop-server</id>
+                                <phase>post-integration-test</phase>
+                                <goals>
+                                    <goal>shutdown</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>${skipTests}</skip>
+                                    <jbossHome>${server.dir}</jbossHome>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 </project>

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/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
index 681ac65..d2a5f95 100644
--- 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
@@ -48,4 +48,6 @@ public interface InfinispanConstants {
     String MAX_IDLE_TIME_UNIT = "CamelInfinispanMaxIdleTimeUnit";
     String IGNORE_RETURN_VALUES = "CamelInfinispanIgnoreReturnValues";
     String EVENT_DATA = "CamelInfinispanEventData";
+    String QUERY = "CamelInfinispanOperationQuery";
+    String QUERY_BUILDER = "CamelInfinispanQueryBuilder";
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/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
index f4f7184..c51cc6f 100644
--- 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
@@ -20,9 +20,11 @@ import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteOperation;
 import org.apache.camel.util.ObjectHelper;
 import org.infinispan.commons.api.BasicCache;
 import org.infinispan.commons.util.concurrent.NotifyingFuture;
+import org.infinispan.query.dsl.Query;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -315,8 +317,18 @@ public final class InfinispanOperation {
                 result = cache.clearAsync();
                 setResult(result, exchange);
             }
+        }, QUERY {
+            @Override
+            void execute(BasicCache<Object, Object> cache, Exchange exchange) {
+                Query query = getQuery(cache, exchange);
+                if (query == null) {
+                    return;
+                }
+                setResult(query.list(), exchange);
+            }
         };
 
+
         void setResult(Object result, Exchange exchange) {
             exchange.getIn().setHeader(InfinispanConstants.RESULT, result);
         }
@@ -337,6 +349,15 @@ public final class InfinispanOperation {
             return (Map<? extends Object, ? extends Object>) exchange.getIn().getHeader(InfinispanConstants.MAP);
         }
 
+        Query getQuery(BasicCache<Object, Object> cache, Exchange exchange) {
+            if (InfinispanUtil.isRemote(cache)) {
+                return InfinispanRemoteOperation.buildQuery(cache, exchange);
+            } else {
+                return null;
+            }
+
+        }
+
         abstract void execute(BasicCache<Object, Object> cache, Exchange exchange);
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanQueryBuilder.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanQueryBuilder.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanQueryBuilder.java
new file mode 100644
index 0000000..828b470
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/InfinispanQueryBuilder.java
@@ -0,0 +1,24 @@
+/**
+ * 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.infinispan;
+
+import org.infinispan.query.dsl.Query;
+import org.infinispan.query.dsl.QueryFactory;
+
+public interface InfinispanQueryBuilder {
+    Query build(QueryFactory<Query> queryFactory);
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteOperation.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteOperation.java b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteOperation.java
new file mode 100644
index 0000000..38c1856
--- /dev/null
+++ b/components/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteOperation.java
@@ -0,0 +1,40 @@
+/**
+ * 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.infinispan.remote;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.infinispan.InfinispanConstants;
+import org.apache.camel.component.infinispan.InfinispanQueryBuilder;
+import org.infinispan.client.hotrod.RemoteCache;
+import org.infinispan.client.hotrod.Search;
+import org.infinispan.commons.api.BasicCache;
+import org.infinispan.query.dsl.Query;
+
+public final class InfinispanRemoteOperation {
+    private InfinispanRemoteOperation() {
+    }
+
+    public static Query buildQuery(BasicCache<Object, Object> cache, Exchange exchange) {
+        InfinispanQueryBuilder queryBuilder = (InfinispanQueryBuilder) exchange
+                .getIn().getHeader(InfinispanConstants.QUERY_BUILDER);
+        if (queryBuilder == null) {
+            return null;
+        }
+        RemoteCache<Object, Object> remoteCache = (RemoteCache<Object, Object>) cache;
+        return queryBuilder.build(Search.getQueryFactory(remoteCache));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteQueryProducerIT.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteQueryProducerIT.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteQueryProducerIT.java
new file mode 100644
index 0000000..cd19aed
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/InfinispanRemoteQueryProducerIT.java
@@ -0,0 +1,180 @@
+/**
+ * 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.infinispan;
+
+import java.io.IOException;
+import java.util.List;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.infinispan.client.hotrod.RemoteCache;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller;
+import org.infinispan.commons.util.Util;
+import org.infinispan.protostream.FileDescriptorSource;
+import org.infinispan.protostream.SerializationContext;
+import org.infinispan.protostream.sampledomain.User;
+import org.infinispan.protostream.sampledomain.marshallers.GenderMarshaller;
+import org.infinispan.protostream.sampledomain.marshallers.UserMarshaller;
+import org.infinispan.query.dsl.Query;
+import org.infinispan.query.dsl.QueryFactory;
+import org.infinispan.query.remote.client.MarshallerRegistration;
+import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants;
+import org.junit.Test;
+
+import static org.apache.camel.component.infinispan.InfinispanConstants.KEY;
+import static org.apache.camel.component.infinispan.InfinispanConstants.OPERATION;
+import static org.apache.camel.component.infinispan.InfinispanConstants.QUERY;
+import static org.apache.camel.component.infinispan.InfinispanConstants.QUERY_BUILDER;
+import static org.apache.camel.component.infinispan.InfinispanConstants.RESULT;
+import static org.apache.camel.component.infinispan.InfinispanConstants.VALUE;
+import static org.apache.camel.component.infinispan.UserUtils.USERS;
+import static org.apache.camel.component.infinispan.UserUtils.createKey;
+import static org.apache.camel.component.infinispan.UserUtils.hasUser;
+
+public class InfinispanRemoteQueryProducerIT extends CamelTestSupport {
+
+    private RemoteCacheManager manager;
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry registry = super.createRegistry();
+        registry.bind("myCustomContainer", manager);
+        return registry;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:start").to(
+                        "infinispan://?cacheContainer=#myCustomContainer&cacheName=remote_query");
+            }
+        };
+    }
+
+    @Override
+    protected void doPreSetup() throws IOException {
+        ConfigurationBuilder builder = new ConfigurationBuilder().addServer()
+                .host("localhost").port(11222)
+                .marshaller(new ProtoStreamMarshaller());
+
+        manager = new RemoteCacheManager(builder.build());
+
+        RemoteCache<String, String> metadataCache = manager
+                .getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME);
+        metadataCache
+                .put("sample_bank_account/bank.proto",
+                        Util.read(InfinispanRemoteQueryProducerIT.class
+                                .getResourceAsStream("/sample_bank_account/bank.proto")));
+        MarshallerRegistration.registerMarshallers(ProtoStreamMarshaller
+                .getSerializationContext(manager));
+
+        SerializationContext serCtx = ProtoStreamMarshaller
+                .getSerializationContext(manager);
+        serCtx.registerProtoFiles(FileDescriptorSource
+                .fromResources("/sample_bank_account/bank.proto"));
+        serCtx.registerMarshaller(new UserMarshaller());
+        serCtx.registerMarshaller(new GenderMarshaller());
+    }
+
+    @Override
+    protected void doPostSetup() throws Exception {
+        /* Preload data. */
+        for (final User user : USERS) {
+            Exchange request = template.request("direct:start",
+                    new Processor() {
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            Message in = exchange.getIn();
+                            in.setHeader(KEY, createKey(user));
+                            in.setHeader(VALUE, user);
+                        }
+                    });
+            assertNull(request.getException());
+        }
+    }
+
+    @Test
+    public void producerQueryOperationWithoutQueryBuilder() throws Exception {
+        Exchange request = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(OPERATION, QUERY);
+            }
+        });
+        assertNull(request.getException());
+
+        @SuppressWarnings("unchecked")
+        List<User> queryResult = (List<User>) request.getIn().getHeader(RESULT);
+        assertNull(queryResult);
+    }
+
+    @Test
+    public void producerQueryWithoutResult() throws Exception {
+        Exchange request = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(OPERATION, QUERY);
+                exchange.getIn().setHeader(QUERY_BUILDER,
+                        new InfinispanQueryBuilder() {
+                            public Query build(QueryFactory<Query> queryFactory) {
+                                return queryFactory.from(User.class)
+                                        .having("name").like("%abc%")
+                                        .toBuilder().build();
+                            }
+                        });
+            }
+        });
+        assertNull(request.getException());
+
+        @SuppressWarnings("unchecked")
+        List<User> queryResult = (List<User>) request.getIn().getHeader(RESULT);
+        assertNotNull(queryResult);
+        assertEquals(0, queryResult.size());
+    }
+
+    @Test
+    public void producerQueryWithResult() throws Exception {
+        Exchange request = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                Message in = exchange.getIn();
+                in.setHeader(OPERATION, QUERY);
+                in.setHeader(QUERY_BUILDER, new InfinispanQueryBuilder() {
+                    public Query build(QueryFactory<Query> queryFactory) {
+                        return queryFactory.from(User.class).having("name")
+                                .like("%A").toBuilder().build();
+                    }
+                });
+            }
+        });
+        assertNull(request.getException());
+
+        @SuppressWarnings("unchecked")
+        List<User> queryResult = (List<User>) request.getIn().getHeader(RESULT);
+        assertNotNull(queryResult);
+        assertEquals(2, queryResult.size());
+        assertTrue(hasUser(queryResult, "nameA", "surnameA"));
+        assertTrue(hasUser(queryResult, "nameA", "surnameB"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8a7aa470/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/UserUtils.java
----------------------------------------------------------------------
diff --git a/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/UserUtils.java b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/UserUtils.java
new file mode 100644
index 0000000..4126b83
--- /dev/null
+++ b/components/camel-infinispan/src/test/java/org/apache/camel/component/infinispan/UserUtils.java
@@ -0,0 +1,74 @@
+/**
+ * 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.infinispan;
+
+import java.util.List;
+import org.infinispan.protostream.sampledomain.User;
+
+public final class UserUtils {
+    public static final User[] USERS = new User[]{
+            createUser("nameA", "surnameA"),
+            createUser("nameA", "surnameB"),
+            createUser("nameB", "surnameB")};
+
+    private UserUtils() {
+    }
+
+    public static String createKey(User user) {
+        return String.format("%s+%s", user.getName(), user.getSurname());
+    }
+
+    public static User createUser(String name, String surname) {
+        User user = new User();
+        user.setName(name);
+        user.setSurname(surname);
+        return user;
+    }
+
+    public static boolean eq(String str1, String str2) {
+        if (str1 == null) {
+            return str2 == null;
+        } else {
+            return str1.equals(str2);
+        }
+    }
+
+    public static boolean eq(User user, String name, String surname) {
+        if (user == null) {
+            return false;
+        }
+        if (!eq(user.getName(), name)) {
+            return false;
+        }
+        if (!eq(user.getSurname(), surname)) {
+            return false;
+        }
+        return true;
+    }
+
+    public static boolean hasUser(List<User> users, String name, String surname) {
+        if (users == null) {
+            return false;
+        }
+        for (User user : users) {
+            if (eq(user, name, surname)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}