Package com.opengamma.integration.tool.config

Source Code of com.opengamma.integration.tool.config.ConfigLoader

/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.config;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.fudgemsg.FudgeMsg;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.wire.FudgeMsgReader;
import org.fudgemsg.wire.xml.FudgeXMLStreamReader;
import org.joda.beans.impl.flexi.FlexiBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.core.config.impl.ConfigItem;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.id.UniqueId;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.config.ConfigMasterUtils;
import com.opengamma.master.portfolio.ManageablePortfolio;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.portfolio.PortfolioSearchRequest;
import com.opengamma.master.portfolio.PortfolioSearchResult;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;

/**
* Class to load configurations from an input stream
*/
public class ConfigLoader {
  private static final Logger s_logger = LoggerFactory.getLogger(ConfigLoader.class);
  private ConfigMaster _configMaster;
  private PortfolioMaster _portfolioMaster;
  private boolean _actuallyStore;
  private boolean _verbose;
  private boolean _attemptToPortPortfolioIds;
 
  public ConfigLoader(ConfigMaster configMaster, PortfolioMaster portfolioMaster, boolean attemptToPortPortfolioIds,
                      boolean actuallyStore, boolean verbose) {
    _configMaster = configMaster;
    _portfolioMaster = portfolioMaster;
    _attemptToPortPortfolioIds = attemptToPortPortfolioIds;
    _actuallyStore = actuallyStore;
    _verbose = verbose;
  }
 
  public void loadConfig(InputStream inputStream) {
    FudgeXMLStreamReader xmlStreamReader = new FudgeXMLStreamReader(OpenGammaFudgeContext.getInstance(), new InputStreamReader(new BufferedInputStream(inputStream)));
    FudgeMsgReader fudgeMsgReader = new FudgeMsgReader(xmlStreamReader);
    FudgeDeserializer deserializer = new FudgeDeserializer(OpenGammaFudgeContext.getInstance());
    FudgeMsg configsMessage = fudgeMsgReader.nextMessage();
    if (configsMessage == null) {
      s_logger.error("Error reading first message from XML stream");
      return;
    }
    Object object = deserializer.fudgeMsgToObject(FlexiBean.class, configsMessage);
    if (!(object instanceof FlexiBean)) {
      s_logger.error("XML Stream deserialised to object of type " + object.getClass() + ": " + object.toString());
      return;
    }
    FlexiBean wrapper = (FlexiBean) object;
    if (!wrapper.contains("configs")) {
      s_logger.error("File stream does not contain configs element");
      return;
    }
    @SuppressWarnings("unchecked")
    List<ConfigEntry> configs = (List<ConfigEntry>) wrapper.get("configs");
    if (wrapper.contains("idToPortfolioMap")) {
      @SuppressWarnings("unchecked")
      Map<UniqueId, String> idToPortfolioMap = (Map<UniqueId, String>) wrapper.get("idToPortfolioMap");
      if (idToPortfolioMap == null) {
        s_logger.warn("Apparently corrupt portfolio id -> name map, won't attempt to port portfolio ids");
        loadConfigs(configs, Collections.<UniqueId, String>emptyMap());
      } else {
        loadConfigs(configs, idToPortfolioMap);
      }
    } else {
      loadConfigs(configs, Collections.<UniqueId, String>emptyMap());
    }
   
  }

  private void loadConfigs(List<ConfigEntry> configs, Map<UniqueId, String> idNameMap) {
    for (ConfigEntry entry : configs) {
      try {
        Class<?> clazz = Class.forName(entry.getType());
        Object object = entry.getObject();       
        if (object instanceof ViewDefinition) {
          if (_attemptToPortPortfolioIds) {
            object = attemptToPortPortfolioIds((ViewDefinition) object, idNameMap);
          }
        }
        ConfigItem<Object> item = ConfigItem.of(object, entry.getName(), clazz);
        if (_actuallyStore) {
          ConfigMasterUtils.storeByName(_configMaster, item);
          if (_verbose) {
            s_logger.info("Stored " + entry.getName() + " of type " + entry.getType());
          }
        } else {
          if (_verbose) {
            s_logger.info("Simulated store " + entry.getName() + " of type " + entry.getType());
          }
        }

      } catch (ClassNotFoundException ex) {
        s_logger.error("Could not find class called " + entry.getType() + " skipping config " + entry.getName());
      }
    }
  }

  private ViewDefinition attemptToPortPortfolioIds(ViewDefinition viewDefinition, Map<UniqueId, String> idNameMap) {
    if (idNameMap.containsKey(viewDefinition.getPortfolioId())) {
      if (_verbose) {
        s_logger.info("Attempting to port portfolio id " + viewDefinition.getPortfolioId());
      }
      UniqueId replacementId = lookupPortfolioByName(idNameMap.get(viewDefinition.getPortfolioId()));
      if (replacementId != null) {
        if (viewDefinition.getPortfolioId().isLatest()) {
          replacementId = replacementId.toLatest();
        }
        return viewDefinition.copyWith(viewDefinition.getName(), replacementId, viewDefinition.getMarketDataUser());
      }
    }
    return viewDefinition;
  }
 
  private UniqueId lookupPortfolioByName(String name) {
    PortfolioSearchRequest searchRequest = new PortfolioSearchRequest();
    searchRequest.setName(name);
    PortfolioSearchResult searchResult = _portfolioMaster.search(searchRequest);
    try {
      ManageablePortfolio singlePortfolio = searchResult.getSinglePortfolio();
      if (_verbose) {
        s_logger.info("Found portfolio called " + name + " mapping in it's id: " + singlePortfolio.getUniqueId());
      }
      return singlePortfolio.getUniqueId();
    } catch (IllegalStateException ise) {
      s_logger.warn("Found multiple portfolios called " + name + " so skipping");
      return null;
    } catch (OpenGammaRuntimeException ogre) {
      if (searchResult.getDocuments().size() > 1) {
        s_logger.warn("Found multiple portfolios called " + name + " so skipping");
      } else {
        s_logger.warn("Didn't find a portfolio called " + name + " so skipping");
      }
      return null;
    }
  }
}
TOP

Related Classes of com.opengamma.integration.tool.config.ConfigLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.