/**
* 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.net.URI;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import org.fudgemsg.FudgeMsg;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
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.rest.AbstractRemoteClient;
/**
* Provides access to a remote reference-data provider.
* <p>
* This is a client that connects to a reference-data provider at a remote URI.
*/
public class RemoteReferenceDataProvider extends AbstractRemoteClient implements ReferenceDataProvider {
/**
* Creates an instance.
*
* @param baseUri the base target URI for all RESTful web services, not null
*/
public RemoteReferenceDataProvider(final URI baseUri) {
super(baseUri);
}
//-------------------------------------------------------------------------
// delegate convenience methods to request/result method
// code copied from AbstractReferenceDataProvider due to lack of multiple inheritance
//-------------------------------------------------------------------------
@Override
public String getReferenceDataValue(String identifier, String dataField) {
return getReferenceDataValues(Collections.singleton(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(Collections.singleton(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(identifier, value);
}
}
}
return map;
}
@Override
public Map<String, String> getReferenceDataValues(Iterable<String> identifiers, String dataField) {
Map<String, FudgeMsg> data = getReferenceData(identifiers, Collections.singleton(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 AbstractReferenceDataProvider.queryMap(request, this);
}
@Override
public Map<String, FudgeMsg> getReferenceDataIgnoreCache(Iterable<String> identifiers, Iterable<String> dataFields) {
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(identifiers, dataFields, false);
return AbstractReferenceDataProvider.queryMap(request, this);
}
@Override
public ReferenceDataProviderGetResult getReferenceData(ReferenceDataProviderGetRequest request) {
ArgumentChecker.notNull(request, "request");
URI uri = DataReferenceDataProviderResource.uriGet(getBaseUri());
return accessRemote(uri).post(ReferenceDataProviderGetResult.class, request);
}
}