/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine;
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.change.DummyChangeManager;
import com.opengamma.core.security.AbstractSecuritySource;
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.IdUtils;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdSupplier;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;
/**
* A simple mutable implementation of a source of securities.
* <p>
* This class is intended for testing scenarios.
* It is not thread-safe and must not be used in production.
*/
public class InMemorySecuritySource extends AbstractSecuritySource implements SecuritySource {
/**
* The securities keyed by identifier.
*/
private final Map<ObjectId, Security> _securities = Maps.newHashMap();
/**
* The suppler of unique identifiers.
*/
private final UniqueIdSupplier _uidSupplier;
/**
* Creates the security master.
*/
public InMemorySecuritySource() {
_uidSupplier = new UniqueIdSupplier("Mock");
}
//-------------------------------------------------------------------------
@Override
public Security get(UniqueId uniqueId) {
ArgumentChecker.notNull(uniqueId, "uniqueId");
Security security = _securities.get(uniqueId.getObjectId());
if (security == null) {
throw new DataNotFoundException("Security not found: " + uniqueId);
}
return security;
}
@Override
public Security get(ObjectId objectId, VersionCorrection versionCorrection) {
ArgumentChecker.notNull(objectId, "objectId");
ArgumentChecker.notNull(versionCorrection, "versionCorrection");
Security security = _securities.get(objectId);
if (security == null) {
throw new DataNotFoundException("Security not found: " + objectId);
}
return security;
}
@Override
public Collection<Security> get(ExternalIdBundle bundle) {
ArgumentChecker.notNull(bundle, "bundle");
List<Security> result = new ArrayList<Security>();
for (Security sec : _securities.values()) {
if (sec.getExternalIdBundle().containsAny(bundle)) {
result.add(sec);
}
}
return result;
}
@Override
public Collection<Security> get(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
ArgumentChecker.notNull(bundle, "bundle");
ArgumentChecker.notNull(versionCorrection, "versionCorrection");
// Mock source doesn't support versioning
return get(bundle);
}
@Override
public Security getSingle(ExternalIdBundle bundle) {
ArgumentChecker.notNull(bundle, "bundle");
for (ExternalId secId : bundle.getExternalIds()) {
for (Security sec : _securities.values()) {
if (sec.getExternalIdBundle().contains(secId)) {
return sec;
}
}
}
return null;
}
@Override
public Security getSingle(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
ArgumentChecker.notNull(bundle, "bundle");
ArgumentChecker.notNull(versionCorrection, "versionCorrection");
// Mock source doesn't support versioning
return getSingle(bundle);
}
//-------------------------------------------------------------------------
@Override
public ChangeManager changeManager() {
return DummyChangeManager.INSTANCE;
}
//-------------------------------------------------------------------------
/**
* Adds a security to the master.
*
* @param security the security to add, not null
*/
public void addSecurity(Security security) {
ArgumentChecker.notNull(security, "security");
IdUtils.setInto(security, _uidSupplier.get());
_securities.put(security.getUniqueId().getObjectId(), security);
}
}