/**
* 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.InputStream;
import java.util.Properties;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Service;
import org.apache.camel.util.ObjectHelper;
import org.infinispan.cache.impl.DecoratedCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.commons.api.BasicCache;
import org.infinispan.commons.api.BasicCacheContainer;
import org.infinispan.manager.DefaultCacheManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class InfinispanManager implements Service {
private static final transient Logger LOGGER = LoggerFactory.getLogger(InfinispanManager.class);
private final InfinispanConfiguration configuration;
private final CamelContext camelContext;
private BasicCacheContainer cacheContainer;
private boolean isManagedCacheContainer;
public InfinispanManager() {
this.camelContext = null;
this.configuration = new InfinispanConfiguration();
this.configuration.setCacheContainer(new DefaultCacheManager(true));
}
public InfinispanManager(InfinispanConfiguration configuration) {
this(null, configuration);
}
public InfinispanManager(CamelContext camelContext, InfinispanConfiguration configuration) {
this.camelContext = camelContext;
this.configuration = configuration;
}
@Override
public void start() throws Exception {
cacheContainer = configuration.getCacheContainer();
if (cacheContainer == null) {
// Check if a container configuration object has been provided so use
// it and discard any other additional configuration.
if (configuration.getCacheContainerConfiguration() != null) {
final Object containerConf = configuration.getCacheContainerConfiguration();
if (containerConf instanceof org.infinispan.client.hotrod.configuration.Configuration) {
cacheContainer = new RemoteCacheManager(
(org.infinispan.client.hotrod.configuration.Configuration)containerConf,
true
);
} else if (containerConf instanceof org.infinispan.configuration.cache.Configuration) {
cacheContainer = new DefaultCacheManager(
(org.infinispan.configuration.cache.Configuration)containerConf,
true
);
} else {
throw new IllegalArgumentException("Unsupported CacheContainer Configuration type: " + containerConf.getClass());
}
}
// If the hosts properties has been configured, it means we want to
// connect to a remote cache so set-up a RemoteCacheManager
if (cacheContainer == null && configuration.getHosts() != null) {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServers(configuration.getHosts());
if (camelContext != null && camelContext.getApplicationContextClassLoader() != null) {
builder.classLoader(camelContext.getApplicationContextClassLoader());
} else {
builder.classLoader(Thread.currentThread().getContextClassLoader());
}
Properties properties = new Properties();
// Properties can be set either via a properties file or via
// properties on configuration, if you set both they are merged
// with properties defined on configuration overriding those from
// file.
if (ObjectHelper.isNotEmpty(configuration.getConfigurationUri())) {
properties.putAll(InfinispanUtil.loadProperties(camelContext, configuration.getConfigurationUri()));
}
if (ObjectHelper.isNotEmpty(configuration.getConfigurationProperties())) {
properties.putAll(configuration.getConfigurationProperties());
}
if (!properties.isEmpty()) {
builder.withProperties(properties);
}
cacheContainer = new RemoteCacheManager(builder.build(), true);
}
// Finally we can set-up a DefaultCacheManager if none of the methods
// above was triggered. You can configure the cache using a configuration
// file.
if (cacheContainer == null) {
if (ObjectHelper.isNotEmpty(configuration.getConfigurationUri())) {
try (InputStream is = InfinispanUtil.openInputStream(camelContext, configuration.getConfigurationUri())) {
cacheContainer = new DefaultCacheManager(is, true);
}
} else {
cacheContainer = new DefaultCacheManager(true);
}
}
isManagedCacheContainer = true;
}
}
@Override
public void stop() throws Exception {
if (isManagedCacheContainer) {
cacheContainer.stop();
}
}
public BasicCacheContainer getCacheContainer() {
return cacheContainer;
}
public boolean isCacheContainerEmbedded() {
return InfinispanUtil.isEmbedded(cacheContainer);
}
public boolean isCacheContainerRemote() {
return InfinispanUtil.isRemote(cacheContainer);
}
public <K, V> BasicCache<K, V> getCache(String cacheName) {
BasicCache<K, V> cache;
if (ObjectHelper.isEmpty(cacheName)) {
cache = cacheContainer.getCache();
cacheName = cache.getName();
} else {
cache = cacheContainer.getCache(cacheName);
}
LOGGER.trace("Cache[{}]", cacheName);
if (configuration.hasFlags() && InfinispanUtil.isEmbedded(cache)) {
cache = new DecoratedCache(InfinispanUtil.asAdvanced(cache), configuration.getFlags());
}
return cache;
}
public <K, V> BasicCache<K, V> getCache(Exchange exchange, String defaultCache) {
return getCache(exchange.getIn(), defaultCache);
}
public <K, V> BasicCache<K, V> getCache(Message message, String defaultCache) {
BasicCache<K, V> cache = getCache(message.getHeader(InfinispanConstants.CACHE_NAME, defaultCache, String.class));
return message.getHeader(InfinispanConstants.IGNORE_RETURN_VALUES) != null
? cache
: InfinispanUtil.ignoreReturnValuesCache(cache);
}
}