/*******************************************************************************
* Copyright (c) 2013 Luigi Sgro. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Luigi Sgro - initial API and implementation
******************************************************************************/
package com.quantcomponents.algo.osgi.proxy;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import com.quantcomponents.algo.ExecutionCreationException;
import com.quantcomponents.algo.ExecutionType;
import com.quantcomponents.algo.TradingAgentBindingHandle;
import com.quantcomponents.algo.TradingAgentConfigurationHandle;
import com.quantcomponents.algo.TradingAgentExecutionHandle;
import com.quantcomponents.algo.TradingAgentFactoryHandle;
import com.quantcomponents.algo.IManagedRunnable.RunningStatus;
import com.quantcomponents.algo.IStockDatabaseTradingManager;
import com.quantcomponents.algo.osgi.IStockDatabaseTradingManagerHost;
import com.quantcomponents.core.model.ISeries;
import com.quantcomponents.core.model.ISeriesPoint;
import com.quantcomponents.core.osgi.ISeriesHost;
import com.quantcomponents.core.osgi.ISeriesIteratorHost;
import com.quantcomponents.core.osgi.ISeriesListenerHostLocal;
import com.quantcomponents.core.osgi.ImmutableSeriesProxy;
import com.quantcomponents.core.remote.ServiceHandle;
import com.quantcomponents.marketdata.IStockDatabase;
import com.quantcomponents.marketdata.osgi.IStockDatabaseHandleMap;
import com.quantcomponents.marketdata.osgi.IStockDatabaseHost;
public class StockDatabaseTradingManagerProxy implements IStockDatabaseTradingManager {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(StockDatabaseTradingManagerProxy.class.getName());
private final Map<ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>>, ISeries<Date, Double, ISeriesPoint<Date, Double>>> outputSeriesByHandle = new ConcurrentHashMap<ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>>, ISeries<Date, Double, ISeriesPoint<Date, Double>>>();
private volatile IStockDatabaseTradingManagerHost tradingManagerHost;
private volatile IStockDatabaseHandleMap stockDatabaseHandleMap;
private volatile ISeriesHost<Date, Double, ISeriesPoint<Date, Double>> seriesHost;
private volatile ISeriesIteratorHost<Date, Double, ISeriesPoint<Date, Double>> seriesIteratorHost;
private volatile ISeriesListenerHostLocal<Date, Double, ISeriesPoint<Date, Double>> listenerHost;
public void deactivate() {
tradingManagerHost = null;
outputSeriesByHandle.clear();
}
public void setTradingAgentManagerHost(IStockDatabaseTradingManagerHost stockDatabaseTradingManagerHost, Map<?,?> properties) {
this.tradingManagerHost = stockDatabaseTradingManagerHost;
}
public void setStockDatabaseHandleMap(IStockDatabaseHandleMap stockDatabaseHandleMap) {
this.stockDatabaseHandleMap = stockDatabaseHandleMap;
}
public void setSeriesHost(ISeriesHost<Date, Double, ISeriesPoint<Date, Double>> seriesHost) {
this.seriesHost = seriesHost;
}
public void setSeriesIteratorHost(ISeriesIteratorHost<Date, Double, ISeriesPoint<Date, Double>> seriesIteratorHost) {
this.seriesIteratorHost = seriesIteratorHost;
}
public void setListenerHost(ISeriesListenerHostLocal<Date, Double, ISeriesPoint<Date, Double>> listenerHost) {
this.listenerHost = listenerHost;
}
@Override
public TradingAgentBindingHandle createBinding(TradingAgentConfigurationHandle tradingAgentConfigurationHandle, Map<String, IStockDatabase> inputStockDatabases, String name) {
Map<String, ServiceHandle<IStockDatabaseHost>> inputStockDatabaseHandles = new HashMap<String, ServiceHandle<IStockDatabaseHost>>();
for (Map.Entry<String, IStockDatabase> entry : inputStockDatabases.entrySet()) {
ServiceHandle<IStockDatabaseHost> stockDbHandle = stockDatabaseHandleMap.getHandleByStockDb(entry.getValue());
inputStockDatabaseHandles.put(entry.getKey(), stockDbHandle);
}
return tradingManagerHost.createBinding(tradingAgentConfigurationHandle, inputStockDatabaseHandles, name);
}
@Override
public Map<String, IStockDatabase> getBindingInputStockDatabases(TradingAgentBindingHandle bindingHandle) {
Map<String, ServiceHandle<IStockDatabaseHost>> inputSeriesHandles = tradingManagerHost.getBindingInputStockDatabases(bindingHandle);
Map<String, IStockDatabase> inputSeries = new HashMap<String, IStockDatabase>();
for (Map.Entry<String, ServiceHandle<IStockDatabaseHost>> entry : inputSeriesHandles.entrySet()) {
inputSeries.put(entry.getKey(), stockDatabaseHandleMap.getStockDbByHandle(entry.getValue()));
}
return inputSeries;
}
@Override
public synchronized ISeries<Date, Double, ISeriesPoint<Date, Double>> getExecutionOutput(TradingAgentExecutionHandle executionHandle) {
ISeries<Date, Double, ISeriesPoint<Date, Double>> outputSeries = outputSeriesByHandle.get(executionHandle);
if (outputSeries == null) {
ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> outputSeriesHandle = tradingManagerHost.getExecutionOutput(executionHandle);
outputSeries = new ImmutableSeriesProxy<Date, Double, ISeriesPoint<Date, Double>>(seriesHost, seriesIteratorHost, listenerHost, outputSeriesHandle);
outputSeriesByHandle.put(outputSeriesHandle, outputSeries);
}
return outputSeries;
}
@Override
public void removeExecution(TradingAgentExecutionHandle executionHandle) {
outputSeriesByHandle.remove(executionHandle);
tradingManagerHost.removeExecution(executionHandle);
}
@Override
public String getPrettyName() {
return tradingManagerHost.getPrettyName();
}
// ----------------- delegate methods -----------------
@Override
public Collection<TradingAgentFactoryHandle> getAllTradingAgentFactories() {
return tradingManagerHost.getAllTradingAgentFactories();
}
@Override
public boolean isConfigurationValid(TradingAgentFactoryHandle factoryHandle, Properties configuration, Map<String, String> messages) {
return tradingManagerHost.isConfigurationValid(factoryHandle, configuration, messages);
}
@Override
public TradingAgentConfigurationHandle createConfiguration(TradingAgentFactoryHandle factoryHandle, Properties configuration, String name) {
return tradingManagerHost.createConfiguration(factoryHandle, configuration, name);
}
@Override
public Properties getConfigurationProperties(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) {
return tradingManagerHost.getConfigurationProperties(tradingAgentConfigurationHandle);
}
@Override
public Collection<TradingAgentConfigurationHandle> getChildren(TradingAgentFactoryHandle tradingAgentFactoryHandle) {
return tradingManagerHost.getChildren(tradingAgentFactoryHandle);
}
@Override
public TradingAgentFactoryHandle getParent(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) {
return tradingManagerHost.getParent(tradingAgentConfigurationHandle);
}
@Override
public Collection<TradingAgentBindingHandle> getChildren(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) {
return tradingManagerHost.getChildren(tradingAgentConfigurationHandle);
}
@Override
public TradingAgentConfigurationHandle getParent(TradingAgentBindingHandle tradingAgentBindingHandle) {
return tradingManagerHost.getParent(tradingAgentBindingHandle);
}
@Override
public boolean isExecutionTypeAvailable(ExecutionType type) {
return tradingManagerHost.isExecutionTypeAvailable(type);
}
@Override
public TradingAgentExecutionHandle createExecution(TradingAgentBindingHandle bindingHandle, ExecutionType type) throws ExecutionCreationException {
return tradingManagerHost.createExecution(bindingHandle, type);
}
@Override
public Collection<TradingAgentExecutionHandle> getChildren(TradingAgentBindingHandle tradingAgentBindingHandle) {
return tradingManagerHost.getChildren(tradingAgentBindingHandle);
}
@Override
public TradingAgentBindingHandle getParent(TradingAgentExecutionHandle TradingAgentExecutionHandle) {
return tradingManagerHost.getParent(TradingAgentExecutionHandle);
}
@Override
public void removeBinding(TradingAgentBindingHandle bindingHandle) {
tradingManagerHost.removeBinding(bindingHandle);
}
@Override
public void removeConfiguration(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) {
tradingManagerHost.removeConfiguration(tradingAgentConfigurationHandle);
}
@Override
public void startExecution(TradingAgentExecutionHandle executionHandle) {
tradingManagerHost.startExecution(executionHandle);
}
@Override
public void pauseExecution(TradingAgentExecutionHandle executionHandle) {
tradingManagerHost.pauseExecution(executionHandle);
}
@Override
public void resumeExecution(TradingAgentExecutionHandle executionHandle) {
tradingManagerHost.resumeExecution(executionHandle);
}
@Override
public void killExecution(TradingAgentExecutionHandle executionHandle) {
tradingManagerHost.killExecution(executionHandle);
}
@Override
public RunningStatus getRunningStatus(TradingAgentExecutionHandle executionHandle) {
return tradingManagerHost.getRunningStatus(executionHandle);
}
}