/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.marketdata.manipulator.dsl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceConstantMultiplicativeShift;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceIndexShifts;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceMultipleAdditiveShifts;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceMultipleMultiplicativeShifts;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceParallelShift;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceSingleAdditiveShift;
import com.opengamma.integration.marketdata.manipulator.dsl.volsurface.VolatilitySurfaceSingleMultiplicativeShift;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public class VolatilitySurfaceManipulatorBuilder {
/** Selector whose selected items will be modified by the manipulators from this builder. */
private final VolatilitySurfaceSelector _selector;
/** The scenario to which manipulations are added. */
private final Scenario _scenario;
/* package */ VolatilitySurfaceManipulatorBuilder(Scenario scenario, VolatilitySurfaceSelector selector) {
ArgumentChecker.notNull(scenario, "scenario");
ArgumentChecker.notNull(selector, "selector");
_scenario = scenario;
_selector = selector;
}
public VolatilitySurfaceManipulatorBuilder shifts(ScenarioShiftType shiftType, VolatilitySurfaceShift... shifts) {
_scenario.add(_selector, VolatilitySurfaceShiftManipulator.create(shiftType, Arrays.asList(shifts)));
return this;
}
public VolatilitySurfaceManipulatorBuilder parallelShift(ScenarioShiftType shiftType, Number shift) {
if (shiftType == ScenarioShiftType.ABSOLUTE) {
_scenario.add(_selector, new VolatilitySurfaceParallelShift(shift.doubleValue()));
} else {
_scenario.add(_selector, new VolatilitySurfaceConstantMultiplicativeShift(shift.doubleValue() + 1));
}
return this;
}
/**
* Creates {@link VolatilitySurfaceIndexShifts} which specifies surface shifts by expiry index.
*
* @param shiftType absolute or relative
* @param shifts the shift amounts to apply at each point on the surface
* @return this builder
*/
public VolatilitySurfaceManipulatorBuilder indexShifts(ScenarioShiftType shiftType, Number... shifts) {
List<Double> shiftList = new ArrayList<>(shifts.length);
for (Number shift : shifts) {
shiftList.add(shift.doubleValue());
}
_scenario.add(_selector, new VolatilitySurfaceIndexShifts(shiftType, shiftList));
return this;
}
/**
* @deprecated Use {@link #parallelShift} with {@link ScenarioShiftType#ABSOLUTE}
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder parallelShift(Number shift) {
_scenario.add(_selector, new VolatilitySurfaceParallelShift(shift.doubleValue()));
return this;
}
/**
* @deprecated Use {@link #parallelShift} with {@link ScenarioShiftType#RELATIVE}
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder constantMultiplicativeShift(Number shift) {
_scenario.add(_selector, new VolatilitySurfaceConstantMultiplicativeShift(shift.doubleValue()));
return this;
}
/**
* @deprecated Use {@link #shifts)} with {@link ScenarioShiftType#ABSOLUTE} and one shift
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder singleAdditiveShift(Number x, Number y, Number shift) {
_scenario.add(_selector, new VolatilitySurfaceSingleAdditiveShift(x.doubleValue(), y.doubleValue(), shift.doubleValue()));
return this;
}
/**
* @deprecated Use {@link #shifts)} with {@link ScenarioShiftType#ABSOLUTE} and multiple shifts
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder multipleAdditiveShifts(List<Number> x, List<Number> y, List<Number> shifts) {
_scenario.add(_selector, new VolatilitySurfaceMultipleAdditiveShifts(array(x), array(y), array(shifts)));
return this;
}
/**
* @deprecated Use {@link #shifts)} with {@link ScenarioShiftType#RELATIVE} and one shift
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder singleMultiplicativeShift(Number x, Number y, Number shift) {
_scenario.add(_selector, new VolatilitySurfaceSingleMultiplicativeShift(x.doubleValue(), y.doubleValue(), shift.doubleValue()));
return this;
}
/**
* @deprecated Use {@link #shifts)} with {@link ScenarioShiftType#RELATIVE} and multiple shifts
*/
@Deprecated
public VolatilitySurfaceManipulatorBuilder multipleMultiplicativeShifts(List<Number> x, List<Number> y, List<Number> shifts) {
_scenario.add(_selector, new VolatilitySurfaceMultipleMultiplicativeShifts(array(x), array(y), array(shifts)));
return this;
}
private static double[] array(List<Number> list) {
double[] array = new double[list.size()];
int index = 0;
for (Number value : list) {
array[index++] = value.doubleValue();
}
return array;
}
/* package */ VolatilitySurfaceSelector getSelector() {
return _selector;
}
/* package */ Scenario getScenario() {
return _scenario;
}
}