/** * 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.List; 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.calcnode.CalculationJobResult; import com.opengamma.engine.calcnode.CalculationJobResultItem; import com.opengamma.engine.calcnode.CalculationJobSpecification; /** * Fudge message builder for {@code CalculationJob}. * * <pre> * message CalculationJobResult extends CalculationJobSpecification { * required long duration; // job execution time * required CalculationJobResultItem[] items; // job items - in the same order as the original CalculationJob * required string nodeId; // node identifier * } * </pre> */ @FudgeBuilderFor(CalculationJobResult.class) public class CalculationJobResultFudgeBuilder implements FudgeBuilder<CalculationJobResult> { private static final String DURATION_FIELD_NAME = "duration"; private static final String ITEMS_FIELD_NAME = "items"; private static final String NODE_ID_FIELD_NAME = "nodeId"; protected FudgeMsg buildItemsMessage(final FudgeSerializer serializer, final List<CalculationJobResultItem> items) { final MutableFudgeMsg msg = serializer.newMessage(); for (CalculationJobResultItem item : items) { msg.add(null, null, CalculationJobResultItemFudgeBuilder.buildMessageImpl(serializer, item)); } return msg; } @Override public MutableFudgeMsg buildMessage(FudgeSerializer serializer, CalculationJobResult object) { final MutableFudgeMsg msg = serializer.newMessage(); CalculationJobSpecificationFudgeBuilder.buildMessageImpl(msg, object.getSpecification()); msg.add(DURATION_FIELD_NAME, object.getDuration()); msg.add(ITEMS_FIELD_NAME, buildItemsMessage(serializer, object.getResultItems())); msg.add(NODE_ID_FIELD_NAME, object.getComputeNodeId()); return msg; } protected List<CalculationJobResultItem> buildItemsObject(final FudgeDeserializer deserializer, final FudgeMsg msg) { final List<CalculationJobResultItem> result = new ArrayList<CalculationJobResultItem>(msg.getNumFields()); for (FudgeField field : msg) { result.add(CalculationJobResultItemFudgeBuilder.buildObjectImpl(deserializer, (FudgeMsg) field.getValue())); } return result; } @Override public CalculationJobResult buildObject(FudgeDeserializer deserializer, FudgeMsg msg) { final CalculationJobSpecification jobSpec = CalculationJobSpecificationFudgeBuilder.buildObjectImpl(msg); final long duration = msg.getLong(DURATION_FIELD_NAME); final List<CalculationJobResultItem> jobItems = buildItemsObject(deserializer, msg.getMessage(ITEMS_FIELD_NAME)); final String nodeId = msg.getString(NODE_ID_FIELD_NAME); return new CalculationJobResult(jobSpec, duration, jobItems, nodeId); } }