package org.ff4j.cache; /* * #%L * ff4j-store-jcache * %% * Copyright (C) 2013 - 2015 FF4J * %% * 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. * #L% */ import java.util.HashSet; import java.util.Set; import javax.cache.Cache; import org.ff4j.core.Feature; import org.ff4j.property.Property; /** * Implementation of {@link FF4JCacheManager} with reference interface JCache {@link Cache}. * * @author Cedrick Lunven (@clunven)</a> */ public class FF4jJCacheManager extends FF4jJCacheProvider implements FF4JCacheManager { /** cache name of the features. */ protected static final String CACHENAME_FEATURES = "ff4jFeatures"; /** cache name of the properties. */ protected static final String CACHENAME_PROPERTIES = "ff4jProperties"; /** Implementing a JCache CacheProvider. */ protected Cache<String, Feature> featuresCache; /** Implementing a JCache CacheProvider. */ @SuppressWarnings("rawtypes") protected Cache<String, Property> propertiesCache; /** * Initialisation of internal caches. */ public FF4jJCacheManager() { // Initialization of both caching provider and manager super(); featuresCache = createCacheForFeatures(); propertiesCache = createCacheForProperties(); } /** * Initialisation of internal caches. */ public FF4jJCacheManager(String cachingProviderClassName) { // Initialization of both caching provider and manager super(cachingProviderClassName); featuresCache = createCacheForFeatures(); propertiesCache = createCacheForProperties(); } /** * Default initialisation of cache. * * @return */ protected Cache<String, Feature> createCacheForFeatures() { if (null == getCacheManager().getCache(CACHENAME_FEATURES, String.class, Feature.class)) { getCacheManager().createCache(CACHENAME_FEATURES, getFeatureCacheConfiguration()); } return getCacheManager().getCache(CACHENAME_FEATURES, String.class, Feature.class); } /** * Default initialisation of cache. * * @return */ @SuppressWarnings("rawtypes") protected Cache<String, Property> createCacheForProperties() { if (null == getCacheManager().getCache(CACHENAME_PROPERTIES, String.class, Property.class)) { getCacheManager().createCache(CACHENAME_PROPERTIES, getPropertyCacheConfiguration()); } return getCacheManager().getCache(CACHENAME_PROPERTIES, String.class, Property.class); } /** {@inheritDoc} */ public Set<String> listCachedFeatureNames() { Set<String> keys = new HashSet<>(); // Implements iterate, more elegant as stream how ? getFeaturesCache().forEach(e->keys.add(e.getKey())); return keys; } /** {@inheritDoc} */ public Object getNativeCache() { return featuresCache; } /** {@inheritDoc} */ public String getCacheProviderName() { return "jCache:" + featuresCache.getName() + ":" + featuresCache.getCacheManager().getCachingProvider().toString(); } /** {@inheritDoc} */ @Override public void clearFeatures() { getFeaturesCache().clear(); } /** {@inheritDoc} */ @Override public void clearProperties() { getPropertiesCache().clear(); } /** {@inheritDoc} */ @Override public void evictFeature(String featureId) { if (getFeaturesCache().containsKey(featureId)) { getFeaturesCache().remove(featureId); } } /** {@inheritDoc} */ @Override public void evictProperty(String propertyName) { if (getPropertiesCache().containsKey(propertyName)) { getPropertiesCache().remove(propertyName); } } /** {@inheritDoc} */ @Override public void putFeature(Feature feat) { getFeaturesCache().put(feat.getUid(), feat); } /** {@inheritDoc} */ @Override public void putProperty(Property<?> feat) { getPropertiesCache().put(feat.getName(), feat); } /** {@inheritDoc} */ @Override public Feature getFeature(String featureId) { return getFeaturesCache().get(featureId); } /** {@inheritDoc} */ @Override public Property<?> getProperty(String name) { return getPropertiesCache().get(name); } /** {@inheritDoc} */ @Override public Set<String> listCachedPropertyNames() { Set<String> keys = new HashSet<>(); // Implements iterate, more elegant as stream how ? getPropertiesCache().forEach(e->keys.add(e.getKey())); return keys; } /** {@inheritDoc} */ @Override public Object getFeatureNativeCache() { return getFeaturesCache(); } /** {@inheritDoc} */ @Override public Object getPropertyNativeCache() { return getPropertiesCache(); } /** * Getter accessor for attribute 'featuresCache'. * * @return * current value of 'featuresCache' */ public Cache<String, Feature> getFeaturesCache() { return featuresCache; } /** * Setter accessor for attribute 'featuresCache'. * @param featuresCache * new value for 'featuresCache ' */ public void setFeaturesCache(Cache<String, Feature> featuresCache) { this.featuresCache = featuresCache; } /** * Getter accessor for attribute 'propertiesCache'. * * @return * current value of 'propertiesCache' */ @SuppressWarnings("rawtypes") public Cache<String, Property> getPropertiesCache() { return propertiesCache; } }