/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target.resolver;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Maps;
import com.opengamma.DataNotFoundException;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
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 {@link ObjectResolver} built on a {@link SecuritySource}.
*/
public class SecuritySourceResolver extends AbstractIdentifierResolver implements Resolver<Security> {
private final SecuritySource _underlying;
public SecuritySourceResolver(final SecuritySource underlying) {
ArgumentChecker.notNull(underlying, "underlying");
_underlying = underlying;
}
protected SecuritySource getUnderlying() {
return _underlying;
}
protected ExternalIdBundle replaceWeakTickers(final ExternalIdBundle identifiers) {
final String bbgWeakTicker = identifiers.getValue(ExternalSchemes.BLOOMBERG_TICKER_WEAK);
final String bbgWeakBUID = identifiers.getValue(ExternalSchemes.BLOOMBERG_BUID_WEAK);
if ((bbgWeakTicker != null) || (bbgWeakBUID != null)) {
final List<ExternalId> ids = new ArrayList<ExternalId>();
for (final ExternalId identifier : identifiers) {
if (ExternalSchemes.BLOOMBERG_TICKER_WEAK.equals(identifier.getScheme())) {
ids.add(ExternalId.of(ExternalSchemes.BLOOMBERG_TICKER, identifier.getValue()));
} else if (ExternalSchemes.BLOOMBERG_BUID_WEAK.equals(identifier.getScheme())) {
ids.add(ExternalId.of(ExternalSchemes.BLOOMBERG_BUID, identifier.getValue()));
} else {
ids.add(identifier);
}
}
return ExternalIdBundle.of(ids);
} else {
return identifiers;
}
}
// ObjectResolver
@Override
public Security resolveObject(final UniqueId uniqueId, final VersionCorrection versionCorrection) {
try {
return getUnderlying().get(uniqueId);
} catch (final DataNotFoundException e) {
return null;
}
}
@Override
public DeepResolver deepResolver() {
return null;
}
@Override
public ChangeManager changeManager() {
return getUnderlying().changeManager();
}
// IdentifierResolver
@Override
public UniqueId resolveExternalId(final ExternalIdBundle identifiers, final VersionCorrection versionCorrection) {
final Security security = getUnderlying().getSingle(replaceWeakTickers(identifiers), versionCorrection);
if (security == null) {
return null;
} else {
return security.getUniqueId();
}
}
@Override
public Map<ExternalIdBundle, UniqueId> resolveExternalIds(final Collection<ExternalIdBundle> identifiers, final VersionCorrection versionCorrection) {
final Map<ExternalIdBundle, ? extends Security> securities = getUnderlying().getSingle(identifiers, versionCorrection);
final Map<ExternalIdBundle, UniqueId> result = Maps.newHashMapWithExpectedSize(securities.size());
for (Map.Entry<ExternalIdBundle, ? extends Security> security : securities.entrySet()) {
result.put(security.getKey(), security.getValue().getUniqueId());
}
return result;
}
@Override
public UniqueId resolveObjectId(final ObjectId identifier, final VersionCorrection versionCorrection) {
try {
return getUnderlying().get(identifier, versionCorrection).getUniqueId();
} catch (final DataNotFoundException e) {
return null;
}
}
@Override
public Map<ObjectId, UniqueId> resolveObjectIds(final Collection<ObjectId> identifiers, final VersionCorrection versionCorrection) {
final Map<ObjectId, Security> securities = getUnderlying().get(identifiers, versionCorrection);
final Map<ObjectId, UniqueId> result = Maps.newHashMapWithExpectedSize(securities.size());
for (Map.Entry<ObjectId, Security> security : securities.entrySet()) {
result.put(security.getKey(), security.getValue().getUniqueId());
}
return result;
}
}