/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.regression; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeFieldType; 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.SecondaryFieldType; import org.fudgemsg.wire.types.FudgeWireType; import com.opengamma.engine.value.ValueProperties; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; /** * Builder for CalculatedValues. Doesn't use secondary types. */ @FudgeBuilderFor(CalculatedValue.class) public class CalculatedValueFudgeBuilder implements FudgeBuilder<CalculatedValue> { private static final String SPECIFICATION_PROPERTIES = "specification_properties"; private static final String TARGET_NAME = "target_name"; private static final String TARGET_TYPE = "target_type"; private static final String VALUE = "value"; private static final Integer TYPES_HEADER_ORDINAL = 0; @Override public MutableFudgeMsg buildMessage(FudgeSerializer serializer, CalculatedValue object) { final MutableFudgeMsg msg = serializer.newMessage(); serializer.addToMessage(msg, SPECIFICATION_PROPERTIES, null, object.getSpecificationProperties()); msg.add(TARGET_NAME, object.getTargetName()); msg.add(TARGET_TYPE, object.getTargetType()); addToMessageWithHeader(serializer, msg, VALUE, object.getValue()); return msg; } @Override public CalculatedValue buildObject(FudgeDeserializer deserializer, FudgeMsg msg) { ValueProperties specificationProperties = deserializer.fieldValueToObject(ValueProperties.class, msg.getByName(SPECIFICATION_PROPERTIES)); String targetName = msg.getString(TARGET_NAME); String targetType = msg.getString(TARGET_TYPE); Object value = deserializer.fieldValueToObject(msg.getByName(VALUE)); return CalculatedValue.of(value, specificationProperties, targetType, targetName); } /** * Bypasses secondary types. * @param serializer serializer * @param message message * @param name name * @param ordinal ordinal * @param object object */ static void addToMessageWithHeader(final FudgeSerializer serializer, final MutableFudgeMsg message, final String name, final Object object) { final Class<?> clazz = object.getClass(); FudgeContext fudgeContext = OpenGammaFudgeContext.getInstance(); final FudgeFieldType fieldType = fudgeContext.getTypeDictionary().getByJavaType(clazz); if (isNative(fieldType, object) && !(fieldType instanceof SecondaryFieldType)) { message.add(name, null, fieldType, object); } else { // look up a custom or default builder and embed as sub-message final MutableFudgeMsg submsg = serializer.objectToFudgeMsg(object); if (!fudgeContext.getObjectDictionary().isDefaultObject(clazz)) { if (submsg.getByOrdinal(TYPES_HEADER_ORDINAL) == null) { FudgeSerializer.addClassHeader(submsg, clazz, Object.class); } } message.add(name, null, FudgeWireType.SUB_MESSAGE, submsg); } } private static boolean isNative(final FudgeFieldType fieldType, final Object object) { if (fieldType == null) { return false; } return FudgeWireType.SUB_MESSAGE.equals(fieldType) == false || (FudgeWireType.SUB_MESSAGE.equals(fieldType) && object instanceof FudgeMsg); } }