Package com.opengamma.core.position.impl

Source Code of com.opengamma.core.position.impl.MockPositionSource

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

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import com.opengamma.DataNotFoundException;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.change.DummyChangeManager;
import com.opengamma.core.position.Portfolio;
import com.opengamma.core.position.PortfolioNode;
import com.opengamma.core.position.Position;
import com.opengamma.core.position.PositionSource;
import com.opengamma.core.position.Trade;
import com.opengamma.id.IdUtils;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdSupplier;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;

/**
* A simple mutable implementation of a source of positions.
* <p>
* This class is intended for testing scenarios.
* It is not thread-safe and must not be used in production.
*/
public class MockPositionSource implements PositionSource {
  // this is currently public for indirect use by another project via ViewTestUtils

  /**
   * The portfolios.
   */
  private final Map<ObjectId, Portfolio> _portfolios = new ConcurrentHashMap<ObjectId, Portfolio>();
  /**
   * A cache of nodes by identifier.
   */
  private final Map<ObjectId, PortfolioNode> _nodes = new ConcurrentHashMap<ObjectId, PortfolioNode>();
  /**
   * A cache of positions by identifier.
   */
  private final Map<ObjectId, Position> _positions = new ConcurrentHashMap<ObjectId, Position>();
  /**
   * A cache of trades by identifier.
   */
  private final Map<ObjectId, Trade> _trades = new ConcurrentHashMap<ObjectId, Trade>();
  /**
   * The suppler of unique identifiers.
   */
  private final UniqueIdSupplier _uniqueIdSupplier;

  /**
   * Creates an instance using the default scheme for each {@link UniqueId} created.
   */
  public MockPositionSource() {
    _uniqueIdSupplier = new UniqueIdSupplier("Mock");
  }

  //-------------------------------------------------------------------------
  @Override
  public Portfolio getPortfolio(final UniqueId uniqueId, final VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(uniqueId, "uniqueId");
    ArgumentChecker.notNull(versionCorrection, "versionCorrection");
    Portfolio portfolio = _portfolios.get(uniqueId.getObjectId());
    if (portfolio == null) {
      throw new DataNotFoundException("Portfolio not found: " + uniqueId);
    }
    return portfolio;
  }

  @Override
  public Portfolio getPortfolio(ObjectId objectId, VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(objectId, "objectId");
    ArgumentChecker.notNull(versionCorrection, "versionCorrection");
    Portfolio portfolio = _portfolios.get(objectId);
    if (portfolio == null) {
      throw new DataNotFoundException("Portfolio not found: " + objectId);
    }
    return portfolio;
  }

  @Override
  public PortfolioNode getPortfolioNode(final UniqueId uniqueId, final VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(uniqueId, "uniqueId");
    ArgumentChecker.notNull(versionCorrection, "versionCorrection");
    PortfolioNode node = _nodes.get(uniqueId.getObjectId());
    if (node == null) {
      throw new DataNotFoundException("PortfolioNode not found: " + uniqueId);
    }
    return node;
  }

  @Override
  public Position getPosition(UniqueId uniqueId) {
    ArgumentChecker.notNull(uniqueId, "uniqueId");
    Position position = _positions.get(uniqueId.getObjectId());
    if (position == null) {
      throw new DataNotFoundException("Position not found: " + uniqueId);
    }
    return position;
  }

  @Override
  public Position getPosition(final ObjectId objectId, final VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(objectId, "objectId");
    ArgumentChecker.notNull(versionCorrection, "versionCorrection");
    Position position = _positions.get(objectId);
    if (position == null) {
      throw new DataNotFoundException("Position not found: " + objectId);
    }
    return position;
  }

  @Override
  public Trade getTrade(UniqueId uniqueId) {
    ArgumentChecker.notNull(uniqueId, "uniqueId");
    Trade trade = _trades.get(uniqueId.getObjectId());
    if (trade == null) {
      throw new DataNotFoundException("Trade not found: " + uniqueId);
    }
    return trade;
  }

  //-------------------------------------------------------------------------
  @Override
  public ChangeManager changeManager() {
    return DummyChangeManager.INSTANCE;
  }

  //-------------------------------------------------------------------------
  /**
   * Gets the list of all portfolio identifiers.
   *
   * @return the portfolio identifiers, unmodifiable, not null
   */
  public Set<ObjectId> getPortfolioIds() {
    return _portfolios.keySet();
  }

  /**
   * Adds a portfolio to the master.
   *
   * @param portfolio  the portfolio to add, not null
   */
  public void addPortfolio(Portfolio portfolio) {
    ArgumentChecker.notNull(portfolio, "portfolio");
   
    _portfolios.put(portfolio.getUniqueId().getObjectId(), portfolio);
    addToCache(portfolio.getUniqueId().getValue(), null, portfolio.getRootNode());
  }

  /**
   * Adds a node to the cache.
   *
   * @param portfolioId  the id, not null
   * @param node  the node to add, not null
   */
  private void addToCache(String portfolioId, UniqueId parentNode, PortfolioNode node) {
    // node
    if (node instanceof SimplePortfolioNode) {
      SimplePortfolioNode nodeImpl = (SimplePortfolioNode) node;
      nodeImpl.setUniqueId(_uniqueIdSupplier.getWithValuePrefix(portfolioId + "-"));
      nodeImpl.setParentNodeId(parentNode);
    }
    _nodes.put(node.getUniqueId().getObjectId(), node);
   
    // position
    for (Position position : node.getPositions()) {
      if (position instanceof SimplePosition) {
        SimplePosition positionImpl = (SimplePosition) position;
        positionImpl.setUniqueId(_uniqueIdSupplier.getWithValuePrefix(portfolioId + "-"));
       
        //add trades
        for (Trade trade : positionImpl.getTrades()) {
          IdUtils.setInto(trade, _uniqueIdSupplier.getWithValuePrefix(portfolioId + "-"));
          _trades.put(trade.getUniqueId().getObjectId(), trade);
        }
      }
      _positions.put(position.getUniqueId().getObjectId(), position);
    }
   
    // recurse
    for (PortfolioNode child : node.getChildNodes()) {
      addToCache(portfolioId, node.getUniqueId(), child);
    }
  }

  /**
   * Removes a portfolio from the master.
   *
   * @param portfolio  the portfolio to remove, not null
   */
  public void removePortfolio(Portfolio portfolio) {
    ArgumentChecker.notNull(portfolio, "portfolio");
    _portfolios.remove(portfolio.getUniqueId().getObjectId());
    removeFromCache(portfolio.getRootNode());
  }

  /**
   * Removes a node from the cache
   *
   * @param node  the node to remove, not null
   */
  private void removeFromCache(PortfolioNode node) {
    _nodes.remove(node.getUniqueId().getObjectId());
    for (Position position : node.getPositions()) {
      for (Trade trade : position.getTrades()) {
        _trades.remove(trade.getUniqueId().getObjectId());
      }
      _positions.remove(position.getUniqueId().getObjectId());
    }
    for (PortfolioNode child : node.getChildNodes()) {
      removeFromCache(child);
    }
  }

}
TOP

Related Classes of com.opengamma.core.position.impl.MockPositionSource

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.