/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.region.impl; import java.util.Collection; import java.util.Map; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Ordering; import com.opengamma.core.change.ChangeManager; import com.opengamma.core.region.Region; import com.opengamma.core.region.RegionSource; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.ArgumentChecker; /** * A region source that delegates to an another source, but which ensures that * it only calls the get methods on the delegate. This is intended to allow * the use of proxy classes as the delegates which allows different * behaviours e.g. capturing the data returned from sources. */ public class NarrowingRegionSource implements RegionSource { private final RegionSource _delegate; /** * Create a narrowing source, wrapping the provided source. * * @param delegate the source to delegate to, not null */ public NarrowingRegionSource(RegionSource delegate) { _delegate = ArgumentChecker.notNull(delegate, "delegate"); } @Override public Region getHighestLevelRegion(ExternalId externalId) { return getHighestLevelRegion(externalId.toBundle()); } @Override public Region getHighestLevelRegion(ExternalIdBundle bundle) { Collection<Region> regions = get(bundle, VersionCorrection.LATEST); return regions.isEmpty() ? null : Ordering.from(RegionComparator.ASC).min(regions); } @Override public Collection<Region> get(ExternalIdBundle bundle, VersionCorrection versionCorrection) { return _delegate.get(bundle, versionCorrection); } @Override public Map<ExternalIdBundle, Collection<Region>> getAll(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) { ImmutableMap.Builder<ExternalIdBundle, Collection<Region>> builder = ImmutableMap.builder(); for (ExternalIdBundle bundle : bundles) { Collection<Region> regions = get(bundle, versionCorrection); if (!regions.isEmpty()) { builder.put(bundle, regions); } } return builder.build(); } @Override public Collection<Region> get(ExternalIdBundle bundle) { return _delegate.get(bundle); } @Override public Region getSingle(ExternalIdBundle bundle) { return getSingle(bundle, VersionCorrection.LATEST); } @Override public Region getSingle(ExternalIdBundle bundle, VersionCorrection versionCorrection) { Collection<Region> regions = get(bundle, versionCorrection); return regions.isEmpty() ? null : regions.iterator().next(); } @Override public Map<ExternalIdBundle, Region> getSingle(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) { ImmutableMap.Builder<ExternalIdBundle, Region> builder = ImmutableMap.builder(); for (ExternalIdBundle bundle : bundles) { Region region = getSingle(bundle, versionCorrection); if (region != null) { builder.put(bundle, region); } } return builder.build(); } @Override public ChangeManager changeManager() { return _delegate.changeManager(); } @Override public Region get(UniqueId uniqueId) { return _delegate.get(uniqueId); } @Override public Region get(ObjectId objectId, VersionCorrection versionCorrection) { return _delegate.get(objectId, versionCorrection); } @Override public Map<UniqueId, Region> get(Collection<UniqueId> uniqueIds) { return _delegate.get(uniqueIds); } @Override public Map<ObjectId, Region> get(Collection<ObjectId> objectIds, VersionCorrection versionCorrection) { return _delegate.get(objectIds, versionCorrection); } }