/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.historicaltimeseries.impl; import java.net.URI; import javax.ws.rs.core.UriBuilder; import org.fudgemsg.FudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.threeten.bp.LocalDate; import com.opengamma.core.change.BasicChangeManager; import com.opengamma.core.change.ChangeManager; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesAdjuster; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesAdjustment; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.rest.AbstractRemoteClient; import com.opengamma.util.rest.UniformInterfaceException404NotFound; /** * Provides remote access to a {@link HistoricalTimeSeriesResolver}. */ public class RemoteHistoricalTimeSeriesResolver extends AbstractRemoteClient implements HistoricalTimeSeriesResolver { private final ChangeManager _changeManager; public RemoteHistoricalTimeSeriesResolver(final URI baseUri) { super(baseUri); _changeManager = new BasicChangeManager(); } public RemoteHistoricalTimeSeriesResolver(final URI baseUri, ChangeManager changeManager) { super(baseUri); _changeManager = changeManager; } @Override public ChangeManager changeManager() { return _changeManager; } private class Adjuster implements HistoricalTimeSeriesAdjuster { private final URI _base; private final ExternalIdBundle _bundle; private final String _adjustment; public Adjuster(final URI base, final ExternalIdBundle bundle, final String adjustment) { _base = base; _bundle = bundle; _adjustment = adjustment; } @Override public HistoricalTimeSeries adjust(final ExternalIdBundle securityIdBundle, final HistoricalTimeSeries timeSeries) { return getAdjustment(securityIdBundle).adjust(timeSeries); } private String getAdjustmentString(final ExternalIdBundle securityIdBundle) { if (_bundle.equals(securityIdBundle)) { return _adjustment; } else { final URI uri = UriBuilder.fromUri(_base).path("adjustment").queryParam("id", securityIdBundle.toStringList().toArray()).build(); final FudgeMsg response = accessRemote(uri).get(FudgeMsg.class); return response.getString("adjustment"); } } @Override public HistoricalTimeSeriesAdjustment getAdjustment(final ExternalIdBundle securityIdBundle) { return HistoricalTimeSeriesAdjustment.parse(getAdjustmentString(securityIdBundle)); } } @Override public HistoricalTimeSeriesResolutionResult resolve(final ExternalIdBundle identifierBundle, final LocalDate identifierValidityDate, final String dataSource, final String dataProvider, final String dataField, final String resolutionKey) { ArgumentChecker.notNull(identifierBundle, "identifierBundle"); ArgumentChecker.notNull(dataField, "dataField"); try { final FudgeDeserializer fdc = new FudgeDeserializer(getFudgeContext()); final UriBuilder uri = UriBuilder.fromUri(getBaseUri()).path("resolve"); for (ExternalId id : identifierBundle) { uri.segment("id", id.toString()); } if (identifierValidityDate != null) { uri.segment("identifierValidityDate", identifierValidityDate.toString()); } if (dataSource != null) { uri.segment("dataSource", dataSource); } if (dataProvider != null) { uri.segment("dataProvider", dataProvider); } if (dataField != null) { uri.segment("dataField", dataField); } if (resolutionKey != null) { uri.segment("resolutionKey", resolutionKey); } final URI req = uri.build(); final FudgeMsg response = accessRemote(req).get(FudgeMsg.class); final String adjustment = response.getString("adjustment"); return new HistoricalTimeSeriesResolutionResult( fdc.fieldValueToObject(ManageableHistoricalTimeSeriesInfo.class, response.getByName("info")), (adjustment != null) ? new Adjuster(req, identifierBundle, adjustment) : null); } catch (UniformInterfaceException404NotFound e) { return null; } } }