/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.fudgemsg;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilder;
import org.fudgemsg.mapping.FudgeBuilderFor;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import org.fudgemsg.types.IndicatorType;
import com.opengamma.engine.depgraph.ambiguity.FullRequirementResolution;
import com.opengamma.engine.depgraph.ambiguity.RequirementResolution;
import com.opengamma.engine.value.ValueRequirement;
/**
* Fudge builder for {@link FullRequirementResolution}.
*
* <pre>
* message FullRequirementResolution {
* required ValueRequirement requirement; // the attempted resolution
* repeated RequirementResolution resolution; // a specific resolution, repeated in descending priority order
* repeated RequirementResolution[] resolution; // an ambiguous resolution, repeated in descending priority order
* }
* </pre>
*/
@FudgeBuilderFor(FullRequirementResolution.class)
public class FullRequirementResolutionFudgeBuilder implements FudgeBuilder<FullRequirementResolution> {
// TODO: Improve efficiency - there may be a lot of duplication in the resolutions
private static final String REQUIREMENT_FIELD_NAME = "requirement";
private static final String RESOLUTION_FIELD_NAME = "resolution";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final FullRequirementResolution object) {
final MutableFudgeMsg msg = serializer.newMessage();
serializer.addToMessage(msg, REQUIREMENT_FIELD_NAME, null, object.getRequirement());
for (Collection<RequirementResolution> resolutions : object.getResolutions()) {
if (resolutions.size() == 1) {
serializer.addToMessage(msg, RESOLUTION_FIELD_NAME, null, resolutions.iterator().next());
} else if (resolutions.size() > 1) {
final MutableFudgeMsg resolutionsMsg = msg.addSubMessage(RESOLUTION_FIELD_NAME, null);
for (RequirementResolution resolution : resolutions) {
if (resolution != null) {
serializer.addToMessage(resolutionsMsg, null, null, resolution);
} else {
resolutionsMsg.add(null, null, IndicatorType.INSTANCE);
}
}
}
}
return msg;
}
@Override
public FullRequirementResolution buildObject(final FudgeDeserializer deserializer, final FudgeMsg msg) {
final FullRequirementResolution result = new FullRequirementResolution(deserializer.fieldValueToObject(ValueRequirement.class, msg.getByName(REQUIREMENT_FIELD_NAME)));
final Collection<FudgeField> resolutionFields = msg.getAllByName(RESOLUTION_FIELD_NAME);
for (FudgeField resolutionField : resolutionFields) {
final FudgeMsg resolutionsMessage = ((FudgeMsg) resolutionField.getValue());
if (resolutionsMessage.hasField((String) null)) {
final Collection<RequirementResolution> resolved = new ArrayList<RequirementResolution>(resolutionsMessage.getNumFields());
for (FudgeField resolutionField2 : resolutionsMessage) {
if (resolutionField2.getValue() instanceof IndicatorType) {
resolved.add(null);
} else {
resolved.add(deserializer.fieldValueToObject(RequirementResolution.class, resolutionField2));
}
}
result.addResolutions(resolved);
} else {
result.addResolutions(Collections.singleton(deserializer.fieldValueToObject(RequirementResolution.class, resolutionField)));
}
}
return result;
}
}