/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.bbg.referencedata.impl; import java.util.Map; import java.util.Set; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; 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.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; /** * Abstract implementation of a provider of reference data. * <p> * This provides default implementations of the interface methods that delegate to a * protected method that subclasses must implement. */ public abstract class AbstractReferenceDataProvider implements ReferenceDataProvider { /** * Creates an instance. */ public AbstractReferenceDataProvider() { } //------------------------------------------------------------------------- @Override public String getReferenceDataValue(String identifier, String dataField) { return getReferenceDataValues(ImmutableSet.of(identifier), dataField).get(identifier); } @Override public Map<String, String> getReferenceDataValues(String identifier, Iterable<String> dataFields) { Set<String> fields = ImmutableSet.copyOf(dataFields); // copy to avoid implementation bugs Map<String, FudgeMsg> data = getReferenceData(ImmutableSet.of(identifier), dataFields); // extract field to value Map<String, String> map = Maps.newHashMap(); FudgeMsg msg = data.get(identifier); if (msg != null) { for (String field : fields) { String value = msg.getString(field); if (value != null) { map.put(field, value); } } } return map; } @Override public Map<String, String> getReferenceDataValues(Iterable<String> identifiers, String dataField) { Map<String, FudgeMsg> data = getReferenceData(identifiers, ImmutableSet.of(dataField)); // extract identifier to value Map<String, String> map = Maps.newHashMap(); for (String identifier : data.keySet()) { String value = data.get(identifier).getString(dataField); if (value != null) { map.put(identifier, value); } } return map; } @Override public Map<String, FudgeMsg> getReferenceData(Iterable<String> identifiers, Iterable<String> dataFields) { ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(identifiers, dataFields, true); return queryMap(request, this); } @Override public Map<String, FudgeMsg> getReferenceDataIgnoreCache(Iterable<String> identifiers, Iterable<String> dataFields) { ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(identifiers, dataFields, false); return queryMap(request, this); } protected static Map<String, FudgeMsg> queryMap(final ReferenceDataProviderGetRequest request, final ReferenceDataProvider provider) { final Set<String> identifiers = ImmutableSet.copyOf(request.getIdentifiers()); // copy to avoid implementation bugs final Set<String> fields = ImmutableSet.copyOf(request.getFields()); // copy to avoid implementation bugs final ReferenceDataProviderGetResult result = provider.getReferenceData(request); // extract identifier to field-values Map<String, FudgeMsg> map = Maps.newHashMap(); for (String identifier : identifiers) { ReferenceData data = result.getReferenceDataOrNull(identifier); if (data != null) { // filter results by error list (if clause is an optimization) if (data.getErrors().size() == 0) { map.put(identifier, data.getFieldValues()); } else { if (data.isIdentifierError() == false) { MutableFudgeMsg values = OpenGammaFudgeContext.getInstance().newMessage(data.getFieldValues()); for (String field : fields) { if (data.isError(field)) { values.remove(field); } } map.put(identifier, values); } } } } return map; } @Override public ReferenceDataProviderGetResult getReferenceData(ReferenceDataProviderGetRequest request) { ArgumentChecker.notNull(request, "request"); // short-cut empty case if (request.getIdentifiers().isEmpty()) { return new ReferenceDataProviderGetResult(); } if (request.getFields().isEmpty()) { ReferenceDataProviderGetResult result = new ReferenceDataProviderGetResult(); for (String identifier : request.getIdentifiers()) { result.addReferenceData(new ReferenceData(identifier)); } return result; } // get time-series return doBulkGet(request); } //------------------------------------------------------------------------- /** * Gets the reference data. * * @param request the request, with a non-empty collections, not null * @return the result, not null */ protected abstract ReferenceDataProviderGetResult doBulkGet(ReferenceDataProviderGetRequest request); //------------------------------------------------------------------------- @Override public String toString() { return getClass().getSimpleName(); } }