/******************************************************************************* * 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.marketdata.osgi.host; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import com.quantcomponents.core.model.BarSize; import com.quantcomponents.core.model.DataType; import com.quantcomponents.core.model.IContract; import com.quantcomponents.core.remote.IUIDGenerator; import com.quantcomponents.core.remote.ServiceHandle; import com.quantcomponents.marketdata.IStockDatabase; import com.quantcomponents.marketdata.osgi.IMutableOHLCTimeSeriesHost; import com.quantcomponents.marketdata.osgi.IMutableOHLCTimeSeriesHostLocal; import com.quantcomponents.marketdata.osgi.IMutableTickTimeSeriesHost; import com.quantcomponents.marketdata.osgi.IOHLCTimeSeriesHost; import com.quantcomponents.marketdata.osgi.IOHLCTimeSeriesHostLocal; import com.quantcomponents.marketdata.osgi.IStockDatabaseHost; import com.quantcomponents.marketdata.osgi.IStockDatabaseHostLocal; import com.quantcomponents.marketdata.osgi.ITickTimeSeriesHostLocal; public class StockDatabaseHost implements IStockDatabaseHost, IStockDatabaseHostLocal { private static class StockDatabaseInfo { IStockDatabase stockDatabase; ServiceHandle<IStockDatabaseHost> handle; ServiceHandle<IMutableOHLCTimeSeriesHost> ohlcTimeSeriesHandle; ServiceHandle<IMutableTickTimeSeriesHost> tickTimeSeriesHandle; ServiceHandle<IOHLCTimeSeriesHost> virtualTimeSeriesHandle; } @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(StockDatabaseHost.class.getName()); private final Map<ServiceHandle<IStockDatabaseHost>, StockDatabaseInfo> allStockDbs = new ConcurrentHashMap<ServiceHandle<IStockDatabaseHost>, StockDatabaseInfo>(); private volatile IMutableOHLCTimeSeriesHostLocal ohlcTimeSeriesHost; private volatile ITickTimeSeriesHostLocal tickTimeSeriesHost; private volatile IOHLCTimeSeriesHostLocal virtualTimeSeriesHost; private volatile IUIDGenerator uidGenerator; public StockDatabaseHost() {} public StockDatabaseHost(IMutableOHLCTimeSeriesHostLocal ohlcTimeSeriesHost, ITickTimeSeriesHostLocal tickTimeSeriesHost, IOHLCTimeSeriesHostLocal virtualTimeSeriesHost, IUIDGenerator uidGenerator) { this.ohlcTimeSeriesHost = ohlcTimeSeriesHost; this.tickTimeSeriesHost = tickTimeSeriesHost; this.virtualTimeSeriesHost = virtualTimeSeriesHost; this.uidGenerator = uidGenerator; } public void deactivate() { allStockDbs.clear(); } public void setOhlcTimeSeriesHost(IMutableOHLCTimeSeriesHostLocal ohlcTimeSeriesHost) { this.ohlcTimeSeriesHost = ohlcTimeSeriesHost; } public void setTickTimeSeriesHost(ITickTimeSeriesHostLocal tickTimeSeriesHost) { this.tickTimeSeriesHost = tickTimeSeriesHost; } public void setVirtualTimeSeriesHost(IOHLCTimeSeriesHostLocal virtualTimeSeriesHost) { this.virtualTimeSeriesHost = virtualTimeSeriesHost; } public void setUidGenerator(IUIDGenerator uidGenerator) { this.uidGenerator = uidGenerator; } public void finalize() throws Throwable { close(); super.finalize(); } @Override public ServiceHandle<IMutableOHLCTimeSeriesHost> getOHLCTimeSeries(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).ohlcTimeSeriesHandle; } @Override public ServiceHandle<IMutableTickTimeSeriesHost> getTickTimeSeries(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).tickTimeSeriesHandle; } @Override public ServiceHandle<IOHLCTimeSeriesHost> getVirtualTimeSeries(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).virtualTimeSeriesHandle; } @Override public long getTimestamp(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getTimestamp(); } @Override public IContract getContract(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getContract(); } @Override public BarSize getBarSize(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getBarSize(); } @Override public DataType getDataType(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getDataType(); } @Override public boolean isIncludeAfterHours(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.isIncludeAfterHours(); } @Override public TimeZone getTimeZone(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getTimeZone(); } @SuppressWarnings("unchecked") @Override public ServiceHandle<IStockDatabaseHost> addStockDatabase(IStockDatabase stockDatabase) { StockDatabaseInfo info = new StockDatabaseInfo(); info.stockDatabase = stockDatabase; info.ohlcTimeSeriesHandle = (ServiceHandle<IMutableOHLCTimeSeriesHost>) ohlcTimeSeriesHost.addSeries(stockDatabase.getOHLCTimeSeries()); info.tickTimeSeriesHandle = (ServiceHandle<IMutableTickTimeSeriesHost>) tickTimeSeriesHost.addSeries(stockDatabase.getTickTimeSeries()); info.virtualTimeSeriesHandle = (ServiceHandle<IOHLCTimeSeriesHost>) virtualTimeSeriesHost.addSeries(stockDatabase.getVirtualTimeSeries()); info.handle = new ServiceHandle<IStockDatabaseHost>(uidGenerator.nextUID()); allStockDbs.put(info.handle, info); return info.handle; } @Override public void removeStockDatabase(ServiceHandle<IStockDatabaseHost> stockDatabaseHostHandle) { StockDatabaseInfo info = retrieveStockDatabaseInfo(stockDatabaseHostHandle); ohlcTimeSeriesHost.removeSeries(info.ohlcTimeSeriesHandle); tickTimeSeriesHost.removeSeries(info.tickTimeSeriesHandle); virtualTimeSeriesHost.removeSeries(info.virtualTimeSeriesHandle); allStockDbs.remove(info.handle); } @Override public IStockDatabase getStockDatabase(ServiceHandle<IStockDatabaseHost> handle) { StockDatabaseInfo info = retrieveStockDatabaseInfo(handle); IStockDatabase stockDb = null; if (info != null) { stockDb = info.stockDatabase; } return stockDb; } @Override public ServiceHandle<IStockDatabaseHost> getStockDatabaseHandle(IStockDatabase service) { for (Map.Entry<ServiceHandle<IStockDatabaseHost>, StockDatabaseInfo> entry : allStockDbs.entrySet()) { if (entry.getValue().stockDatabase.getPersistentID().equals(service.getPersistentID())) { return entry.getKey(); } } return null; } @Override public String getPersistentID(ServiceHandle<IStockDatabaseHost> stockDbHandle) { return retrieveStockDatabaseInfo(stockDbHandle).stockDatabase.getPersistentID(); } private StockDatabaseInfo retrieveStockDatabaseInfo(ServiceHandle<IStockDatabaseHost> stockDatabaseHostHandle) { StockDatabaseInfo info = allStockDbs.get(stockDatabaseHostHandle); if (info == null) { throw new IllegalArgumentException("Stock DB for handle: " + stockDatabaseHostHandle + " not found"); } return info; } private void close() { Collection<ServiceHandle<IStockDatabaseHost>> handles = new ArrayList<ServiceHandle<IStockDatabaseHost>>(); for (StockDatabaseInfo info : allStockDbs.values()) { handles.add(info.handle); } for (ServiceHandle<IStockDatabaseHost> handle : handles) { removeStockDatabase(handle); } } }