/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.position; import static com.opengamma.master.position.Deal.DEAL_CLASSNAME; import static com.opengamma.master.position.Deal.DEAL_PREFIX; import static com.opengamma.master.position.Deal.DEAL_TYPE; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.joda.beans.JodaBeanUtils; import org.joda.beans.MetaBean; import org.joda.beans.MetaProperty; import org.joda.convert.StringConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.position.Trade; /** * Provides helper methods to store a {@link Deal}'s data in a map of strings and reload it into a * {@link Deal} instance. Intended to be used for storing a {@link Deal} in a {@link Trade}'s * {@link Trade#getAttributes() attributes}. */ public final class DealAttributeEncoder { private static final Logger s_logger = LoggerFactory.getLogger(DealAttributeEncoder.class); /** * Resticted constructor */ private DealAttributeEncoder() { } public static Deal read(Map<String, String> tradeAttributes) { String dealClass = tradeAttributes.get(DEAL_CLASSNAME); Deal deal = null; if (dealClass != null) { Class<?> cls; try { cls = DealAttributeEncoder.class.getClassLoader().loadClass(dealClass); } catch (ClassNotFoundException ex) { throw new OpenGammaRuntimeException("Unable to load deal class", ex); } MetaBean metaBean = JodaBeanUtils.metaBean(cls); deal = (Deal) metaBean.builder().build(); for (Map.Entry<String, String> entry : tradeAttributes.entrySet()) { String key = entry.getKey(); if (key.startsWith(DEAL_PREFIX) && !key.equals(DEAL_CLASSNAME) && !key.equals(DEAL_TYPE)) { String propertyName = StringUtils.substringAfter(key, DEAL_PREFIX); if (metaBean.metaPropertyExists(propertyName)) { MetaProperty<?> mp = metaBean.metaProperty(propertyName); String value = entry.getValue(); if (s_logger.isDebugEnabled()) { s_logger.debug("Setting property {}({}) with value {}", new Object[]{mp, mp.propertyType(), value}); } mp.setString(deal, value); } } } } return deal; } public static Map<String, String> write(Deal deal) { Map<String, String> attributes = new HashMap<String, String>(); attributes.put(DEAL_CLASSNAME, deal.getClass().getName()); for (MetaProperty<?> mp : deal.metaBean().metaPropertyIterable()) { Object value = mp.get(deal); if (value != null) { @SuppressWarnings("unchecked") StringConverter<Object> stringConverter = (StringConverter<Object>) JodaBeanUtils.stringConverter().findConverter(mp.propertyType()); attributes.put(DEAL_PREFIX + mp.name(), stringConverter.convertToString(value)); } } return attributes; } }