/**
* 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 org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
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.util.UserUtils.CQ_USERS;
import static org.apache.camel.component.infinispan.util.UserUtils.createKey;
public class InfinispanContinuousQueryIT extends CamelTestSupport {
private static final InfinispanQueryBuilder CONTINUOUS_QUERY_BUILDER = new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory queryFactory) {
return queryFactory.from(User.class)
.having("name").like("CQ%").build();
}
};
private static final InfinispanQueryBuilder CONTINUOUS_QUERY_BUILDER_NO_MATCH = new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory queryFactory) {
return queryFactory.from(User.class)
.having("name").like("%TEST%").build();
}
};
private static final InfinispanQueryBuilder CONTINUOUS_QUERY_BUILDER_ALL = new InfinispanQueryBuilder() {
@Override
public Query build(QueryFactory queryFactory) {
return queryFactory.from(User.class)
.having("name").like("%Q0%").build();
}
};
private RemoteCacheManager manager;
private RemoteCache<Object, Object> cache;
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = super.createRegistry();
registry.bind("myCustomContainer", manager);
registry.bind("continuousQueryBuilder", CONTINUOUS_QUERY_BUILDER);
registry.bind("continuousQueryBuilderNoMatch", CONTINUOUS_QUERY_BUILDER_NO_MATCH);
registry.bind("continuousQueryBuilderAll", CONTINUOUS_QUERY_BUILDER_ALL);
return registry;
}
@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(InfinispanContinuousQueryIT.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());
// pre-load data
cache = manager.getCache("remote_query");
cache.clear();
}
@Test
public void continuousQuery() throws Exception {
MockEndpoint continuousQueryBuilderNoMatch = getMockEndpoint("mock:continuousQueryNoMatch");
continuousQueryBuilderNoMatch.expectedMessageCount(0);
MockEndpoint continuousQueryBuilderAll = getMockEndpoint("mock:continuousQueryAll");
continuousQueryBuilderAll.expectedMessageCount(CQ_USERS.length * 2);
MockEndpoint continuousQuery = getMockEndpoint("mock:continuousQuery");
continuousQuery.expectedMessageCount(4);
for (int i = 0; i < 4; i++) {
continuousQuery.message(i).outHeader(InfinispanConstants.KEY).isEqualTo(createKey(CQ_USERS[i % 2]));
continuousQuery.message(i).outHeader(InfinispanConstants.CACHE_NAME).isEqualTo(cache.getName());
if (i >= 2) {
continuousQuery.message(i).outHeader(InfinispanConstants.EVENT_TYPE).isEqualTo(InfinispanConstants.CACHE_ENTRY_LEAVING);
continuousQuery.message(i).outHeader(InfinispanConstants.EVENT_DATA).isNull();
} else {
continuousQuery.message(i).outHeader(InfinispanConstants.EVENT_TYPE).isEqualTo(InfinispanConstants.CACHE_ENTRY_JOINING);
continuousQuery.message(i).outHeader(InfinispanConstants.EVENT_DATA).isNotNull();
continuousQuery.message(i).outHeader(InfinispanConstants.EVENT_DATA).isInstanceOf(User.class);
}
}
for (final User user : CQ_USERS) {
cache.put(createKey(user), user);
}
assertEquals(CQ_USERS.length, cache.size());
for (final User user : CQ_USERS) {
cache.remove(createKey(user));
}
assertTrue(cache.isEmpty());
continuousQuery.assertIsSatisfied();
continuousQueryBuilderNoMatch.assertIsSatisfied();
continuousQueryBuilderAll.assertIsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() {
from("infinispan:remote_query?cacheContainer=#myCustomContainer&queryBuilder=#continuousQueryBuilder")
.to("mock:continuousQuery");
from("infinispan:remote_query?cacheContainer=#myCustomContainer&queryBuilder=#continuousQueryBuilderNoMatch")
.to("mock:continuousQueryNoMatch");
from("infinispan:remote_query?cacheContainer=#myCustomContainer&queryBuilder=#continuousQueryBuilderAll")
.to("mock:continuousQueryAll");
}
};
}
}