/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.conversion;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.cash.CashDefinition;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.region.RegionSource;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.cash.CashSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
/**
* Converts {@link CashSecurity} to the equivalent OG-Analytics object ({@link CashDefinition}).
*/
public class CashSecurityConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> {
/** The holiday source */
private final HolidaySource _holidaySource;
/** The region source */
private final RegionSource _regionSource;
/**
* @param holidaySource The holiday source, not null
* @param regionSource The region source, not null
*/
public CashSecurityConverter(final HolidaySource holidaySource, final RegionSource regionSource) {
ArgumentChecker.notNull(holidaySource, "holiday source");
ArgumentChecker.notNull(regionSource, "region source");
_holidaySource = holidaySource;
_regionSource = regionSource;
}
@Override
public CashDefinition visitCashSecurity(final CashSecurity security) {
ArgumentChecker.notNull(security, "cash security");
final Currency currency = security.getCurrency();
// TODO: Do we need to adjust the dates to a good business day?
final ZonedDateTime startDate = security.getStart();
final ZonedDateTime endDate = security.getMaturity();
final ExternalId regionId = security.getRegionId();
final Calendar calendar = CalendarUtils.getCalendar(_regionSource, _holidaySource, regionId);
final double accrualFactor = security.getDayCount().getDayCountFraction(startDate, endDate, calendar);
return new CashDefinition(currency, startDate, endDate, security.getAmount(), security.getRate(), accrualFactor);
}
}