/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.model.bond; import java.util.Collections; import java.util.Set; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.bond.BondFixedSecurityDefinition; import com.opengamma.core.holiday.HolidaySource; import com.opengamma.core.region.RegionSource; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.function.AbstractFunction.NonCompiledInvoker; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.function.FunctionExecutionContext; import com.opengamma.engine.function.FunctionInputs; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ComputedValue; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueRequirementNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.financial.OpenGammaExecutionContext; import com.opengamma.financial.analytics.conversion.BondSecurityConverter; import com.opengamma.financial.convention.ConventionBundleSource; import com.opengamma.financial.security.FinancialSecurityTypes; import com.opengamma.financial.security.bond.BondSecurity; import com.opengamma.util.time.DateUtils; /** * */ public class BondTenorFunction extends NonCompiledInvoker { @Override public ComputationTargetType getTargetType() { return FinancialSecurityTypes.BOND_SECURITY; } @Override public Set<ComputedValue> execute(final FunctionExecutionContext executionContext, final FunctionInputs inputs, final ComputationTarget target, final Set<ValueRequirement> desiredValues) { final BondSecurity security = target.getValue(FinancialSecurityTypes.BOND_SECURITY); final HolidaySource holidaySource = OpenGammaExecutionContext.getHolidaySource(executionContext); final ConventionBundleSource conventionSource = OpenGammaExecutionContext .getConventionBundleSource(executionContext); final RegionSource regionSource = OpenGammaExecutionContext.getRegionSource(executionContext); final BondSecurityConverter visitor = new BondSecurityConverter(holidaySource, conventionSource, regionSource); final BondFixedSecurityDefinition bond = (BondFixedSecurityDefinition) security.accept(visitor); final ZonedDateTime firstCouponDate = bond.getCoupons().getNthPayment(0).getAccrualStartDate(); final ZonedDateTime lastCouponDate = bond.getCoupons().getNthPayment(bond.getCoupons().getNumberOfPayments() - 1).getPaymentDate(); final int t = DateUtils.getDaysBetween(firstCouponDate, lastCouponDate) / 365; final ValueSpecification specification = new ValueSpecification(ValueRequirementNames.BOND_TENOR, target.toSpecification(), createValueProperties().get()); return Collections.singleton(new ComputedValue(specification, t)); } @Override public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) { return Collections.emptySet(); } @Override public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target) { return Collections.singleton(new ValueSpecification(ValueRequirementNames.BOND_TENOR, target.toSpecification(), createValueProperties().get())); } }