/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.marketdatasnapshot;
import java.util.HashMap;
import java.util.Map;
import com.opengamma.core.marketdatasnapshot.ValueSnapshot;
import com.opengamma.core.marketdatasnapshot.VolatilitySurfaceData;
import com.opengamma.core.marketdatasnapshot.VolatilitySurfaceKey;
import com.opengamma.core.marketdatasnapshot.VolatilitySurfaceSnapshot;
import com.opengamma.core.marketdatasnapshot.impl.ManageableVolatilitySurfaceSnapshot;
import com.opengamma.engine.value.SurfaceAndCubePropertyNames;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.engine.view.ViewComputationResultModel;
import com.opengamma.id.UniqueId;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
*
*/
@SuppressWarnings("rawtypes")
public class VolatilitySurfaceSnapper extends
StructuredSnapper<VolatilitySurfaceKey, VolatilitySurfaceData, VolatilitySurfaceSnapshot> {
public VolatilitySurfaceSnapper() {
super(ValueRequirementNames.VOLATILITY_SURFACE_DATA);
}
@Override
VolatilitySurfaceKey getKey(ValueSpecification spec) {
UniqueId uniqueId = spec.getTargetSpecification().getUniqueId();
String surface = getSingleProperty(spec, ValuePropertyNames.SURFACE);
String instrumentType = getSingleProperty(spec, SurfaceAndCubePropertyNames.INSTRUMENT_TYPE);
String quoteType = getSingleProperty(spec, SurfaceAndCubePropertyNames.PROPERTY_SURFACE_QUOTE_TYPE);
String quoteUnits = getSingleProperty(spec, SurfaceAndCubePropertyNames.PROPERTY_SURFACE_UNITS);
return VolatilitySurfaceKey.of(uniqueId, surface, instrumentType, quoteType, quoteUnits);
}
@SuppressWarnings("unchecked")
@Override
ManageableVolatilitySurfaceSnapshot buildSnapshot(ViewComputationResultModel resultModel, VolatilitySurfaceKey key,
VolatilitySurfaceData volatilitySurfaceData) {
Map<Pair<Object, Object>, ValueSnapshot> dict = new HashMap<Pair<Object, Object>, ValueSnapshot>();
for (Object x : volatilitySurfaceData.getXs()) {
for (Object y : volatilitySurfaceData.getYs()) {
Double volatility = volatilitySurfaceData.getVolatility(x, y);
Pair<Object, Object> volKey = Pairs.of(x, y);
dict.put(volKey, ValueSnapshot.of(volatility));
}
}
ManageableVolatilitySurfaceSnapshot ret = new ManageableVolatilitySurfaceSnapshot();
ret.setValues(dict);
return ret;
}
}