/*
* 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.directa.internal.core;
import java.beans.PropertyChangeSupport;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.ListenerList;
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.OrderMonitorEvent;
public class OrderMonitor implements IOrderMonitor, IAdaptable {
private IOrder order;
private BrokerConnector brokerConnector;
private String id;
private Long filledQuantity;
private Double averagePrice;
private IOrderStatus status = IOrderStatus.New;
private String message;
private WebConnector connector;
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
private ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
public OrderMonitor(WebConnector connector, BrokerConnector brokerConnector, IOrder order) {
this.connector = connector;
this.brokerConnector = brokerConnector;
this.order = order;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getBrokerConnector()
*/
@Override
public IBroker getBrokerConnector() {
return brokerConnector;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getId()
*/
@Override
public String getId() {
return id;
}
public void setId(String assignedId) {
this.id = assignedId;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#getOrder()
*/
@Override
public IOrder getOrder() {
return order;
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#submit()
*/
@Override
public void submit() throws BrokerException {
if (!connector.isLoggedIn()) {
connector.login();
if (!connector.isLoggedIn()) {
throw new BrokerException(Messages.OrderMonitor_UnableToLogin);
}
}
if (connector.sendOrder(this)) {
brokerConnector.addWithNotification(this);
}
}
/* (non-Javadoc)
* @see org.eclipsetrader.core.trading.IOrderMonitor#cancel()
*/
@Override
public void cancel() throws BrokerException {
if (!connector.isLoggedIn()) {
connector.login();
if (!connector.isLoggedIn()) {
throw new BrokerException(Messages.OrderMonitor_UnableToLogin);
}
}
if (getId() == null) {
throw new BrokerException(Messages.OrderMonitor_InvalidOrder);
}
connector.cancelOrder(this);
}
/* (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(Messages.OrderMonitor_ModifyNotAllowed);
}
/* (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
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
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
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
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;
}
protected void fireOrderCompletedEvent() {
OrderMonitorEvent event = new OrderMonitorEvent(this, order);
Object[] l = listeners.getListeners();
for (int i = 0; i < l.length; i++) {
try {
((IOrderMonitorListener) l[i]).orderCompleted(event);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
public PropertyChangeSupport getPropertyChangeSupport() {
return propertyChangeSupport;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof OrderMonitor)) {
return false;
}
return id != null && id.equals(((OrderMonitor) obj).id);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "OrderMonitor: id=" + getId() + ", status=" + getStatus() + ", filledQuantity=" + getFilledQuantity() + ", averagePrice=" + getAveragePrice() + " [" + order.toString() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
}
}