/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* 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:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.archipelago;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipsetrader.core.feed.IBook;
import org.eclipsetrader.core.feed.IFeedIdentifier;
import org.eclipsetrader.core.feed.IFeedSubscription2;
import org.eclipsetrader.core.feed.ILastClose;
import org.eclipsetrader.core.feed.IQuote;
import org.eclipsetrader.core.feed.ISubscriptionListener;
import org.eclipsetrader.core.feed.ITodayOHL;
import org.eclipsetrader.core.feed.ITrade;
import org.eclipsetrader.core.feed.QuoteDelta;
import org.eclipsetrader.core.feed.QuoteEvent;
public class FeedSubscription implements IFeedSubscription2 {
private Level2Feed connector;
private String symbol;
private IFeedIdentifier identifier;
private ITrade trade;
private IQuote quote;
private ITodayOHL todayOHL;
private ILastClose lastClose;
private IBook book;
private ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
private List<QuoteDelta> deltaList = new ArrayList<QuoteDelta>();
private int instanceCount = 0;
private int level2InstanceCount = 0;
public FeedSubscription(Level2Feed connector, IFeedIdentifier identifier) {
this.connector = connector;
this.identifier = identifier;
this.symbol = identifier.getSymbol();
}
public FeedSubscription(Level2Feed connector, String symbol) {
this.connector = connector;
this.symbol = symbol;
}
public void setIdentifier(IFeedIdentifier identifier) {
this.identifier = identifier;
this.symbol = identifier.getSymbol();
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#dispose()
*/
@Override
public void dispose() {
connector.disposeSubscription(this);
}
protected int incrementInstanceCount() {
instanceCount++;
return instanceCount;
}
protected int decrementInstanceCount() {
instanceCount--;
return instanceCount;
}
protected int getInstanceCount() {
return instanceCount;
}
protected int incrementLevel2InstanceCount() {
level2InstanceCount++;
return level2InstanceCount;
}
protected int decrementLevel2InstanceCount() {
level2InstanceCount--;
return level2InstanceCount;
}
public int getLevel2InstanceCount() {
return level2InstanceCount;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#addSubscriptionListener(org.eclipsetrader.core.feed.ISubscriptionListener)
*/
@Override
public void addSubscriptionListener(ISubscriptionListener listener) {
listeners.add(listener);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#removeSubscriptionListener(org.eclipsetrader.core.feed.ISubscriptionListener)
*/
@Override
public void removeSubscriptionListener(ISubscriptionListener listener) {
listeners.remove(listener);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getIdentifier()
*/
@Override
public IFeedIdentifier getIdentifier() {
return identifier;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getSymbol()
*/
@Override
public String getSymbol() {
return symbol;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getQuote()
*/
@Override
public IQuote getQuote() {
return quote;
}
public void setQuote(IQuote quote) {
this.quote = quote;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getTodayOHL()
*/
@Override
public ITodayOHL getTodayOHL() {
return todayOHL;
}
public void setTodayOHL(ITodayOHL todayOHL) {
this.todayOHL = todayOHL;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getTrade()
*/
@Override
public ITrade getTrade() {
return trade;
}
public void setTrade(ITrade trade) {
this.trade = trade;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription#getLastClose()
*/
@Override
public ILastClose getLastClose() {
return lastClose;
}
public void setLastClose(ILastClose lastClose) {
this.lastClose = lastClose;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.feed.IFeedSubscription2#getBook()
*/
@Override
public IBook getBook() {
return book;
}
public void setBook(IBook book) {
this.book = book;
}
public void addDelta(QuoteDelta delta) {
synchronized (deltaList) {
deltaList.add(delta);
}
}
public boolean hasListeners() {
return listeners.size() != 0;
}
public void fireNotification() {
QuoteDelta[] deltas;
synchronized (deltaList) {
if (deltaList.isEmpty()) {
return;
}
deltas = deltaList.toArray(new QuoteDelta[deltaList.size()]);
deltaList.clear();
}
QuoteEvent event = new QuoteEvent(connector, getIdentifier(), deltas);
Object[] l = listeners.getListeners();
for (int i = 0; i < l.length; i++) {
try {
((ISubscriptionListener) l[i]).quoteUpdate(event);
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, ArchipelagoPlugin.PLUGIN_ID, 0, "Error notifying a quote update", e);
ArchipelagoPlugin.log(status);
} catch (LinkageError e) {
Status status = new Status(IStatus.ERROR, ArchipelagoPlugin.PLUGIN_ID, 0, "Error notifying a quote update", e);
ArchipelagoPlugin.log(status);
}
}
}
}