/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.view.rest; import java.net.URI; import java.util.concurrent.ScheduledExecutorService; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriBuilder; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.config.ConfigSource; import com.opengamma.core.config.impl.RemoteConfigSource; import com.opengamma.engine.marketdata.NamedMarketDataSpecificationRepository; import com.opengamma.engine.marketdata.snapshot.MarketDataSnapshotter; import com.opengamma.engine.resource.EngineResourceManager; import com.opengamma.engine.view.ViewProcess; import com.opengamma.engine.view.ViewProcessor; import com.opengamma.engine.view.client.ViewClient; import com.opengamma.engine.view.cycle.ViewCycle; import com.opengamma.id.UniqueId; import com.opengamma.livedata.UserPrincipal; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.jms.JmsConnector; import com.opengamma.util.rest.FudgeRestClient; import com.sun.jersey.api.client.ClientResponse; /** * Provides access to a remote {@link ViewProcessor}. */ public class RemoteViewProcessor implements ViewProcessor { private final URI _baseUri; private final ScheduledExecutorService _heartbeatScheduler; private final FudgeRestClient _client; private final JmsConnector _jmsConnector; /** * Constructs an instance. * * @param baseUri the base URI of the remote view processor * @param jmsConnector the JMS connector * @param heartbeatScheduler the scheduler to be used to send heartbeats to the remote view processor */ public RemoteViewProcessor(URI baseUri, JmsConnector jmsConnector, ScheduledExecutorService heartbeatScheduler) { _baseUri = baseUri; _heartbeatScheduler = heartbeatScheduler; _client = FudgeRestClient.create(); _jmsConnector = jmsConnector; } @Override public String getName() { URI uri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_NAME).build(); return _client.accessFudge(uri).get(String.class); } @Override public ConfigSource getConfigSource() { URI uri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_CONFIG_SOURCE).build(); return new RemoteConfigSource(uri); } @Override public NamedMarketDataSpecificationRepository getNamedMarketDataSpecificationRepository() { URI uri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_NAMED_MARKET_DATA_SPEC_REPOSITORY).build(); return new RemoteNamedMarketDataSpecificationRepository(uri); } //------------------------------------------------------------------------- @Override public ViewProcess getViewProcess(UniqueId viewProcessId) { URI uri = DataViewProcessorResource.uriViewProcess(_baseUri, viewProcessId); return new RemoteViewProcess(uri, _client); } //------------------------------------------------------------------------- @Override public RemoteViewClient createViewClient(UserPrincipal clientUser) { URI uri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_CLIENTS).build(); ClientResponse response = _client.accessFudge(uri).post(ClientResponse.class, clientUser); if (response.getStatus() != Status.CREATED.getStatusCode()) { throw new OpenGammaRuntimeException("Could not create view client: " + response); } URI clientLocation = response.getLocation(); return new RemoteViewClient(this, clientLocation, OpenGammaFudgeContext.getInstance(), _jmsConnector, _heartbeatScheduler); } @Override public ViewClient getViewClient(UniqueId clientId) { URI clientsBaseUri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_CLIENTS).build(); URI clientUri = DataViewProcessorResource.uriClient(clientsBaseUri, clientId); return new RemoteViewClient(this, clientUri, OpenGammaFudgeContext.getInstance(), _jmsConnector, _heartbeatScheduler); } //------------------------------------------------------------------------- @Override public EngineResourceManager<ViewCycle> getViewCycleManager() { URI uri = UriBuilder.fromUri(_baseUri).path(DataViewProcessorResource.PATH_CYCLES).build(); return new RemoteViewCycleManager(uri, _heartbeatScheduler, _client); } //------------------------------------------------------------------------- public MarketDataSnapshotter getMarketDataSnapshotter(MarketDataSnapshotter.Mode mode) { URI uri = DataViewProcessorResource.uriSnapshotter(_baseUri, mode); return new RemoteMarketDataSnapshotter(uri, _client); } }