/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.bond.definition; import org.apache.commons.lang.ObjectUtils; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.interestrate.InstrumentDerivative; import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitor; import com.opengamma.analytics.financial.legalentity.LegalEntity; import com.opengamma.financial.convention.yield.YieldConvention; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * Describes a (Treasury) Bill with settlement date. */ public class BillSecurity implements InstrumentDerivative { /** * The bill currency. */ private final Currency _currency; /** * The bill time to settlement. */ private final double _settlementTime; /** * The bill end or maturity time. */ private final double _endTime; /** * The bill nominal. */ private final double _notional; /** * The yield (to maturity) computation convention. */ private final YieldConvention _yieldConvention; /** * The accrual factor in the bill day count between settlement and maturity. */ private final double _accrualFactor; /** * The bill issuer name. */ private final String _issuerName; /** * The bill issuer. */ private final LegalEntity _issuer; /** * The name of the curve used for the bill cash flows (issuer credit). */ private final String _creditCurveName; /** * The name of the curve used for settlement amount discounting. */ private final String _discountingCurveName; /** * Constructor from all details. The legal entity contains only the issuer name. * @param currency The bill currency. * @param settlementTime The bill time to settlement. * @param endTime The bill end or maturity time. * @param notional The bill nominal. * @param yieldConvention The yield (to maturity) computation convention. * @param accrualFactor The accrual factor in the bill day count between settlement and maturity. * @param issuer The bill issuer name. * @param creditCurveName The name of the curve used for the bill cash flows (issuer credit). * @param discountingCurveName The name of the curve used for settlement amount discounting. * @deprecated Use the constructor that does not take curve names */ @Deprecated public BillSecurity(final Currency currency, final double settlementTime, final double endTime, final double notional, final YieldConvention yieldConvention, final double accrualFactor, final String issuer, final String creditCurveName, final String discountingCurveName) { this(currency, settlementTime, endTime, notional, yieldConvention, accrualFactor, new LegalEntity(null, issuer, null, null, null), creditCurveName, discountingCurveName); } /** * Constructor from all details. * @param currency The bill currency. * @param settlementTime The bill time to settlement. * @param endTime The bill end or maturity time. * @param notional The bill nominal. * @param yieldConvention The yield (to maturity) computation convention. * @param accrualFactor The accrual factor in the bill day count between settlement and maturity. * @param issuer The bill issuer name. * @param creditCurveName The name of the curve used for the bill cash flows (issuer credit). * @param discountingCurveName The name of the curve used for settlement amount discounting. * @deprecated Use the constructor that does not take curve names */ @Deprecated public BillSecurity(final Currency currency, final double settlementTime, final double endTime, final double notional, final YieldConvention yieldConvention, final double accrualFactor, final LegalEntity issuer, final String creditCurveName, final String discountingCurveName) { ArgumentChecker.notNull(currency, "Currency"); ArgumentChecker.notNull(yieldConvention, "Yield convention"); ArgumentChecker.notNull(issuer, "Issuer"); ArgumentChecker.notNull(creditCurveName, "Credit curve"); ArgumentChecker.notNull(discountingCurveName, "Discounting curve"); ArgumentChecker.isTrue(notional > 0.0, "Notional should be positive"); ArgumentChecker.isTrue(endTime >= settlementTime, "End time should be after settlement time"); ArgumentChecker.isTrue(settlementTime >= 0, "Settlement time should be positive"); _currency = currency; _endTime = endTime; _settlementTime = settlementTime; _notional = notional; _yieldConvention = yieldConvention; _accrualFactor = accrualFactor; _issuerName = issuer.getShortName(); _issuer = issuer; _creditCurveName = creditCurveName; _discountingCurveName = discountingCurveName; } /** * Constructor from all details. The legal entity contains only the issuer name. * @param currency The bill currency. * @param settlementTime The bill time to settlement. * @param endTime The bill end or maturity time. * @param notional The bill nominal. * @param yieldConvention The yield (to maturity) computation convention. * @param accrualFactor The accrual factor in the bill day count between settlement and maturity. * @param issuer The bill issuer name. */ public BillSecurity(final Currency currency, final double settlementTime, final double endTime, final double notional, final YieldConvention yieldConvention, final double accrualFactor, final String issuer) { this(currency, settlementTime, endTime, notional, yieldConvention, accrualFactor, new LegalEntity(null, issuer, null, null, null)); } /** * Constructor from all details. * @param currency The bill currency. * @param settlementTime The bill time to settlement. * @param endTime The bill end or maturity time. * @param notional The bill nominal. * @param yieldConvention The yield (to maturity) computation convention. * @param accrualFactor The accrual factor in the bill day count between settlement and maturity. * @param issuer The bill issuer name. */ public BillSecurity(final Currency currency, final double settlementTime, final double endTime, final double notional, final YieldConvention yieldConvention, final double accrualFactor, final LegalEntity issuer) { ArgumentChecker.notNull(currency, "Currency"); ArgumentChecker.notNull(yieldConvention, "Yield convention"); ArgumentChecker.notNull(issuer, "Issuer"); ArgumentChecker.isTrue(notional > 0.0, "Notional should be positive"); ArgumentChecker.isTrue(endTime >= settlementTime, "End time should be after settlement time"); ArgumentChecker.isTrue(settlementTime >= 0, "Settlement time should be positive"); _currency = currency; _endTime = endTime; _settlementTime = settlementTime; _notional = notional; _yieldConvention = yieldConvention; _accrualFactor = accrualFactor; _issuerName = issuer.getShortName(); _issuer = issuer; _creditCurveName = null; _discountingCurveName = null; } /** * Get the bill currency. * @return The currency. */ public Currency getCurrency() { return _currency; } /** * Gets the bill time to settlement. * @return The time. */ public double getSettlementTime() { return _settlementTime; } /** * Gets the bill end or maturity time. * @return The time. */ public double getEndTime() { return _endTime; } /** * Gets the bill notional. * @return The notional. */ public double getNotional() { return _notional; } /** * Gets the yield (to maturity) computation convention. * @return The convention. */ public YieldConvention getYieldConvention() { return _yieldConvention; } /** * Gets the accrual factor in the bill day count between settlement and maturity. * @return The accrual factor. */ public double getAccrualFactor() { return _accrualFactor; } /** * Gets the bill issuer name. * @return The name. */ public String getIssuer() { return _issuerName; } /** * Gets the issuer. * @return The issuer */ public LegalEntity getIssuerEntity() { return _issuer; } /** * Gets the bill issuer name and currency. * @return The name/currency. * @deprecated This information is no longer used in the curve providers. */ @Deprecated public Pair<String, Currency> getIssuerCcy() { return Pairs.of(_issuerName, _currency); } /** * Gets the name of the curve used for settlement amount discounting. * @return The name. * @deprecated Curve names should no longer be set in {@link InstrumentDefinition}s */ @Deprecated public String getDiscountingCurveName() { if (_discountingCurveName == null) { throw new IllegalStateException("Discounting curve name was not set"); } return _discountingCurveName; } /** * Gets the name of the curve used for the bill cash flows (issuer credit). * @return The name. * @deprecated Curve names should no longer be set in {@link InstrumentDefinition}s */ @Deprecated public String getCreditCurveName() { if (_creditCurveName == null) { throw new IllegalStateException("Credit curve name was not set"); } return _creditCurveName; } @Override public String toString() { return "Bill " + _issuerName + " " + _currency + ": settle" + _settlementTime + " - maturity " + _endTime + " - notional " + _notional; } @Override public <S, T> T accept(final InstrumentDerivativeVisitor<S, T> visitor, final S data) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitBillSecurity(this, data); } @Override public <T> T accept(final InstrumentDerivativeVisitor<?, T> visitor) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitBillSecurity(this); } @Override public int hashCode() { final int prime = 31; int result = 1; long temp; temp = Double.doubleToLongBits(_accrualFactor); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + (_creditCurveName == null ? 0 : _creditCurveName.hashCode()); result = prime * result + _currency.hashCode(); result = prime * result + (_discountingCurveName == null ? 0 : _discountingCurveName.hashCode()); temp = Double.doubleToLongBits(_endTime); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + _issuerName.hashCode(); temp = Double.doubleToLongBits(_notional); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(_settlementTime); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + _yieldConvention.hashCode(); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final BillSecurity other = (BillSecurity) obj; if (Double.doubleToLongBits(_accrualFactor) != Double.doubleToLongBits(other._accrualFactor)) { return false; } if (!ObjectUtils.equals(_creditCurveName, other._creditCurveName)) { return false; } if (!ObjectUtils.equals(_currency, other._currency)) { return false; } if (!ObjectUtils.equals(_discountingCurveName, other._discountingCurveName)) { return false; } if (Double.doubleToLongBits(_endTime) != Double.doubleToLongBits(other._endTime)) { return false; } if (_issuerName == null) { if (other._issuerName != null) { return false; } } else if (!_issuerName.equals(other._issuerName)) { return false; } if (Double.doubleToLongBits(_notional) != Double.doubleToLongBits(other._notional)) { return false; } if (Double.doubleToLongBits(_settlementTime) != Double.doubleToLongBits(other._settlementTime)) { return false; } if (!ObjectUtils.equals(_yieldConvention, other._yieldConvention)) { return false; } return true; } }