/** * 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.Map; 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.function.FunctionParameters; import com.opengamma.engine.function.resolver.ComputationTargetFilter; import com.opengamma.engine.function.resolver.SimpleResolutionRuleTransform; import com.opengamma.engine.function.resolver.SimpleResolutionRuleTransform.Action; import com.opengamma.engine.function.resolver.SimpleResolutionRuleTransform.Adjust; import com.opengamma.engine.function.resolver.SimpleResolutionRuleTransform.DontUse; import com.opengamma.engine.function.resolver.SimpleResolutionRuleTransform.MultipleAdjust; /** * Fudge message builder for {@code SimpleResolutionRuleTransform}. */ @FudgeBuilderFor(SimpleResolutionRuleTransform.class) public class SimpleResolutionRuleTransformFudgeBuilder implements FudgeBuilder<SimpleResolutionRuleTransform> { private static final String PARAMETERS_FIELD = "parameters"; private static final String PRIORITY_FIELD = "priorityAdjustment"; private static final String FILTER_FIELD = "targetFilter"; private static FudgeMsg adjustToFudgeMsg(final FudgeSerializer serializer, final Adjust adjust) { final MutableFudgeMsg message = serializer.newMessage(); if (adjust.getParameters() != null) { serializer.addToMessageWithClassHeaders(message, PARAMETERS_FIELD, null, adjust.getParameters(), FunctionParameters.class); } if (adjust.getComputationTargetFilter() != null) { serializer.addToMessageWithClassHeaders(message, FILTER_FIELD, null, adjust.getComputationTargetFilter(), ComputationTargetFilter.class); } if (adjust.getPriorityAdjustment() != null) { message.add(PRIORITY_FIELD, adjust.getPriorityAdjustment()); } return message; } @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final SimpleResolutionRuleTransform object) { final MutableFudgeMsg message = serializer.newMessage(); message.add(0, SimpleResolutionRuleTransform.class.getName()); for (Map.Entry<String, Action> functionTransformation : object.getFunctionTransformations().entrySet()) { final String functionName = functionTransformation.getKey(); final Action action = functionTransformation.getValue(); if (action instanceof DontUse) { message.add(functionName, IndicatorType.INSTANCE); } else if (action instanceof Adjust) { message.add(functionName, adjustToFudgeMsg(serializer, (Adjust) action)); } else if (action instanceof MultipleAdjust) { for (Adjust adjust : ((MultipleAdjust) action).getAdjusts()) { message.add(functionName, adjustToFudgeMsg(serializer, adjust)); } } else { throw new IllegalArgumentException("Unexpected value " + action); } } return message; } @Override public SimpleResolutionRuleTransform buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final SimpleResolutionRuleTransform transform = new SimpleResolutionRuleTransform(); for (FudgeField field : message) { if (field.getName() != null) { if (field.getValue() == IndicatorType.INSTANCE) { transform.suppressRule(field.getName()); } else if (field.getValue() instanceof FudgeMsg) { final FudgeMsg action = (FudgeMsg) field.getValue(); final FudgeField parameters = action.getByName(PARAMETERS_FIELD); final FudgeField filter = action.getByName(FILTER_FIELD); final FudgeField priority = action.getByName(PRIORITY_FIELD); transform.adjustRule(field.getName(), (parameters != null) ? deserializer.fieldValueToObject(FunctionParameters.class, parameters) : null, (filter != null) ? deserializer.fieldValueToObject( ComputationTargetFilter.class, filter) : null, (priority != null) ? message.getFieldValue(Integer.class, priority) : null); } } } return transform; } }