/** * 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; import com.opengamma.util.tuple.Pairs; /** * 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(Pairs.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(Pairs.of(identifier, field))) { if (alteredFieldData.hasField(field)) { alteredFieldData.remove(field); } alteredFieldData.add(field, _patches.get(Pairs.of(identifier, field))); refData.removeErrors(field); } } s_logger.debug("Patching {} with {}", new Object[] {fieldData, alteredFieldData }); refData.setFieldValues(alteredFieldData); } newResult.addReferenceData(refData); } return newResult; } }