/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.cache.source; import java.util.Collection; import java.util.Map; import com.opengamma.core.change.ChangeManager; import com.opengamma.core.config.ConfigSource; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdentifiable; import com.opengamma.id.VersionCorrection; import com.opengamma.sesame.cache.CacheInvalidator; import com.opengamma.util.ArgumentChecker; /** * */ public class CacheAwareConfigSource implements ConfigSource { private final ConfigSource _delegate; private final CacheInvalidator _cacheInvalidator; /* package */ public CacheAwareConfigSource(ConfigSource delegate, CacheInvalidator cacheInvalidator) { _cacheInvalidator = ArgumentChecker.notNull(cacheInvalidator, "cacheInvalidator"); _delegate = ArgumentChecker.notNull(delegate, "delegate"); } @Override public ConfigItem<?> get(UniqueId uniqueId) { return register(_delegate.get(uniqueId)); } @Override public ConfigItem<?> get(ObjectId objectId, VersionCorrection versionCorrection) { return register(_delegate.get(objectId, versionCorrection)); } @Override public <R> Collection<ConfigItem<R>> get(Class<R> clazz, String configName, VersionCorrection versionCorrection) { return register(_delegate.get(clazz, configName, versionCorrection)); } @Override public <R> Collection<ConfigItem<R>> getAll(Class<R> clazz, VersionCorrection versionCorrection) { return register(_delegate.getAll(clazz, versionCorrection)); } @Override public <R> R getConfig(Class<R> clazz, UniqueId uniqueId) { R config = _delegate.getConfig(clazz, uniqueId); // if there's no config with the specified ID the delegate will throw an exception and registration won't happen _cacheInvalidator.register(uniqueId.getObjectId()); return config; } @Override public <R> R getConfig(Class<R> clazz, ObjectId objectId, VersionCorrection versionCorrection) { R config = _delegate.getConfig(clazz, objectId, versionCorrection); // if there's no config with the specified ID the delegate will throw an exception and registration won't happen _cacheInvalidator.register(objectId); return config; } @Override public <R> R getSingle(Class<R> clazz, String configName, VersionCorrection versionCorrection) { Collection<ConfigItem<R>> result = get(clazz, configName, versionCorrection); if (result.isEmpty()) { return null; } else { ConfigItem<R> item = result.iterator().next(); register(item); return item.getValue(); } } @Override public <R> R getLatestByName(Class<R> clazz, String name) { Collection<ConfigItem<R>> result = get(clazz, name, VersionCorrection.LATEST); if (result.isEmpty()) { return null; } else { ConfigItem<R> item = result.iterator().next(); register(item); return item.getValue(); } } @Override public Map<UniqueId, ConfigItem<?>> get(Collection<UniqueId> uniqueIds) { return register(_delegate.get(uniqueIds)); } @Override public Map<ObjectId, ConfigItem<?>> get(Collection<ObjectId> objectIds, VersionCorrection versionCorrection) { return register(_delegate.get(objectIds, versionCorrection)); } @Override public ChangeManager changeManager() { return _delegate.changeManager(); } private <K> Map<K, ConfigItem<?>> register(Map<K, ConfigItem<?>> items) { register(items.values()); return items; } private <T extends ConfigItem<?>> Collection<T> register(Collection<T> items) { for (UniqueIdentifiable item : items) { _cacheInvalidator.register(item.getUniqueId().getObjectId()); } return items; } private <T extends ConfigItem<?>> T register(T item) { if (item != null) { _cacheInvalidator.register(item.getUniqueId().getObjectId()); } return item; } }