/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.security.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.security.AbstractSecuritySource;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.VersionCorrection;
import com.opengamma.master.AbstractMasterSource;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.master.security.SecurityDocument;
import com.opengamma.master.security.SecurityMaster;
import com.opengamma.master.security.SecuritySearchRequest;
import com.opengamma.master.security.SecuritySearchResult;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PublicSPI;
/**
* A {@code SecuritySource} implemented using an underlying {@code SecurityMaster}.
* <p>
* The {@link SecuritySource} interface provides securities to the engine via a narrow API. This class provides the source on top of a standard {@link SecurityMaster}.
*/
@PublicSPI
public class MasterSecuritySource extends AbstractMasterSource<Security, SecurityDocument, SecurityMaster> implements SecuritySource {
/**
* Creates an instance with an underlying master.
*
* @param master the master, not null
*/
public MasterSecuritySource(final SecurityMaster master) {
super(master);
}
//-------------------------------------------------------------------------
@Override
public Collection<Security> get(final ExternalIdBundle bundle) {
return get(bundle, VersionCorrection.LATEST);
}
@Override
public Collection<Security> get(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
ArgumentChecker.notNull(bundle, "bundle");
ArgumentChecker.notNull(versionCorrection, "versionCorrection");
Collection<Security> securities = new ArrayList<Security>();
for (ManageableSecurity manageableSecurity : getSecuritiesInternal(bundle, versionCorrection)) {
securities.add(manageableSecurity);
}
return securities;
}
@Override
public Map<ExternalIdBundle, Collection<Security>> getAll(final Collection<ExternalIdBundle> bundle, final VersionCorrection versionCorrection) {
return AbstractSecuritySource.getAll(this, bundle, versionCorrection);
}
@Override
public ManageableSecurity getSingle(final ExternalIdBundle bundle) {
return getSingle(bundle, VersionCorrection.LATEST);
}
@Override
public ManageableSecurity getSingle(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
ArgumentChecker.notNull(bundle, "bundle");
ArgumentChecker.notNull(versionCorrection, "versionCorrection");
final Collection<ManageableSecurity> securities = getSecuritiesInternal(bundle, versionCorrection);
// simply picks the first returned security
return securities.isEmpty() ? null : securities.iterator().next();
}
@Override
public Map<ExternalIdBundle, Security> getSingle(final Collection<ExternalIdBundle> bundle, final VersionCorrection versionCorrection) {
return AbstractSecuritySource.getSingle(this, bundle, versionCorrection);
}
@SuppressWarnings({"rawtypes", "unchecked" })
private Collection<ManageableSecurity> getSecuritiesInternal(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
final SecuritySearchRequest request = new SecuritySearchRequest();
request.addExternalIds(bundle);
request.setVersionCorrection(versionCorrection);
return (Collection) search(request).getSecurities(); // cast safe as supplied list will not be altered
}
//-------------------------------------------------------------------------
/**
* Searches for securities matching the specified search criteria.
*
* @param request the search request, not null
* @return the search result, not null
* @throws IllegalArgumentException if the request is invalid
*/
public SecuritySearchResult search(final SecuritySearchRequest request) {
return getMaster().search(request);
}
//-------------------------------------------------------------------------
@Override
public ChangeManager changeManager() {
return getMaster().changeManager();
}
}