package fi.otavanopisto.muikku.plugins.schooldatapyramus.rest.cache; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import fi.otavanopisto.pyramus.webhooks.WebhookType; @ApplicationScoped public class CacheConfigs { @Inject private Logger logger; @PostConstruct public void init() { InputStream settingStream = getClass() .getClassLoader() .getResourceAsStream("pyramus-rest-cache-config.json"); try { config = new ObjectMapper().readValue(settingStream, PyramusCacheConfig.class); } catch (IOException e) { logger.log(Level.SEVERE, "Failed to parse Pyramus cache settings file", e); } if (settingStream == null) { logger.severe("Could not read Pyramus cache settings file"); config = new PyramusCacheConfig(); config.setDefaultSettings(new CacheConfig(new ArrayList<String>(), CacheStrategy.NONE, 0l)); config.setSettings(new HashMap<String, CacheConfig>()); } } public List<String> getEvictTypePaths(WebhookType type) { List<String> result = new ArrayList<>(); for (String key : config.getSettings().keySet()) { CacheConfig setting = config.getSettings().get(key); if ((setting.getEvictOn() != null) && setting.getEvictOn().contains(type)) { result.add(key); } } return result; } public CacheConfig getCacheConfig(String requestPath) { if (StringUtils.isNotBlank(requestPath)) { for (String settingKey : config.getSettings().keySet()) { String path = settingKey.replaceAll("\\{[a-zA-Z]*\\}", "([a-zA-Z0-9]*)"); if (requestPath.matches(path)) { logger.fine(String.format("Using cache settings %s for path %s", settingKey, path)); return config.getSettings().get(settingKey); } } } return config.getDefaultSettings(); } private PyramusCacheConfig config; public static class PyramusCacheConfig { public CacheConfig getDefaultSettings() { return defaultSettings; } public void setDefaultSettings(CacheConfig defaultSettings) { this.defaultSettings = defaultSettings; } public Map<String, CacheConfig> getSettings() { return settings; } public void setSettings(Map<String, CacheConfig> settings) { this.settings = settings; } @JsonProperty ("default") private CacheConfig defaultSettings; private Map<String, CacheConfig> settings; } }