/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.viewer;
import java.net.URI;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import net.sf.ehcache.util.NamedThreadFactory;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.commons.lang.StringUtils;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import com.opengamma.component.ComponentServer;
import com.opengamma.component.rest.RemoteComponentServer;
import com.opengamma.core.exchange.ExchangeSource;
import com.opengamma.core.exchange.impl.RemoteExchangeSource;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesSource;
import com.opengamma.core.historicaltimeseries.impl.RemoteHistoricalTimeSeriesSource;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.holiday.impl.RemoteHolidaySource;
import com.opengamma.core.position.PositionSource;
import com.opengamma.core.position.impl.RemotePositionSource;
import com.opengamma.core.region.RegionSource;
import com.opengamma.core.region.impl.RemoteRegionSource;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.core.security.impl.RemoteSecuritySource;
import com.opengamma.engine.function.config.FunctionConfigurationSource;
import com.opengamma.engine.view.ViewProcessor;
import com.opengamma.engine.view.helper.AvailableOutputsProvider;
import com.opengamma.financial.analytics.ircurve.InterpolatedYieldCurveDefinitionMaster;
import com.opengamma.financial.analytics.ircurve.InterpolatedYieldCurveDefinitionSource;
import com.opengamma.financial.analytics.ircurve.InterpolatedYieldCurveSpecificationBuilder;
import com.opengamma.financial.analytics.ircurve.rest.RemoteInterpolatedYieldCurveDefinitionMaster;
import com.opengamma.financial.analytics.ircurve.rest.RemoteInterpolatedYieldCurveDefinitionSource;
import com.opengamma.financial.analytics.ircurve.rest.RemoteInterpolatedYieldCurveSpecificationBuilder;
import com.opengamma.financial.currency.CurrencyMatrixSource;
import com.opengamma.financial.currency.rest.RemoteCurrencyMatrixSource;
import com.opengamma.financial.function.rest.RemoteFunctionConfigurationSource;
import com.opengamma.financial.security.RemoteFinancialSecuritySource;
import com.opengamma.financial.user.FinancialUserManager;
import com.opengamma.financial.user.rest.RemoteClient;
import com.opengamma.financial.view.rest.RemoteAvailableOutputsProvider;
import com.opengamma.financial.view.rest.RemoteViewProcessor;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.config.impl.RemoteConfigMaster;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesLoader;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster;
import com.opengamma.master.historicaltimeseries.impl.RemoteHistoricalTimeSeriesLoader;
import com.opengamma.master.historicaltimeseries.impl.RemoteHistoricalTimeSeriesMaster;
import com.opengamma.master.holiday.HolidayMaster;
import com.opengamma.master.holiday.impl.RemoteHolidayMaster;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.portfolio.impl.RemotePortfolioMaster;
import com.opengamma.master.position.PositionMaster;
import com.opengamma.master.position.impl.RemotePositionMaster;
import com.opengamma.master.security.SecurityMaster;
import com.opengamma.master.security.impl.RemoteSecurityMaster;
import com.opengamma.provider.historicaltimeseries.HistoricalTimeSeriesProvider;
import com.opengamma.provider.historicaltimeseries.impl.RemoteHistoricalTimeSeriesProvider;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.jms.JmsConnector;
import com.opengamma.util.jms.JmsConnectorFactoryBean;
import com.opengamma.util.rest.FudgeRestClient;
/**
* Configuration tools for remote engine components.
*/
public class RemoteEngine {
private FudgeContext _fudgeContext;
private ComponentServer _components;
private JmsConnector _jmsConnector;
private URI _configurationURI;
private FudgeMsg _configuration;
private final ScheduledExecutorService _scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("rvp"));
public RemoteEngine(String baseUrl) {
ArgumentChecker.notNull(StringUtils.trimToNull(baseUrl), "baseUrl");
init(baseUrl);
}
private void init(String baseUrl) {
baseUrl = StringUtils.stripEnd(baseUrl, "/");
if (baseUrl.endsWith("/jax") == false) {
baseUrl += "/jax";
}
_fudgeContext = OpenGammaFudgeContext.getInstance();
final URI componentsUri = URI.create(baseUrl);
final RemoteComponentServer remote = new RemoteComponentServer(componentsUri);
_components = remote.getComponentServer();
_configurationURI = URI.create(baseUrl + "/configuration/0");
_configuration = FudgeRestClient.create().accessFudge(_configurationURI).get(FudgeMsg.class);
final String activeMQBroker = _configuration.getString("activeMQ");
final JmsConnectorFactoryBean factory = new JmsConnectorFactoryBean();
factory.setName(getClass().getSimpleName());
factory.setClientBrokerUri(URI.create(activeMQBroker));
factory.setConnectionFactory(new ActiveMQConnectionFactory(factory.getClientBrokerUri()));
_jmsConnector = factory.getObjectCreating();
}
public FudgeContext getFudgeContext() {
return _fudgeContext;
}
public JmsConnector getJmsConnector() {
return _jmsConnector;
}
public FudgeMsg getConfiguration() {
return _configuration;
}
public URI getConfigurationURI() {
return _configurationURI;
}
/**
* Gets the components.
* @return the components
*/
public ComponentServer getComponents() {
return _components;
}
public RemoteViewProcessor getViewProcessor(final String name) {
final URI uri = _components.getComponentInfo(ViewProcessor.class, name).getUri();
return new RemoteViewProcessor(uri, _jmsConnector, _scheduler);
}
public RemoteConfigMaster getConfigMaster(final String name) {
final URI uri = _components.getComponentInfo(ConfigMaster.class, name).getUri();
return new RemoteConfigMaster(uri);
}
public RemotePortfolioMaster getPortfolioMaster(final String name) {
final URI uri = _components.getComponentInfo(PortfolioMaster.class, name).getUri();
return new RemotePortfolioMaster(uri);
}
public RemotePositionMaster getPositionMaster(final String name) {
final URI uri = _components.getComponentInfo(PositionMaster.class, name).getUri();
return new RemotePositionMaster(uri);
}
public RemoteSecuritySource getSecuritySource(final String name) {
final URI uri = _components.getComponentInfo(SecuritySource.class, name).getUri();
return new RemoteFinancialSecuritySource(uri);
}
public RemoteSecurityMaster getSecurityMaster(final String name) {
final URI uri = _components.getComponentInfo(SecurityMaster.class, name).getUri();
return new RemoteSecurityMaster(uri);
}
public RemoteHistoricalTimeSeriesSource getHistoricalTimeSeriesSource(final String name) {
final URI uri = _components.getComponentInfo(HistoricalTimeSeriesSource.class, name).getUri();
return new RemoteHistoricalTimeSeriesSource(uri);
}
public RemoteCurrencyMatrixSource getCurrencyMatrixSource(final String name) {
final URI uri = _components.getComponentInfo(CurrencyMatrixSource.class, name).getUri();
return new RemoteCurrencyMatrixSource(uri);
}
public RemoteFunctionConfigurationSource getRepositoryConfigurationSource(final String name) {
final URI uri = _components.getComponentInfo(FunctionConfigurationSource.class, name).getUri();
return new RemoteFunctionConfigurationSource(uri);
}
public RemotePositionSource getPositionSource(final String name) {
final URI uri = _components.getComponentInfo(PositionSource.class, name).getUri();
return new RemotePositionSource(uri);
}
public RemoteExchangeSource getExchangeSource(final String name) {
final URI uri = _components.getComponentInfo(ExchangeSource.class, name).getUri();
return new RemoteExchangeSource(uri);
}
public RemoteRegionSource getRegionSource(final String name) {
final URI uri = _components.getComponentInfo(RegionSource.class, name).getUri();
return new RemoteRegionSource(uri);
}
public RemoteHolidaySource getHolidaySource(final String name) {
final URI uri = _components.getComponentInfo(HolidaySource.class, name).getUri();
return new RemoteHolidaySource(uri);
}
public RemoteHolidayMaster getHolidayMaster(final String name) {
final URI uri = _components.getComponentInfo(HolidayMaster.class, name).getUri();
return new RemoteHolidayMaster(uri);
}
public RemoteInterpolatedYieldCurveDefinitionSource getInterpolatedYieldCurveDefinitionSource(final String name) {
final URI uri = _components.getComponentInfo(InterpolatedYieldCurveDefinitionSource.class, name).getUri();
return new RemoteInterpolatedYieldCurveDefinitionSource(uri);
}
public RemoteInterpolatedYieldCurveDefinitionMaster getInterpolatedYieldCurveDefinitionMaster(final String name) {
final URI uri = _components.getComponentInfo(InterpolatedYieldCurveDefinitionMaster.class, name).getUri();
return new RemoteInterpolatedYieldCurveDefinitionMaster(uri);
}
public RemoteInterpolatedYieldCurveSpecificationBuilder getInterpolatedYieldCurveSpecificationBuilder(final String name) {
final URI uri = _components.getComponentInfo(InterpolatedYieldCurveSpecificationBuilder.class, name).getUri();
return new RemoteInterpolatedYieldCurveSpecificationBuilder(uri);
}
//-------------------------------------------------------------------------
public RemoteAvailableOutputsProvider getAvailableOutputsProvider(String name) {
final URI uri = _components.getComponentInfo(AvailableOutputsProvider.class, name).getUri();
return new RemoteAvailableOutputsProvider(uri);
}
public RemoteClient getUserClient(final String finUserManagerComponentName, final String username, final String clientId) {
final URI uri = _components.getComponentInfo(FinancialUserManager.class, finUserManagerComponentName).getUri();
return RemoteClient.forClient(_fudgeContext, uri, username, clientId);
}
public RemoteHistoricalTimeSeriesMaster getHistoricalTimeSeriesMaster(final String name) {
final URI uri = _components.getComponentInfo(HistoricalTimeSeriesMaster.class, name).getUri();
return new RemoteHistoricalTimeSeriesMaster(uri);
}
public RemoteHistoricalTimeSeriesProvider getHistoricalTimeSeriesProvider(final String name) {
final URI uri = _components.getComponentInfo(HistoricalTimeSeriesProvider.class, name).getUri();
return new RemoteHistoricalTimeSeriesProvider(uri);
}
public RemoteHistoricalTimeSeriesLoader getHistoricalTimeSeriesLoader(final String name) {
final URI uri = _components.getComponentInfo(HistoricalTimeSeriesLoader.class, name).getUri();
return new RemoteHistoricalTimeSeriesLoader(uri);
}
public RemoteFunctionConfigurationSource getFunctionConfigurationSource(final String name) {
final URI uri = _components.getComponentInfo(FunctionConfigurationSource.class, name).getUri();
return new RemoteFunctionConfigurationSource(uri);
}
public void shutDown() {
if (_scheduler != null) {
_scheduler.shutdownNow();
}
if (_jmsConnector != null) {
_jmsConnector.close();
}
}
}