/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.api.cache;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import net.sf.ehcache.config.CacheConfiguration;
public class CachePropertiesUtil {
/**
* This method looks for all apiCacheConfig.properties file located in cacheConfig folder in classpath
* @return list of CacheConfiguration objects
*/
public static List<CacheConfiguration> getCacheConfigurations(){
List<CacheConfiguration> openmrsCacheConfigurationList = new ArrayList<>();
Resource[] resourceFromClassPath = getResourceFromClassPath();
Arrays.stream(resourceFromClassPath)
.forEach(r -> addCacheConfigsFormResourceToList(r, openmrsCacheConfigurationList));
return openmrsCacheConfigurationList;
}
private static CacheConfiguration createCacheConfiguration(OpenmrsCacheConfiguration openmrsCacheConfiguration) {
CacheConfiguration cacheConfiguration = new CacheConfiguration();
openmrsCacheConfiguration.getAllKeys()
.forEach(key -> {
try {
BeanUtils.setProperty(cacheConfiguration, key, openmrsCacheConfiguration.getProperty(key));
} catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException(e);
}
});
return cacheConfiguration;
}
private static void addCacheConfigsFormResourceToList(Resource resource, List<CacheConfiguration> openmrsCacheConfigurationList) {
Properties cacheProperties = getPropertiesFromResource(resource);
getAllCacheNames(cacheProperties.keySet())
.forEach(cacheName -> {
OpenmrsCacheConfiguration openmrsCacheConfiguration = new OpenmrsCacheConfiguration();
openmrsCacheConfiguration.addProperty("name", cacheName);
cacheProperties.keySet()
.stream()
.filter(key -> key.toString().startsWith(cacheName))
.forEach(key -> {
String s = key.toString();
openmrsCacheConfiguration.addProperty(
s.replace(cacheName+".", ""),
cacheProperties.getProperty(key.toString()));
});
openmrsCacheConfigurationList.add(createCacheConfiguration(openmrsCacheConfiguration));
});
}
private static Set<String> getAllCacheNames(Set<Object> keys) {
Set<String> cacheNames = new HashSet<>();
keys.forEach(cacheName -> {
String s = cacheName.toString();
cacheNames.add(s.substring(0, s.indexOf(".")));
});
return cacheNames;
}
private static Properties getPropertiesFromResource(Resource resource) {
Properties properties = new Properties();
try (InputStream inputStream = resource.getInputStream()){
properties.load(inputStream);
return properties;
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
private static Resource[] getResourceFromClassPath() {
ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
try {
return patternResolver.getResources("classpath*:apiCacheConfig.properties");
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}