/*
* 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.internal.brokers.paper;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipsetrader.core.trading.BrokerException;
import org.eclipsetrader.core.trading.IBroker;
import org.eclipsetrader.core.trading.IOrder;
import org.eclipsetrader.core.trading.IOrderMonitor;
import org.eclipsetrader.core.trading.IOrderMonitorListener;
import org.eclipsetrader.core.trading.IOrderStatus;
import org.eclipsetrader.core.trading.ITransaction;
import org.eclipsetrader.core.trading.OrderMonitorEvent;
import org.eclipsetrader.internal.brokers.paper.transactions.OrderElement;
import org.eclipsetrader.internal.brokers.paper.types.DoubleValueAdapter;
import org.eclipsetrader.internal.brokers.paper.types.OrderStatusAdapter;
@XmlRootElement(name = "monitor")
public class OrderMonitor implements IOrderMonitor, IAdaptable {
@XmlAttribute(name = "id")
private String id;
@XmlElement(name = "order")
private OrderElement order;
@XmlAttribute(name = "filled-qty")
private Long filledQuantity;
@XmlAttribute(name = "avg-price")
@XmlJavaTypeAdapter(DoubleValueAdapter.class)
private Double averagePrice;
@XmlAttribute(name = "status")
@XmlJavaTypeAdapter(OrderStatusAdapter.class)
private IOrderStatus status = IOrderStatus.New;
@XmlAttribute(name = "message")
private String message;
private PaperBroker broker;
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
private List<ITransaction> transactions = new ArrayList<ITransaction>();
protected OrderMonitor() {
try {
broker = (PaperBroker) new PaperBrokerFactory().create();
} catch (CoreException e) {
Status status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, 0, "Error initializing monitor", e); //$NON-NLS-1$
Activator.log(status);
}
}
public OrderMonitor(PaperBroker broker, IOrder order) {
this.broker = broker;
this.order = new OrderElement(order);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getBrokerConnector()
*/
@Override
@XmlTransient
public IBroker getBrokerConnector() {
return broker;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getId()
*/
@Override
@XmlTransient
public String getId() {
return id;
}
public void setId(String assignedId) {
this.id = assignedId;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getOrder()
*/
@Override
@XmlTransient
public IOrder getOrder() {
return order.getOrder();
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#submit()
*/
@Override
public void submit() throws BrokerException {
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#cancel()
*/
@Override
public void cancel() throws BrokerException {
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#allowModify()
*/
@Override
public boolean allowModify() {
return false;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#modify(org.eclipsetrader.core.trading.IOrder)
*/
@Override
public void modify(IOrder order) throws BrokerException {
throw new BrokerException("Modify not allowed");
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#addOrderMonitorListener(org.eclipsetrader.core.trading.IOrderMonitorListener)
*/
@Override
public void addOrderMonitorListener(IOrderMonitorListener listener) {
listeners.add(listener);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#removeOrderMonitorListener(org.eclipsetrader.core.trading.IOrderMonitorListener)
*/
@Override
public void removeOrderMonitorListener(IOrderMonitorListener listener) {
listeners.remove(listener);
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getStatus()
*/
@Override
@XmlTransient
public IOrderStatus getStatus() {
return status;
}
public void setStatus(IOrderStatus status) {
IOrderStatus oldValue = this.status;
if (this.status != status) {
this.status = status;
propertyChangeSupport.firePropertyChange(PROP_STATUS, oldValue, this.status);
}
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getFilledQuantity()
*/
@Override
@XmlTransient
public Long getFilledQuantity() {
return filledQuantity;
}
public void setFilledQuantity(Long filledQuantity) {
Long oldValue = this.filledQuantity;
if (filledQuantity != null && !filledQuantity.equals(this.filledQuantity)) {
this.filledQuantity = filledQuantity;
propertyChangeSupport.firePropertyChange(PROP_FILLED_QUANTITY, oldValue, this.filledQuantity);
}
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getAveragePrice()
*/
@Override
@XmlTransient
public Double getAveragePrice() {
return averagePrice;
}
public void setAveragePrice(Double averagePrice) {
Double oldValue = this.averagePrice;
if (averagePrice != null && !averagePrice.equals(this.averagePrice)) {
this.averagePrice = averagePrice;
propertyChangeSupport.firePropertyChange(PROP_AVERAGE_PRICE, oldValue, this.averagePrice);
}
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getMessage()
*/
@Override
@XmlTransient
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@Override
@SuppressWarnings("unchecked")
public Object getAdapter(Class adapter) {
if (adapter.isAssignableFrom(propertyChangeSupport.getClass())) {
return propertyChangeSupport;
}
if (adapter.isAssignableFrom(getClass())) {
return this;
}
return null;
}
public void fireOrderCompletedEvent() {
OrderMonitorEvent event = new OrderMonitorEvent(this, order.getOrder());
Object[] l = listeners.getListeners();
for (int i = 0; i < l.length; i++) {
try {
((IOrderMonitorListener) l[i]).orderCompleted(event);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
@XmlTransient
public PropertyChangeSupport getPropertyChangeSupport() {
return propertyChangeSupport;
}
public void addTransaction(ITransaction transaction) {
transactions.add(transaction);
}
@XmlTransient
public ITransaction[] getTransactions() {
return transactions.toArray(new ITransaction[transactions.size()]);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "OrderMonitor: id=" + getId() + ", status=" + getStatus() + ", filledQuantity=" + getFilledQuantity() + ", averagePrice=" + getAveragePrice() + " [" + order.toString() + "]";
}
}