/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.timecache; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import org.diirt.datasource.timecache.query.Query; import org.diirt.datasource.timecache.query.QueryImpl; import org.diirt.datasource.timecache.query.QueryParameters; import org.diirt.vtype.VType; /** * @author Fred Arnaud (Sopra Group) - ITER */ public class CacheImpl implements Cache { private boolean statisticsEnabled = false; private Map<String, PVCache> cachedPVs = new ConcurrentHashMap<String, PVCache>(); private Map<Parameter, CacheConfig> configMap = new ConcurrentHashMap<Parameter, CacheConfig>(); public CacheImpl(CacheConfig defaultConfig) { configMap.put(Parameter.Default, defaultConfig); } /** {@inheritDoc} */ @Override public <V extends VType> Query createQuery(String channelName, Class<V> type, QueryParameters parameters) { CacheConfig config = configMap.get(parameters.config); if (config == null) config = configMap.get(Parameter.Default); PVCache pvCache = (PVCache) cachedPVs.get(channelName); if (pvCache == null) { pvCache = new PVCacheImpl(channelName, config.getSources(), config.getStorage()); // TODO: calculate retrieval gap from statistics ((PVCacheImpl) pvCache).setRetrievalGap(config.getRetrievalGap()); pvCache.setStatisticsEnabled(statisticsEnabled); cachedPVs.put(channelName, pvCache); } Query query = new QueryImpl(pvCache, config.getNbOfChunksPerQuery()); query.update(parameters); return query; } /** * @return number of initialized {@link PVCache}. */ public int getCount() { return cachedPVs.size(); } /** {@inheritDoc} */ @Override public void addConfig(Parameter p, CacheConfig config) { if (p != null) configMap.put(p, config); } /** {@inheritDoc} */ @Override public void removeConfig(Parameter p) { if (p != null && !p.equals(Parameter.Default)) configMap.remove(p); } /** {@inheritDoc} */ @Override public void setStatisticsEnabled(boolean enabled) { this.statisticsEnabled = enabled; for (PVCache pvCache : cachedPVs.values()) pvCache.setStatisticsEnabled(statisticsEnabled); } /** {@inheritDoc} */ @Override public CacheStatistics getStatistics() { final CacheStatistics stats = CacheStatistics.get(); for (Entry<String, PVCache> entry : cachedPVs.entrySet()) stats.addPVStats(entry.getKey(), entry.getValue().getStatistics()); return stats; } /** {@inheritDoc} */ @Override public void flush() { for (PVCache pvCache : cachedPVs.values()) pvCache.flush(); } }