/** * 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 com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.calcnode.CalculationJobItem; import com.opengamma.engine.function.EmptyFunctionParameters; import com.opengamma.engine.function.FunctionParameters; import com.opengamma.engine.view.ExecutionLogMode; /** * Fudge message builder for {@code CalculationJobItem}. * * <pre> * message CalculationJobItem extends ComputationTargetSpecification { * optional int target; // index into target specification dictionary * optional string function; // function identifier * optional int function; // index into job function dictionary * optional FunctionParameters parameters; // function parameters * optional int parameters; // index into job parameter dictionary * required long[] input; // input value specifications * required long[] output; // output value specifications * } * </pre> */ @FudgeBuilderFor(CalculationJobItem.class) public class CalculationJobItemFudgeBuilder implements FudgeBuilder<CalculationJobItem> { private static final String TARGET_FIELD_NAME = "target"; private static final String FUNCTION_UNIQUE_ID_FIELD_NAME = "function"; private static final String FUNCTION_PARAMETERS_FIELD_NAME = "parameters"; private static final String INPUT_IDENTIFIERS_FIELD_NAME = "input"; private static final String OUTPUT_IDENTIFIERS_FIELD_NAME = "output"; private static final String LOG_MODE_FIELD_NAME = "logMode"; public static MutableFudgeMsg buildMessageImpl(final FudgeSerializer serializer, final CalculationJobItem object, final Map<ComputationTargetSpecification, Integer> targets, final Map<String, Integer> functions, final Map<FunctionParameters, Integer> parameters) { final MutableFudgeMsg msg = serializer.newMessage(); if (targets != null) { Integer i = targets.get(object.getComputationTargetSpecification()); if (i != null) { msg.add(TARGET_FIELD_NAME, i); } else { i = targets.size(); targets.put(object.getComputationTargetSpecification(), i); ComputationTargetReferenceFudgeBuilder.buildMessageImpl(serializer, msg, object.getComputationTargetSpecification()); } } else { ComputationTargetReferenceFudgeBuilder.buildMessageImpl(serializer, msg, object.getComputationTargetSpecification()); } if (functions != null) { Integer i = functions.get(object.getFunctionUniqueIdentifier()); if (i != null) { msg.add(FUNCTION_UNIQUE_ID_FIELD_NAME, i); } else { i = functions.size(); functions.put(object.getFunctionUniqueIdentifier(), i); msg.add(FUNCTION_UNIQUE_ID_FIELD_NAME, object.getFunctionUniqueIdentifier()); } } else { msg.add(FUNCTION_UNIQUE_ID_FIELD_NAME, object.getFunctionUniqueIdentifier()); } if (!(object.getFunctionParameters() instanceof EmptyFunctionParameters)) { if (parameters != null) { Integer i = parameters.get(object.getFunctionParameters()); if (i != null) { msg.add(FUNCTION_PARAMETERS_FIELD_NAME, i); } else { i = parameters.size(); parameters.put(object.getFunctionParameters(), i); serializer.addToMessageWithClassHeaders(msg, FUNCTION_PARAMETERS_FIELD_NAME, null, object.getFunctionParameters(), FunctionParameters.class); } } else { serializer.addToMessageWithClassHeaders(msg, FUNCTION_PARAMETERS_FIELD_NAME, null, object.getFunctionParameters(), FunctionParameters.class); } } msg.add(INPUT_IDENTIFIERS_FIELD_NAME, object.getInputIdentifiers()); msg.add(OUTPUT_IDENTIFIERS_FIELD_NAME, object.getOutputIdentifiers()); serializer.addToMessage(msg, LOG_MODE_FIELD_NAME, null, object.getLogMode()); return msg; } @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final CalculationJobItem object) { return buildMessageImpl(serializer, object, null, null, null); } public static CalculationJobItem buildObjectImpl(final FudgeDeserializer deserializer, final FudgeMsg message, final Map<Integer, ComputationTargetSpecification> targets, final Map<Integer, String> functions, final Map<Integer, FunctionParameters> parameters) { FudgeField field = message.getByName(TARGET_FIELD_NAME); final ComputationTargetSpecification computationTargetSpecification; if (field != null) { computationTargetSpecification = targets.get(((Number) field.getValue()).intValue()); } else { computationTargetSpecification = ComputationTargetReferenceFudgeBuilder.buildObjectImpl(deserializer, message).getSpecification(); if (targets != null) { targets.put(targets.size(), computationTargetSpecification); } } field = message.getByName(FUNCTION_UNIQUE_ID_FIELD_NAME); final String functionUniqueId; if (field.getValue() instanceof Number) { functionUniqueId = functions.get(((Number) field.getValue()).intValue()); } else { functionUniqueId = (String) field.getValue(); if (functions != null) { functions.put(functions.size(), functionUniqueId); } } final FunctionParameters functionParameters; field = message.getByName(FUNCTION_PARAMETERS_FIELD_NAME); if (field != null) { if (field.getValue() instanceof Number) { functionParameters = parameters.get(((Number) field.getValue()).intValue()); } else { functionParameters = deserializer.fieldValueToObject(FunctionParameters.class, field); if (parameters != null) { parameters.put(parameters.size(), functionParameters); } } } else { functionParameters = EmptyFunctionParameters.INSTANCE; } final long[] inputIdentifiers = message.getValue(long[].class, INPUT_IDENTIFIERS_FIELD_NAME); final long[] outputIdentifiers = message.getValue(long[].class, OUTPUT_IDENTIFIERS_FIELD_NAME); final ExecutionLogMode logMode = deserializer.fieldValueToObject(ExecutionLogMode.class, message.getByName(LOG_MODE_FIELD_NAME)); return new CalculationJobItem(functionUniqueId, functionParameters, computationTargetSpecification, inputIdentifiers, outputIdentifiers, logMode); } @Override public CalculationJobItem buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { return buildObjectImpl(deserializer, message, null, null, null); } @Override public String toString() { return "CalculationJobItemBuilder []"; } }