/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.analytics.blotter;
import com.opengamma.financial.security.FinancialSecurityVisitorSameValueAdapter;
import com.opengamma.financial.security.cds.AbstractCreditDefaultSwapSecurity;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexSecurity;
import com.opengamma.financial.security.cds.LegacyFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.LegacyRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.LegacyVanillaCDSSecurity;
import com.opengamma.financial.security.cds.StandardFixedRecoveryCDSSecurity;
import com.opengamma.financial.security.cds.StandardRecoveryLockCDSSecurity;
import com.opengamma.financial.security.cds.StandardVanillaCDSSecurity;
import com.opengamma.financial.security.swap.SwapSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.security.SecurityDocument;
import com.opengamma.master.security.SecurityMaster;
import com.opengamma.util.ArgumentChecker;
/**
* Returns an {@link ExternalId} with the scheme {@link UniqueId#EXTERNAL_SCHEME} for on OTC security which can be
* used as the underlying ID in another security. Currently only supports {@link SwapSecurity}, returns null for all
* other security types. If the security doesn't have an existing ID then one is created from its unique ID. So
* this can only be used on a security which have been saved and has an ID.
* TODO this isn't nice as the security has to be saved twice, once to get the unique ID and once to add the external ID
* it would be better if SwaptionSecurity referred to its underlying with a SecurityLink. but it doesn't (yet?)
* TODO update this once Swaption has been updated to use a link to refer to its underlying
*/
/* package */ class ExternalIdVisitor extends FinancialSecurityVisitorSameValueAdapter<ExternalId> {
private final SecurityMaster _securityMaster;
/* package */ ExternalIdVisitor(SecurityMaster securityMaster) {
super(null);
ArgumentChecker.notNull(securityMaster, "securityMaster");
_securityMaster = securityMaster;
}
@Override
public ExternalId visitSwapSecurity(SwapSecurity security) {
ExternalId id = security.getExternalIdBundle().getExternalId(UniqueId.EXTERNAL_SCHEME);
if (id != null) {
return id;
}
UniqueId uniqueId = security.getUniqueId();
if (uniqueId == null) {
throw new IllegalStateException("Security must have a unique ID");
}
ObjectId objectId = uniqueId.getObjectId();
ExternalId externalId = ExternalId.of(ObjectId.EXTERNAL_SCHEME, objectId.toString());
security.addExternalId(externalId);
_securityMaster.update(new SecurityDocument(security));
return externalId;
}
@Override
public ExternalId visitCreditDefaultSwapIndexSecurity(CreditDefaultSwapIndexSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitLegacyFixedRecoveryCDSSecurity(LegacyFixedRecoveryCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitLegacyRecoveryLockCDSSecurity(LegacyRecoveryLockCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitStandardFixedRecoveryCDSSecurity(StandardFixedRecoveryCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitStandardRecoveryLockCDSSecurity(StandardRecoveryLockCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitStandardVanillaCDSSecurity(StandardVanillaCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
@Override
public ExternalId visitLegacyVanillaCDSSecurity(LegacyVanillaCDSSecurity security) {
return commonCDSSecurityExternalId(security);
}
private ExternalId commonCDSSecurityExternalId(AbstractCreditDefaultSwapSecurity security) {
if (!security.getExternalIdBundle().isEmpty()) {
return security.getExternalIdBundle().getExternalIds().iterator().next();
}
UniqueId uniqueId = security.getUniqueId();
if (uniqueId == null) {
throw new IllegalStateException("Security must have a unique ID");
}
ObjectId objectId = uniqueId.getObjectId();
ExternalId externalId = ExternalId.of(ObjectId.EXTERNAL_SCHEME, objectId.toString());
security.addExternalId(externalId);
_securityMaster.update(new SecurityDocument(security));
return externalId;
}
}