package org.springframework.roo.addon.cache.providers.guava; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.addon.cache.providers.CacheProvider; import org.springframework.roo.application.config.ApplicationConfigService; import org.springframework.roo.classpath.ModuleFeatureName; import org.springframework.roo.classpath.TypeLocationService; import org.springframework.roo.project.Dependency; import org.springframework.roo.project.ProjectOperations; import org.springframework.roo.project.maven.Pom; import java.util.List; /** * Provides implementation of {@link CacheProvider} interface by installing Guava * as intermediate memory manager. * * @author Sergio Clares */ @Component @Service public class GuavaCacheProvider implements CacheProvider { private static final String GUAVA_PROVIDER_NAME = "GUAVA"; private static final Dependency GUAVA_DEPENDENCY = new Dependency("com.google.guava", "guava", null); private static final String GUAVA_CACHE_SPEC_PROPERTY_KEY = "spring.cache.guava.spec"; private static final String GUAVA_CACHE_SPEC_PROPERTY_VALUE = "maximumSize=3,expireAfterAccess=60m,expireAfterWrite=1h"; private static final String CACHE_TYPE_PROPERTY_VALUE = "guava"; @Reference private ProjectOperations projectOperations; @Reference private TypeLocationService typeLocationService; @Reference private ApplicationConfigService applicationConfigService; List<Pom> applicationModules = null; @Override public String getName() { return GUAVA_PROVIDER_NAME; } @Override public boolean isInstalled() { if (this.applicationModules == null) { this.applicationModules = (List<Pom>) typeLocationService.getModules(ModuleFeatureName.APPLICATION); } // Look if the Guava dependency has been installed for (Pom module : applicationModules) { if (module.hasDependencyExcludingVersion(GUAVA_DEPENDENCY)) { return true; } } return false; } @Override public void setup(String profile) { if (this.applicationModules == null) { this.applicationModules = (List<Pom>) typeLocationService.getModules(ModuleFeatureName.APPLICATION); } // Add Guava dependency to each application module for (Pom module : applicationModules) { projectOperations.addDependency(module.getModuleName(), GUAVA_DEPENDENCY); // Add Guava specific application properties applicationConfigService.addProperty(module.getModuleName(), CACHE_TYPE_PROPERTY_KEY, CACHE_TYPE_PROPERTY_VALUE, profile, false); applicationConfigService.addProperty(module.getModuleName(), GUAVA_CACHE_SPEC_PROPERTY_KEY, GUAVA_CACHE_SPEC_PROPERTY_VALUE, profile, false); } } }