/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.config;
import java.util.Collection;
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.bbg.loader.SecurityType;
import com.opengamma.id.UniqueId;
/**
* Builder for converting {@link BloombergSecurityTypeDefinition} to/from Fudge messages.
*/
@FudgeBuilderFor(BloombergSecurityTypeDefinition.class)
public class BloombergSecurityTypeDefinitionFudgeBuilder implements FudgeBuilder<BloombergSecurityTypeDefinition> {
private static final String TYPES_FLD = "types";
private static final String SEC_TYPE_FLD = "sectype";
private static final String UNIQUE_ID_FLD = "id";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final BloombergSecurityTypeDefinition object) {
MutableFudgeMsg rootMsg = serializer.newMessage();
if (object.getUniqueId() != null) {
serializer.addToMessage(rootMsg, UNIQUE_ID_FLD, null, object.getUniqueId());
}
Collection<SecurityType> allSecurityTypes = object.getAllSecurityTypes();
if (!allSecurityTypes.isEmpty()) {
MutableFudgeMsg typesMsg = serializer.newMessage();
for (SecurityType securityType : allSecurityTypes) {
Collection<String> validTypes = object.getValidTypes(securityType);
MutableFudgeMsg secTypeMsg = serializer.newMessage();
for (String type : validTypes) {
secTypeMsg.add(SEC_TYPE_FLD, type);
}
serializer.addToMessage(typesMsg, securityType.name(), null, secTypeMsg);
}
serializer.addToMessage(rootMsg, TYPES_FLD, null, typesMsg);
}
return rootMsg;
}
@Override
public BloombergSecurityTypeDefinition buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
BloombergSecurityTypeDefinition definition = new BloombergSecurityTypeDefinition();
if (message.hasField(UNIQUE_ID_FLD)) {
definition.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, message.getByName(UNIQUE_ID_FLD)));
}
FudgeMsg typesMsg = message.getMessage(TYPES_FLD);
if (typesMsg != null) {
for (String securityTypeName : typesMsg.getAllFieldNames()) {
FudgeMsg msg = (FudgeMsg) typesMsg.getByName(securityTypeName).getValue();
for (FudgeField field : msg.getAllByName(SEC_TYPE_FLD)) {
String secType = (String) field.getValue();
definition.addSecurityType(secType, SecurityType.valueOf(securityTypeName));
}
}
}
return definition;
}
}