/**
* 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.ArrayList;
import java.util.HashMap;
import java.util.List;
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.cache.CacheSelectHint;
import com.opengamma.engine.calcnode.CalculationJob;
import com.opengamma.engine.calcnode.CalculationJobItem;
import com.opengamma.engine.calcnode.CalculationJobSpecification;
import com.opengamma.engine.function.FunctionParameters;
import com.opengamma.id.VersionCorrection;
/**
* Fudge message builder for {@code CalculationJob}.
*
* <pre>
* message CalculationJob extends CalculationJobSpecification, CacheSelect {
* optional long[] required; // pre-requisite job identifiers
* required long functionInitId; // function initialization latch flag
* required VersionCorrection versionCorrection; // resolver version/correction timestamps
* required CalculationJobItem[] items; // job items
* }
* </pre>
*/
@FudgeBuilderFor(CalculationJob.class)
public class CalculationJobFudgeBuilder implements FudgeBuilder<CalculationJob> {
private static final String REQUIRED_FIELD_NAME = "required";
private static final String FUNCTION_INITIALIZATION_IDENTIFIER_FIELD_NAME = "functionInitId";
private static final String RESOLVER_VERSION_CORRECTION_FIELD_NAME = "versionCorrection";
private static final String ITEMS_FIELD_NAME = "items";
protected FudgeMsg buildItemsMessage(final FudgeSerializer serializer, final List<CalculationJobItem> items) {
final MutableFudgeMsg msg = serializer.newMessage();
final Map<ComputationTargetSpecification, Integer> targets = new HashMap<ComputationTargetSpecification, Integer>();
final Map<String, Integer> functions = new HashMap<String, Integer>();
final Map<FunctionParameters, Integer> parameters = new HashMap<FunctionParameters, Integer>();
for (CalculationJobItem item : items) {
msg.add(null, null, CalculationJobItemFudgeBuilder.buildMessageImpl(serializer, item, targets, functions, parameters));
}
return msg;
}
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final CalculationJob object) {
final MutableFudgeMsg msg = serializer.newMessage();
CalculationJobSpecificationFudgeBuilder.buildMessageImpl(msg, object.getSpecification());
CacheSelectHintFudgeBuilder.buildMessageImpl(msg, object.getCacheSelectHint());
if (object.getRequiredJobIds() != null) {
msg.add(REQUIRED_FIELD_NAME, object.getRequiredJobIds());
}
msg.add(FUNCTION_INITIALIZATION_IDENTIFIER_FIELD_NAME, object.getFunctionInitializationIdentifier());
serializer.addToMessage(msg, RESOLVER_VERSION_CORRECTION_FIELD_NAME, null, object.getResolverVersionCorrection());
msg.add(ITEMS_FIELD_NAME, buildItemsMessage(serializer, object.getJobItems()));
return msg;
}
protected List<CalculationJobItem> buildItemsObject(final FudgeDeserializer deserializer, final FudgeMsg msg) {
final List<CalculationJobItem> result = new ArrayList<CalculationJobItem>(msg.getNumFields());
final Map<Integer, ComputationTargetSpecification> targets = new HashMap<Integer, ComputationTargetSpecification>();
final Map<Integer, String> functions = new HashMap<Integer, String>();
final Map<Integer, FunctionParameters> parameters = new HashMap<Integer, FunctionParameters>();
for (FudgeField field : msg) {
result.add(CalculationJobItemFudgeBuilder.buildObjectImpl(deserializer, (FudgeMsg) field.getValue(), targets, functions, parameters));
}
return result;
}
@Override
public CalculationJob buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final CalculationJobSpecification jobSpec = CalculationJobSpecificationFudgeBuilder.buildObjectImpl(message);
final CacheSelectHint cacheSelectHint = CacheSelectHintFudgeBuilder.buildObjectImpl(message);
final long[] requiredJobIds = message.getValue(long[].class, REQUIRED_FIELD_NAME);
final long functionInitializationIdentifier = message.getLong(FUNCTION_INITIALIZATION_IDENTIFIER_FIELD_NAME);
final VersionCorrection resolverVersionCorrection = deserializer.fieldValueToObject(VersionCorrection.class, message.getByName(RESOLVER_VERSION_CORRECTION_FIELD_NAME));
final List<CalculationJobItem> jobItems = buildItemsObject(deserializer, message.getMessage(ITEMS_FIELD_NAME));
return new CalculationJob(jobSpec, functionInitializationIdentifier, resolverVersionCorrection, requiredJobIds, jobItems, cacheSelectHint);
}
}