/* * Copyright 2009-2014 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. */ package com.eucalyptus.storage.config; import java.util.concurrent.TimeUnit; import com.eucalyptus.util.Exceptions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; /** * Created by zhill on 5/5/14. * * A repository of configuration entities to be updated periodically and to get the current cached value */ public class ConfigurationCache { private static final long ENTRY_EXPIRATION_TIME_SEC = 5l; // 5 seconds for each entry's valid period protected static final LoadingCache<Class<? extends CacheableConfiguration>, CacheableConfiguration> configCache = CacheBuilder.newBuilder() .refreshAfterWrite(ENTRY_EXPIRATION_TIME_SEC, TimeUnit.SECONDS) .build(new CacheLoader<Class<? extends CacheableConfiguration>, CacheableConfiguration>() { @Override public CacheableConfiguration load(Class<? extends CacheableConfiguration> aClass) throws Exception { return (CacheableConfiguration) (aClass.newInstance()).getLatest(); } }); public static <T extends CacheableConfiguration> T getConfiguration(Class<T> configType) { try { return (T) configCache.get(configType); } catch (Throwable f) { throw Exceptions.toUndeclared("No configuration entry found for type " + configType.getName(), f); } } }