package org.openslx.dozmod.thrift.cache; import java.util.List; import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.Virtualizer; import org.openslx.thrifthelper.ThriftManager; import org.openslx.util.GenericDataCache; import org.openslx.util.GenericDataCache.CacheMode; public class MetaDataCache { private static final Logger LOGGER = Logger.getLogger(MetaDataCache.class); /** * How long to cache data. */ private static final int CACHE_TIME_MS = 60 * 60 * 1000; private static final GenericDataCache> osCache = new GenericDataCache>( CACHE_TIME_MS) { @Override protected List update() throws TException { try { return ThriftManager.getSatClient().getOperatingSystems(); } catch (Exception e) { LOGGER.warn("Could not get OS list from satellite, trying master for backup...", e); } return ThriftManager.getMasterClient().getOperatingSystems(); } }; private static final GenericDataCache> virtualizerCache = new GenericDataCache>( CACHE_TIME_MS) { @Override protected List update() throws TException { try { return ThriftManager.getSatClient().getVirtualizers(); } catch (TException e) { LOGGER.warn("Could not get virtualizer list from satellite, trying master for backup...", e); } return ThriftManager.getMasterClient().getVirtualizers(); } }; /** * Get all known/valid operating systems an image can be marked as. * * @return */ public static List getOperatingSystems() { return osCache.get(); } public static OperatingSystem getOsById(int id) { return getOsById(id, false); } public static OperatingSystem getOsById(int id, boolean forceCache) { // First, try in "always cached" mode List list = osCache.get(CacheMode.FORCE_CACHED); OperatingSystem os = getOsById(id, list); if (os != null || forceCache) return os; // Try again with a potential refresh List newList = osCache.get(CacheMode.DEFAULT); if (list == newList) // Returned list from cache as it was still recent enough return null; return getOsById(id, newList); } private static OperatingSystem getOsById(int id, List list) { if (list != null) { for (OperatingSystem os : list) { if (os.getOsId() == id) return os; } } return null; } /** * Get all supported virtualizers an image can be declared to be run as. * * @return */ public static List getVirtualizers() { return virtualizerCache.get(); } public static Virtualizer getVirtualizerById(String virtId) { return getVirtualizerById(virtId, false); } public static Virtualizer getVirtualizerById(String virtId, boolean forceCache) { // First, try in "always cached" mode List list = virtualizerCache.get(CacheMode.FORCE_CACHED); Virtualizer virt = getVirtualizerById(virtId, list); if (virt != null || forceCache) return virt; // Try again with a potential refresh List newList = virtualizerCache.get(CacheMode.DEFAULT); if (list == newList) // Returned list from cache as it was still recent enough return null; return getVirtualizerById(virtId, newList); } private static Virtualizer getVirtualizerById(String virtId, List list) { if (list != null) { for (Virtualizer virt : list) { if (virt.getVirtId().equals(virtId)) return virt; } } return null; } }