/**
* 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.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.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.util.UserUtils.USERS;
import static org.apache.camel.component.infinispan.util.UserUtils.createKey;
import static org.apache.camel.component.infinispan.util.UserUtils.hasUser;
public class InfinispanRemoteQueryProducerIT extends CamelTestSupport {
private static final InfinispanQueryBuilder NO_RESULT_QUERY_BUILDER = new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory queryFactory) {
return queryFactory.from(User.class)
.having("name").like("%abc%")
.toBuilder().build();
}
};
private static final InfinispanQueryBuilder WITH_RESULT_QUERY_BUILDER = new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory queryFactory) {
return queryFactory.from(User.class)
.having("name").like("%A")
.toBuilder().build();
}
};
private RemoteCacheManager manager;
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = super.createRegistry();
registry.bind("myCustomContainer", manager);
registry.bind("noResultQueryBuilder", NO_RESULT_QUERY_BUILDER);
registry.bind("withResultQueryBuilder", WITH_RESULT_QUERY_BUILDER);
return registry;
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:start")
.to("infinispan:remote_query?cacheContainer=#myCustomContainer");
from("direct:noQueryResults")
.to("infinispan:remote_query?cacheContainer=#myCustomContainer&queryBuilder=#noResultQueryBuilder");
from("direct:queryWithResults")
.to("infinispan:remote_query?cacheContainer=#myCustomContainer&queryBuilder=#withResultQueryBuilder");
}
};
}
@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 {
// pre-load data
RemoteCache<Object, Object> cache = manager.getCache("remote_query");
assertNotNull(cache);
cache.clear();
assertTrue(cache.isEmpty());
for (final User user : USERS) {
String key = createKey(user);
cache.put(key, user);
assertTrue(cache.containsKey(key));
}
}
@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());
List<User> queryResult = request.getIn().getBody(List.class);
assertNull(queryResult);
}
@Test
public void producerQueryWithoutResult() throws Exception {
producerQueryWithoutResult("direct:start", NO_RESULT_QUERY_BUILDER);
}
@Test
public void producerQueryWithoutResultAndQueryBuilderFromConfig() throws Exception {
producerQueryWithoutResult("direct:noQueryResults", null);
}
private void producerQueryWithoutResult(String endpoint, final InfinispanQueryBuilder builder) throws Exception {
Exchange request = template.request(endpoint, createQueryProcessor(builder));
assertNull(request.getException());
List<User> queryResult = request.getIn().getBody(List.class);
assertNotNull(queryResult);
assertEquals(0, queryResult.size());
}
@Test
public void producerQueryWithResult() throws Exception {
producerQueryWithResult("direct:start", WITH_RESULT_QUERY_BUILDER);
}
@Test
public void producerQueryWithResultAndQueryBuilderFromConfig() throws Exception {
producerQueryWithResult("direct:queryWithResults", null);
}
private void producerQueryWithResult(String endpoint, final InfinispanQueryBuilder builder) throws Exception {
Exchange request = template.request(endpoint, createQueryProcessor(builder));
assertNull(request.getException());
List<User> queryResult = request.getIn().getBody(List.class);
assertNotNull(queryResult);
assertEquals(2, queryResult.size());
assertTrue(hasUser(queryResult, "nameA", "surnameA"));
assertTrue(hasUser(queryResult, "nameA", "surnameB"));
}
private Processor createQueryProcessor(final InfinispanQueryBuilder builder) {
return new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(OPERATION, QUERY);
if (builder != null) {
exchange.getIn().setHeader(QUERY_BUILDER, builder);
}
}
};
}
}