package org.marketcetera.core.position.impl; import javax.annotation.Nullable; import javax.xml.bind.annotation.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.marketcetera.core.position.PositionKey; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * Implementation of {@link PositionKey}. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: PositionKeyImpl.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.5.0 */ @ClassVersion("$Id: PositionKeyImpl.java 16154 2012-07-14 16:34:05Z colin $") @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class PositionKeyImpl<T extends Instrument> implements PositionKey<T> { @XmlElementRef private final T mInstrument; private final String mAccount; private final String mTraderId; /** * Constructor. Note that account and traderId are converted to null if they * only contain whitespace. * * @param instrument * instrument, cannot be null * @param account * account * @param traderId * trader id * @throws IllegalArgumentException * if instrument is null */ public PositionKeyImpl(T instrument, @Nullable String account, @Nullable String traderId) { Validate.notNull(instrument); mInstrument = instrument; mAccount = StringUtils.trimToNull(account); mTraderId = StringUtils.trimToNull(traderId); } /** * Parameterless constructor for use only by JAXB. */ protected PositionKeyImpl() { mInstrument = null; mAccount = null; mTraderId = null; } @Override public T getInstrument() { return mInstrument; } @Override public String getAccount() { return mAccount; } @Override public String getTraderId() { return mTraderId; } @Override public int hashCode() { return new HashCodeBuilder().append(mInstrument).append(mAccount) .append(mTraderId).toHashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PositionKeyImpl<?> other = (PositionKeyImpl<?>) obj; return new EqualsBuilder().append(mInstrument, other.mInstrument) .append(mAccount, other.mAccount).append(mTraderId, other.mTraderId).isEquals(); } @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .appendToString(mInstrument.toString()) //$NON-NLS-1$ .append("account", mAccount) //$NON-NLS-1$ .append("traderId", mTraderId) //$NON-NLS-1$ .toString(); } }