package org.marketcetera.event.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.annotation.concurrent.ThreadSafe;
import org.apache.commons.lang.SystemUtils;
import org.marketcetera.event.AskEvent;
import org.marketcetera.event.BidEvent;
import org.marketcetera.event.DepthOfBookEvent;
import org.marketcetera.event.QuoteEvent;
import org.marketcetera.event.beans.EventBean;
import org.marketcetera.event.beans.HasEventBean;
import org.marketcetera.event.util.EventServices;
import org.marketcetera.marketdata.DateUtils;
import org.marketcetera.marketdata.OrderBook;
import org.marketcetera.trade.Instrument;
import org.marketcetera.util.log.I18NBoundMessage1P;
import org.marketcetera.util.log.I18NBoundMessage2P;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Implements {@link DepthOfBookEvent}.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: DepthOfBookEventImpl.java 16854 2014-03-12 01:54:42Z colin $
* @since 2.0.0
*/
@ThreadSafe
@ClassVersion("$Id: DepthOfBookEventImpl.java 16854 2014-03-12 01:54:42Z colin $")
public class DepthOfBookEventImpl
implements DepthOfBookEvent, HasEventBean
{
/* (non-Javadoc)
* @see org.marketcetera.event.beans.HasEventBean#getEventBean()
*/
@Override
public EventBean getEventBean()
{
return event;
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#getMessageId()
*/
@Override
public long getMessageId()
{
return event.getMessageId();
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#getSource()
*/
@Override
public Object getSource()
{
return event.getSource();
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#getTimestamp()
*/
@Override
public Date getTimestamp()
{
return event.getTimestamp();
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#setSource(java.lang.Object)
*/
@Override
public void setSource(Object inSource)
{
event.setSource(inSource);
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#getProvider()
*/
@Override
public String getProvider()
{
return event.getProvider();
}
/* (non-Javadoc)
* @see org.marketcetera.event.Event#setProvider(java.lang.String)
*/
@Override
public void setProvider(String inProvider)
{
event.setProvider(inProvider);
}
/* (non-Javadoc)
* @see org.marketcetera.event.TimestampCarrier#getTimeMillis()
*/
@Override
public long getTimeMillis()
{
return event.getTimeMillis();
}
/* (non-Javadoc)
* @see org.marketcetera.event.DepthOfBookEvent#getAsks()
*/
@Override
public List<AskEvent> getAsks()
{
return Collections.unmodifiableList(asks);
}
/* (non-Javadoc)
* @see org.marketcetera.event.DepthOfBookEvent#getBids()
*/
@Override
public List<BidEvent> getBids()
{
return Collections.unmodifiableList(bids);
}
/* (non-Javadoc)
* @see org.marketcetera.event.AggregateEvent#decompose()
*/
@Override
public List<QuoteEvent> decompose()
{
List<QuoteEvent> events = new ArrayList<QuoteEvent>();
events.addAll(bids);
events.addAll(asks);
return Collections.unmodifiableList(events);
}
/* (non-Javadoc)
* @see org.marketcetera.event.HasInstrument#getInstrument()
*/
@Override
public Instrument getInstrument()
{
return instrument;
}
/* (non-Javadoc)
* @see org.marketcetera.event.HasInstrument#getInstrumentAsString()
*/
@Override
public String getInstrumentAsString()
{
return instrument.getSymbol();
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
StringBuilder output = new StringBuilder();
output.append("Depth of book for ").append(getInstrument()).append(" at ").append(DateUtils.dateToString(getTimestamp())).append(SystemUtils.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$
output.append(OrderBook.printBook(bids.iterator(),
asks.iterator(),
true));
return output.toString();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
return EventServices.eventHashCode(this);
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
return EventServices.eventEquals(this,
obj);
}
/**
* Create a new DepthOfBookEventImpl instance.
*
* @param inEvent an <code>EventBean</code> value
* @param inBids a <code>List<BidEvent></code> value
* @param inAsks a <code>List<AskEvent<</code> value
* @param inInstrument an <code>Instrument</code> value
* @throws IllegalArgumentException if <code>MessageId</code> < 0
* @throws IllegalArgumentException if <code>Timestamp</code> is <code>null</code>
* @throws IllegalArgumentException if any entry in the list is null
* @throws IllegalArgumentException if an entry in the list is for a different instrument than the one given
*/
DepthOfBookEventImpl(EventBean inEvent,
List<BidEvent> inBids,
List<AskEvent> inAsks,
Instrument inInstrument)
{
event = EventBean.copy(inEvent);
event.setDefaults();
event.validate();
if(inInstrument == null) {
EventServices.error(VALIDATION_NULL_INSTRUMENT);
}
instrument = inInstrument;
validateList(inBids,
inInstrument);
bids.addAll(inBids);
validateList(inAsks,
inInstrument);
asks.addAll(inAsks);
}
/**
* Validates the contents of the given list.
*
* @param inQuotes a <code>List<? extends QuoteEvent></code> value
* @param inInstrument an <code>Instrument</code> value
* @throws IllegalArgumentException if any entry in the list is null
* @throws IllegalArgumentException if an entry in the list is for a different instrument than the one given
*/
private static void validateList(List<? extends QuoteEvent> inQuotes,
Instrument inInstrument)
{
for(QuoteEvent quote : inQuotes) {
if(quote == null) {
EventServices.error(new I18NBoundMessage1P(VALIDATION_LIST_CONTAINS_NULL,
String.valueOf(inQuotes)));
}
if(!inInstrument.equals(quote.getInstrument())) {
EventServices.error(new I18NBoundMessage2P(VALIDATION_LIST_INCORRECT_INSTRUMENT,
quote,
inInstrument));
}
}
}
/**
* the instrument attribute
*/
private final Instrument instrument;
/**
* the event attributes
*/
private final EventBean event;
/**
* the bid side of the book
*/
private final List<BidEvent> bids = new ArrayList<BidEvent>();
/**
* the ask side of the book
*/
private final List<AskEvent> asks = new ArrayList<AskEvent>();
private static final long serialVersionUID = 1L;
}