/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.fudgemsg;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilder;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import org.fudgemsg.mapping.GenericFudgeBuilderFor;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.value.ComputedValueResult;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.view.ViewCalculationResultModel;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
*
*/
@GenericFudgeBuilderFor(ViewCalculationResultModel.class)
public class ViewCalculationResultModelFudgeBuilder implements FudgeBuilder<ViewCalculationResultModel> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, ViewCalculationResultModel resultModel) {
final MutableFudgeMsg message = serializer.newMessage();
final Collection<ComputationTargetSpecification> targets = resultModel.getAllTargets();
for (ComputationTargetSpecification target : targets) {
final Collection<ComputedValueResult> values = resultModel.getAllValues(target);
for (ComputedValueResult value : values) {
serializer.addToMessage(message, null, null, value);
}
}
return message;
}
@Override
public ViewCalculationResultModel buildObject(FudgeDeserializer deserializer, FudgeMsg message) {
final Map<ComputationTargetSpecification, Map<Pair<String, ValueProperties>, ComputedValueResult>> mapNames =
new HashMap<ComputationTargetSpecification, Map<Pair<String, ValueProperties>, ComputedValueResult>>();
for (FudgeField field : message) {
final ComputedValueResult value = deserializer.fieldValueToObject(ComputedValueResult.class, field);
final ComputationTargetSpecification target = value.getSpecification().getTargetSpecification();
if (!mapNames.containsKey(target)) {
mapNames.put(target, new HashMap<Pair<String, ValueProperties>, ComputedValueResult>());
}
mapNames.get(target).put(Pairs.of(value.getSpecification().getValueName(), value.getSpecification().getProperties()), value);
}
return new ViewCalculationResultModel() {
@Override
public Collection<ComputationTargetSpecification> getAllTargets() {
return mapNames.keySet();
}
@Override
public Map<Pair<String, ValueProperties>, ComputedValueResult> getValues(ComputationTargetSpecification target) {
return mapNames.get(target);
}
@Override
public Collection<ComputedValueResult> getAllValues(ComputationTargetSpecification target) {
Map<Pair<String, ValueProperties>, ComputedValueResult> targetValuesMap = mapNames.get(target);
return targetValuesMap != null ? Collections.unmodifiableCollection(targetValuesMap.values()) : null;
}
};
}
}