blob: 7387505c541ffdc1514bb2d12161fab33dbf894a [file] [log] [blame]
/*******************************************************************************
* Copyright 2017 General Electric Company
*
* Licensed 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.
*
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
package com.ge.predix.acs.attribute.cache;
import java.util.function.BiFunction;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class AttributeCacheFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(AttributeCacheFactory.class);
@Value("${ENABLE_RESOURCE_CACHING:true}")
private boolean resourceCachingEnabled;
@Value("${ENABLE_SUBJECT_CACHING:true}")
private boolean subjectCachingEnabled;
private Environment environment;
@Autowired
public AttributeCacheFactory(final Environment environment) {
this.environment = environment;
}
private AttributeCacheFactory() {
throw new AssertionError();
}
public AttributeCache createResourceAttributeCache(final long maxCachedIntervalMinutes, final String zoneName,
final RedisTemplate<String, String> resourceCacheRedisTemplate) {
return createAttributeCache(AttributeCache.RESOURCE, maxCachedIntervalMinutes, zoneName,
resourceCacheRedisTemplate, AbstractAttributeCache::resourceKey, resourceCachingEnabled);
}
public AttributeCache createSubjectAttributeCache(final long maxCachedIntervalMinutes, final String zoneName,
final RedisTemplate<String, String> subjectCacheRedisTemplate) {
return createAttributeCache(AttributeCache.SUBJECT, maxCachedIntervalMinutes, zoneName,
subjectCacheRedisTemplate, AbstractAttributeCache::subjectKey, subjectCachingEnabled);
}
private AttributeCache createAttributeCache(final String cacheType, final long maxCachedIntervalMinutes,
final String zoneName, final RedisTemplate<String, String> cacheRedisTemplate,
final BiFunction<String, String, String> getKey, final boolean enableAttributeCaching) {
String[] profiles = environment.getActiveProfiles();
if (!enableAttributeCaching) {
LOGGER.info("Caching disabled for {} attributes.", cacheType);
return new NonCachingAttributeCache();
}
if (ArrayUtils.contains(profiles, "redis") || ArrayUtils.contains(profiles, "cloud-redis")) {
LOGGER.info("Redis caching enabled for {} attributes.", cacheType);
return new RedisAttributeCache(maxCachedIntervalMinutes, zoneName, getKey, cacheRedisTemplate);
}
LOGGER.info("In-memory caching enabled for {} attributes.", cacheType);
return new InMemoryAttributeCache(maxCachedIntervalMinutes, zoneName, getKey);
}
}