/**
* 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.SourceWithExternalBundle;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.id.ExternalBundleIdentifiable;
import com.opengamma.id.ExternalIdBundle;
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;
/**
*
*/
/* package */ abstract class CacheAwareSourceWithExternalBundle<V extends UniqueIdentifiable & ExternalBundleIdentifiable>
implements SourceWithExternalBundle<V> {
private final SourceWithExternalBundle<V> _delegate;
private final CacheInvalidator _cacheInvalidator;
/* package */ CacheAwareSourceWithExternalBundle(SourceWithExternalBundle<V> delegate, CacheInvalidator cacheInvalidator) {
_cacheInvalidator = ArgumentChecker.notNull(cacheInvalidator, "cacheInvalidator");
_delegate = ArgumentChecker.notNull(delegate, "delegate");
}
@Override
public Collection<V> get(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
return register(_delegate.get(bundle, versionCorrection));
}
@Override
public Map<ExternalIdBundle, Collection<V>> getAll(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) {
Map<ExternalIdBundle, Collection<V>> results = _delegate.getAll(bundles, versionCorrection);
for (Collection<V> items : results.values()) {
register(items);
}
return results;
}
@Override
public Collection<V> get(ExternalIdBundle bundle) {
return register(_delegate.get(bundle));
}
@Override
public V getSingle(ExternalIdBundle bundle) {
return register(_delegate.getSingle(bundle));
}
@Override
public V getSingle(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
return register(_delegate.getSingle(bundle, versionCorrection));
}
@Override
public Map<ExternalIdBundle, V> getSingle(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) {
return register(_delegate.getSingle(bundles, versionCorrection));
}
@Override
public V get(UniqueId uniqueId) {
return register(_delegate.get(uniqueId));
}
@Override
public V get(ObjectId objectId, VersionCorrection versionCorrection) {
return register(_delegate.get(objectId, versionCorrection));
}
@Override
public Map<UniqueId, V> get(Collection<UniqueId> uniqueIds) {
return register(_delegate.get(uniqueIds));
}
@Override
public Map<ObjectId, V> get(Collection<ObjectId> objectIds, VersionCorrection versionCorrection) {
return register(_delegate.get(objectIds, versionCorrection));
}
@Override
public ChangeManager changeManager() {
return _delegate.changeManager();
}
private <K> Map<K, V> register(Map<K, V> items) {
register(items.values());
return items;
}
private Collection<V> register(Collection<V> items) {
for (UniqueIdentifiable item : items) {
_cacheInvalidator.register(item.getUniqueId().getObjectId());
}
return items;
}
/* package */ <T extends V> T register(T item) {
if (item != null) {
_cacheInvalidator.register(item.getUniqueId().getObjectId());
}
return item;
}
}