package org.marketcetera.messagehistory; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang.builder.ToStringBuilder; import org.marketcetera.event.HasFIXMessage; import org.marketcetera.trade.OrderID; import org.marketcetera.trade.ReportBase; import org.marketcetera.util.misc.ClassVersion; import quickfix.Message; /* $License$ */ /** * Represents a Photon trading report. * * @author anshul@marketcetera.com * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: ReportHolder.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.0.0 */ @ClassVersion("$Id: ReportHolder.java 16154 2012-07-14 16:34:05Z colin $") public class ReportHolder implements Comparable<ReportHolder> { /** * Creates an instance. * * @param inReport the report instance. * @param inUnderlying the underlying symbol */ public ReportHolder(ReportBase inReport, String inUnderlying) { this(inReport, inUnderlying, null); } /** * Creates an instance. * * @param inReport the report instance. * @param inUnderlying the underlying symbol * @param inGroupID the orderID of the first order in this chain of orders. */ public ReportHolder(ReportBase inReport, String inUnderlying, OrderID inGroupID){ mReport = inReport; // A unique reference number must be used instead of mReport.getReportID() since some "fake" // reports are created by this package with null ids (e.g. average price list). mMessageReference = sCounter.incrementAndGet(); mGroupID = inGroupID; mUnderlying = inUnderlying; } /** * Returns the report instance. * * @return the report instance. */ public ReportBase getReport() { return mReport; } /** * The FIX message underlying the report, if the report has a FIX message, * null otherwise. * * @return the FIX message underlying the report. */ public Message getMessage() { if(mReport instanceof HasFIXMessage) { return ((HasFIXMessage)mReport).getMessage(); } return null; } @Override public int compareTo(ReportHolder mh) { return (int)(mMessageReference - mh.mMessageReference); } /** * The orderID of the first order in this chain of orders. * * @return the orderID of the first order in this chain of orders. */ public OrderID getGroupID() { return mGroupID; } /** * Returns the underlying symbol for the report instrument. * * @return the underlying symbol */ public String getUnderlying() { return mUnderlying; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (mMessageReference ^ (mMessageReference >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ReportHolder other = (ReportHolder) obj; return mMessageReference == other.mMessageReference; } @Override public String toString() { return new ToStringBuilder(this).append("report", mReport) //$NON-NLS-1$ .append("underlying", mUnderlying) //$NON-NLS-1$ .append("groupId", mGroupID) //$NON-NLS-1$ .append("messageReferenceNumber", mMessageReference) //$NON-NLS-1$ .toString(); } private final ReportBase mReport; private final long mMessageReference; private static AtomicLong sCounter = new AtomicLong(); private final OrderID mGroupID; private final String mUnderlying; }