package org.marketcetera.core.position.impl;
import java.util.Comparator;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.marketcetera.core.position.PositionKey;
import org.marketcetera.trade.Instrument;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Comparator for PositionKeys that imposes a default ordering of the data.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: PositionKeyComparator.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: PositionKeyComparator.java 16154 2012-07-14 16:34:05Z colin $")
final class PositionKeyComparator implements Comparator<PositionKey<?>> {
public final static PositionKeyComparator INSTANCE = new PositionKeyComparator();
@Override
public int compare(PositionKey<?> o1, PositionKey<?> o2) {
/*
* The order here affects the default order of positions returned by the
* engine.
*/
return new CompareToBuilder()
.append(o1.getTraderId(), o2.getTraderId()).append(
o1.getInstrument(), o2.getInstrument(),
InstrumentComparator.INSTANCE).append(o1.getAccount(),
o2.getAccount()).toComparison();
}
/**
* Comparator for Instruments that imposes a default ordering across all
* instruments.
*/
@ClassVersion("$Id: PositionKeyComparator.java 16154 2012-07-14 16:34:05Z colin $")
private final static class InstrumentComparator implements
Comparator<Instrument> {
public final static InstrumentComparator INSTANCE = new InstrumentComparator();
@Override
public int compare(Instrument o1, Instrument o2) {
if(o1.getClass().equals(o2.getClass())) {
int value = getComparator(o1).compare(o1, o2);
return value;
} else {
return getComparator(o1).getRank() - getComparator(o2).getRank();
}
}
@SuppressWarnings("unchecked")
private static <I extends Instrument> InstrumentPositionKeyComparator<I> getComparator(I o1) {
return InstrumentPositionKeyComparator.SELECTOR.forInstrument(o1);
}
}
}