Package com.opengamma.bbg.referencedata.impl

Source Code of com.opengamma.bbg.referencedata.impl.PatchableReferenceDataProvider

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

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opengamma.bbg.referencedata.ReferenceData;
import com.opengamma.bbg.referencedata.ReferenceDataProvider;
import com.opengamma.bbg.referencedata.ReferenceDataProviderGetRequest;
import com.opengamma.bbg.referencedata.ReferenceDataProviderGetResult;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.tuple.Pair;

/**
* A decorator for a ReferenceDataProvider that allows you to override the results
* from the underlying provider e.g. if you have extra information from another source.
*/
public class PatchableReferenceDataProvider extends AbstractReferenceDataProvider {

  /** Logger. */
  private static final Logger s_logger = LoggerFactory.getLogger(PatchableReferenceDataProvider.class);

  private Map<Pair<String, String>, Object> _patches = new HashMap<Pair<String, String>, Object>();
  private Set<String> _securities = new HashSet<String>();
  private ReferenceDataProvider _underlying;

  /**
   * Creates an instance.
   *
   * @param underlying  the underlying source of reference data
   */
  public PatchableReferenceDataProvider(ReferenceDataProvider underlying) {
    _underlying = underlying;
  }

  //-------------------------------------------------------------------------
  /**
   * Sets an override or replacement value.
   *
   * @param security  the Bloomberg security identifier
   * @param field  the Bloomberg field name
   * @param result  the object to return as a result (must be possible to Fudge encode with standard OG dictionary)
   */
  public void setPatch(String security, String field, Object result) {
    _patches.put(Pair.of(security, field), result);
    _securities.add(security);
  }

  //-------------------------------------------------------------------------
  @Override
  protected ReferenceDataProviderGetResult doBulkGet(ReferenceDataProviderGetRequest request) {
    ReferenceDataProviderGetResult rawResult = _underlying.getReferenceData(request);
    ReferenceDataProviderGetResult newResult = new ReferenceDataProviderGetResult();
   
    for (ReferenceData refData : rawResult.getReferenceData()) {
      String identifier = refData.getIdentifier();
      if (_securities.contains(identifier)) {
        FudgeMsg fieldData = refData.getFieldValues();
        MutableFudgeMsg alteredFieldData = OpenGammaFudgeContext.getInstance().newMessage(fieldData);
        for (String field : request.getFields()) {
          if (_patches.containsKey(Pair.of(identifier, field))) {
            if (alteredFieldData.hasField(field)) {
              alteredFieldData.remove(field);
            }
            alteredFieldData.add(field, _patches.get(Pair.of(identifier, field)));
            refData.removeErrors(field);
          }
        }
        s_logger.debug("Patching {} with {}", new Object[] {fieldData, alteredFieldData });
        refData.setFieldValues(alteredFieldData);
      }
      newResult.addReferenceData(refData);
    }
    return newResult;
  }

}
TOP

Related Classes of com.opengamma.bbg.referencedata.impl.PatchableReferenceDataProvider

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.