/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.position; import java.util.Map.Entry; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeBuilder; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.fudgemsg.mapping.GenericFudgeBuilderFor; import org.fudgemsg.wire.types.FudgeWireType; import com.opengamma.core.position.impl.SimplePortfolio; import com.opengamma.core.position.impl.SimplePortfolioNode; import com.opengamma.id.UniqueId; /** * Fudge message builder for {@code Portfolio}. */ @GenericFudgeBuilderFor(Portfolio.class) public class PortfolioFudgeBuilder implements FudgeBuilder<Portfolio> { /** Field name. */ public static final String IDENTIFIER_FIELD_NAME = "identifier"; /** Field name. */ public static final String NAME_FIELD_NAME = "name"; /** Field name. */ public static final String ROOT_FIELD_NAME = "root"; /** Field name. */ public static final String ATTRIBUTES_FIELD_NAME = "attributes"; @Override public MutableFudgeMsg buildMessage(FudgeSerializer serializer, Portfolio portfolio) { final MutableFudgeMsg message = serializer.newMessage(); serializer.addToMessage(message, IDENTIFIER_FIELD_NAME, null, portfolio.getUniqueId()); message.add(NAME_FIELD_NAME, portfolio.getName()); serializer.addToMessage(message, ROOT_FIELD_NAME, null, portfolio.getRootNode()); if (haveAttributes(portfolio)) { final MutableFudgeMsg attributesMsg = serializer.newMessage(); for (Entry<String, String> entry : portfolio.getAttributes().entrySet()) { attributesMsg.add(entry.getKey(), entry.getValue()); } serializer.addToMessage(message, ATTRIBUTES_FIELD_NAME, null, attributesMsg); } message.add(null, FudgeSerializer.TYPES_HEADER_ORDINAL, FudgeWireType.STRING, Portfolio.class.getName()); return message; } private boolean haveAttributes(Portfolio portfolio) { return portfolio.getAttributes() != null && !portfolio.getAttributes().isEmpty(); } @Override public Portfolio buildObject(FudgeDeserializer deserializer, FudgeMsg message) { FudgeField idField = message.getByName(IDENTIFIER_FIELD_NAME); final UniqueId id = idField != null ? deserializer.fieldValueToObject(UniqueId.class, idField) : null; final String name = message.getFieldValue(String.class, message.getByName(NAME_FIELD_NAME)); final PortfolioNode node = deserializer.fieldValueToObject(PortfolioNode.class, message.getByName(ROOT_FIELD_NAME)); SimplePortfolio portfolio = new SimplePortfolio(name); if (id != null) { portfolio.setUniqueId(id); } portfolio.setRootNode((SimplePortfolioNode) node); if (message.hasField(ATTRIBUTES_FIELD_NAME)) { FudgeMsg attributesMsg = message.getMessage(ATTRIBUTES_FIELD_NAME); for (FudgeField fudgeField : attributesMsg) { String key = fudgeField.getName(); Object value = fudgeField.getValue(); if (key != null && value != null) { portfolio.addAttribute(key, (String) value); } } } return portfolio; } }