org.openmrs.api.cache.CachePropertiesUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.api.cache.CachePropertiesUtil.java

Source

/**
 * 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);
        }
    }
}