/**
* Copyright 2016 Hortonworks.
*
* 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.
**/
package com.hortonworks.registries.cache.view.service;
import com.hortonworks.registries.cache.view.Factory;
import com.hortonworks.registries.cache.view.config.CacheConfig;
import com.hortonworks.registries.cache.view.config.ExpiryPolicy;
import com.hortonworks.registries.cache.view.config.TypeConfig;
import com.hortonworks.registries.cache.view.config.ViewConfig;
import com.hortonworks.registries.cache.view.impl.redis.RedisHashesCache;
import com.hortonworks.registries.cache.view.impl.redis.RedisStringsCache;
import com.lambdaworks.redis.RedisConnection;
import java.util.Arrays;
import java.util.List;
public class RedisCacheService<K,V> extends DataStoreBackedCacheService<K, V> {
private final Factory<RedisConnection<K,V>> connFactory;
private RedisCacheService(Builder<K,V> builder) {
super(builder);
this.connFactory = builder.connFactory;
}
public static class Builder<K,V> extends DataStoreBackedCacheService.Builder<K,V> {
private final Factory<RedisConnection<K,V>> connFactory;
public Builder(String id, TypeConfig.Cache cacheType, Factory<RedisConnection<K,V>> connFactory) {
super(id, cacheType);
this.connFactory = connFactory;
}
public RedisCacheService<K,V> build() {
return new RedisCacheService<>(this);
}
public RedisCacheService<K,V> build(CacheConfig cacheConfig) {
RedisCacheService<K, V> cacheService = new RedisCacheService<>(this);
registerCaches(cacheService, cacheConfig);
return cacheService;
}
private void registerCaches(RedisCacheService<K, V> cacheService, CacheConfig cacheConfig) {
List<ViewConfig> viewsConfig = cacheConfig.getViewsConfig();
for (ViewConfig viewConfig : viewsConfig) {
registerCache(cacheService, viewConfig);
}
}
private void registerCache(RedisCacheService<K, V> cacheService, ViewConfig viewConfig) {
final ExpiryPolicy expiryPolicy = viewConfig.getExpiryPolicy();
final String id = viewConfig.getId();
final TypeConfig.RedisDatatype redisDatatype = ((ViewConfig.RedisViewConfig) viewConfig).getRedisDatatype();
switch (redisDatatype) {
case STRINGS:
cacheService.registerStringsCache(id, expiryPolicy);
break;
case HASHES:
String key = ((ViewConfig.RedisViewConfig) viewConfig).getKey();
cacheService.registerHashesCache(id, (K) key, expiryPolicy);
break;
default:
throw new IllegalStateException("Unsupported Redis type: " + redisDatatype
+ ". Valid options are " + Arrays.toString(TypeConfig.RedisDatatype.values()));
}
}
}
public void registerHashesCache(String id, K key) {
registerHashesCache(id, key, super.expiryPolicy);
}
public void registerHashesCache(String id, K key, ExpiryPolicy expiryPolicy) {
registerCache(id, createRedisHashesCache(key, expiryPolicy));
}
public void registerStringsCache(String id) {
registerStringsCache(id, super.expiryPolicy);
}
public void registerStringsCache(String id, ExpiryPolicy expiryPolicy) {
registerCache(id, createRedisStringsCache(expiryPolicy));
}
public void registerDelegateCache(String id) {
//TODO
}
public Factory<RedisConnection<K, V>> getConnFactory() {
return connFactory;
}
private RedisHashesCache<K, V> createRedisHashesCache(K key, ExpiryPolicy expiryPolicy) {
final ExpiryPolicy ep = expiryPolicy != null ? expiryPolicy : super.expiryPolicy;
return new RedisHashesCache<>(connFactory.create(), key, ep);
}
private RedisStringsCache<K, V> createRedisStringsCache(ExpiryPolicy expiryPolicy) {
final ExpiryPolicy ep = expiryPolicy != null ? expiryPolicy : super.expiryPolicy;
return new RedisStringsCache<>(connFactory.create(), ep);
}
}