/******************************************************************************* * 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.host; 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.IStockDatabaseTradingManager; 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.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.ISeriesHostLocal; import com.quantcomponents.core.remote.ServiceHandle; import com.quantcomponents.marketdata.IStockDatabase; import com.quantcomponents.marketdata.osgi.IStockDatabaseHost; import com.quantcomponents.marketdata.osgi.IStockDatabaseHostLocal; public class StockDatabaseTradingManagerHost implements IStockDatabaseTradingManagerHost { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(StockDatabaseTradingManagerHost.class.getName()); private final Map<TradingAgentExecutionHandle, ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>>> outputSeriesByExecution = new ConcurrentHashMap<TradingAgentExecutionHandle, ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>>>(); private final Map<TradingAgentBindingHandle, Map<String, ServiceHandle<IStockDatabaseHost>>> stockDbHandlesByBindingHandle = new ConcurrentHashMap<TradingAgentBindingHandle, Map<String, ServiceHandle<IStockDatabaseHost>>>(); private volatile IStockDatabaseTradingManager tradingManager; private volatile ISeriesHostLocal<Date, Double, ISeriesPoint<Date, Double>> outputSeriesHost; private volatile IStockDatabaseHostLocal stockDatabaseHost; public synchronized void deactivate() { outputSeriesByExecution.clear(); stockDbHandlesByBindingHandle.clear(); } public void setTradingManager(IStockDatabaseTradingManager manager) { this.tradingManager = manager; } public void setStockDatabaseHost(IStockDatabaseHostLocal stockDatabaseHost) { this.stockDatabaseHost = stockDatabaseHost; } public void setOutputSeriesHost(ISeriesHostLocal<Date, Double, ISeriesPoint<Date, Double>> outputSeriesHost) { this.outputSeriesHost = outputSeriesHost; } @Override public synchronized TradingAgentBindingHandle createBinding(TradingAgentConfigurationHandle tradingAgentConfigurationHandle, Map<String, ServiceHandle<IStockDatabaseHost>> inputSeriesHandles, String name) { Map<String, IStockDatabase> inputStockDatabases = new HashMap<String, IStockDatabase>(); for (Map.Entry<String, ServiceHandle<IStockDatabaseHost>> entry : inputSeriesHandles.entrySet()) { IStockDatabase stockDb = stockDatabaseHost.getStockDatabase(entry.getValue()); inputStockDatabases.put(entry.getKey(), stockDb); } TradingAgentBindingHandle bindingHandle = tradingManager.createBinding(tradingAgentConfigurationHandle, inputStockDatabases, name); stockDbHandlesByBindingHandle.put(bindingHandle, inputSeriesHandles); return bindingHandle; } @Override public synchronized Map<String, ServiceHandle<IStockDatabaseHost>> getBindingInputStockDatabases(TradingAgentBindingHandle bindingHandle) { Map<String, ServiceHandle<IStockDatabaseHost>> inputStockDatabaseHandles = stockDbHandlesByBindingHandle.get(bindingHandle); if (inputStockDatabaseHandles == null) { inputStockDatabaseHandles = new HashMap<String, ServiceHandle<IStockDatabaseHost>>(); Map<String, IStockDatabase> inputStockDatabases = tradingManager.getBindingInputStockDatabases(bindingHandle); for (Map.Entry<String, IStockDatabase> entry : inputStockDatabases.entrySet()){ inputStockDatabaseHandles.put(entry.getKey(), stockDatabaseHost.getStockDatabaseHandle(entry.getValue())); } stockDbHandlesByBindingHandle.put(bindingHandle, inputStockDatabaseHandles); } return inputStockDatabaseHandles; } @Override public synchronized void removeBinding(TradingAgentBindingHandle bindingHandle) { stockDbHandlesByBindingHandle.remove(bindingHandle); tradingManager.removeBinding(bindingHandle); } @Override public synchronized void removeExecution(TradingAgentExecutionHandle executionHandle) { ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> outputSeriesHandle = outputSeriesByExecution.remove(executionHandle); outputSeriesHost.removeSeries(outputSeriesHandle); tradingManager.removeExecution(executionHandle); } @Override public synchronized ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> getExecutionOutput(TradingAgentExecutionHandle executionHandle) { ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> outputSeriesHandle = outputSeriesByExecution.get(executionHandle); if (outputSeriesHandle == null) { outputSeriesHandle = retrieveExecutionOutput(executionHandle); } return outputSeriesHandle; } private synchronized ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> retrieveExecutionOutput(TradingAgentExecutionHandle executionHandle) { ServiceHandle<? extends ISeriesHost<Date, Double, ISeriesPoint<Date, Double>>> outputSeriesHandle = null; ISeries<Date, Double, ISeriesPoint<Date, Double>> outputSeries = tradingManager.getExecutionOutput(executionHandle); if (outputSeries != null) { outputSeriesHandle = outputSeriesHost.addSeries(outputSeries); outputSeriesByExecution.put(executionHandle, outputSeriesHandle); } return outputSeriesHandle; } // ----------------- delegate methods ----------------- @Override public String getPrettyName() { return tradingManager.getPrettyName(); } @Override public boolean isExecutionTypeAvailable(ExecutionType type) { return tradingManager.isExecutionTypeAvailable(type); } @Override public TradingAgentExecutionHandle createExecution(TradingAgentBindingHandle bindingHandle, ExecutionType type) throws ExecutionCreationException { return tradingManager.createExecution(bindingHandle, type); } @Override public Collection<TradingAgentFactoryHandle> getAllTradingAgentFactories() { return tradingManager.getAllTradingAgentFactories(); } @Override public boolean isConfigurationValid(TradingAgentFactoryHandle factoryHandle, Properties configuration, Map<String, String> messages) { return tradingManager.isConfigurationValid(factoryHandle, configuration, messages); } @Override public TradingAgentConfigurationHandle createConfiguration(TradingAgentFactoryHandle factoryHandle, Properties configuration, String name) { return tradingManager.createConfiguration(factoryHandle, configuration, name); } @Override public Collection<TradingAgentConfigurationHandle> getChildren(TradingAgentFactoryHandle tradingAgentFactoryHandle) { return tradingManager.getChildren(tradingAgentFactoryHandle); } @Override public TradingAgentFactoryHandle getParent(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) { return tradingManager.getParent(tradingAgentConfigurationHandle); } @Override public Collection<TradingAgentBindingHandle> getChildren(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) { return tradingManager.getChildren(tradingAgentConfigurationHandle); } @Override public TradingAgentConfigurationHandle getParent(TradingAgentBindingHandle tradingAgentBindingHandle) { return tradingManager.getParent(tradingAgentBindingHandle); } @Override public Collection<TradingAgentExecutionHandle> getChildren(TradingAgentBindingHandle tradingAgentBindingHandle) { return tradingManager.getChildren(tradingAgentBindingHandle); } @Override public TradingAgentBindingHandle getParent(TradingAgentExecutionHandle TradingAgentExecutionHandle) { return tradingManager.getParent(TradingAgentExecutionHandle); } @Override public Properties getConfigurationProperties(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) { return tradingManager.getConfigurationProperties(tradingAgentConfigurationHandle); } @Override public void removeConfiguration(TradingAgentConfigurationHandle tradingAgentConfigurationHandle) { tradingManager.removeConfiguration(tradingAgentConfigurationHandle); } @Override public void startExecution(TradingAgentExecutionHandle executionHandle) { tradingManager.startExecution(executionHandle); } @Override public void pauseExecution(TradingAgentExecutionHandle executionHandle) { tradingManager.pauseExecution(executionHandle); } @Override public void resumeExecution(TradingAgentExecutionHandle executionHandle) { tradingManager.resumeExecution(executionHandle); } @Override public void killExecution(TradingAgentExecutionHandle executionHandle) { tradingManager.killExecution(executionHandle); } @Override public RunningStatus getRunningStatus(TradingAgentExecutionHandle executionHandle) { return tradingManager.getRunningStatus(executionHandle); } }