package org.marketcetera.quickfix.messagefactory;
import org.marketcetera.core.ClassVersion;
import quickfix.FieldNotFound;
import quickfix.Message;
import quickfix.field.ExecTransType;
import quickfix.field.MsgType;
import quickfix.field.OrdType;
import quickfix.field.TimeInForce;
import java.util.Arrays;
/**
* @author toli
* @version $Id: FIXMessageAugmentor_43.java 16154 2012-07-14 16:34:05Z colin $
*/
@ClassVersion("$Id: FIXMessageAugmentor_43.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$
public class FIXMessageAugmentor_43 extends FIXMessageAugmentor_42 {
private static String[] TT_APPLICABLE_MESSAGE_CODES = new String[] {
MsgType.NEW_ORDER_MULTILEG,
MsgType.MULTILEG_ORDER_CANCEL_REPLACE,
MsgType.TRADE_CAPTURE_REPORT_REQUEST,
MsgType.TRADE_CAPTURE_REPORT,
MsgType.QUOTE_REQUEST_REJECT,
MsgType.QUOTE_STATUS_REPORT,
MsgType.MASS_QUOTE_ACKNOWLEDGEMENT,
MsgType.ORDER_MASS_CANCEL_REQUEST,
MsgType.ORDER_MASS_CANCEL_REPORT,
MsgType.NEW_ORDER_CROSS,
MsgType.CROSS_ORDER_CANCEL_REPLACE_REQUEST,
MsgType.CROSS_ORDER_CANCEL_REQUEST
};
public FIXMessageAugmentor_43() {
applicableMsgTypes.addAll(Arrays.asList(TT_APPLICABLE_MESSAGE_CODES));
}
public Message newOrderSingleAugment(Message inMessage) {
inMessage = super.newOrderSingleAugment(inMessage);
return handleOnCloseBehaviour(inMessage);
}
public Message cancelReplaceRequestAugment(Message inMessage) {
inMessage = super.newOrderSingleAugment(inMessage);
return handleOnCloseBehaviour(inMessage);
}
/** As of FIX43, we no longer use {@link quickfix.field.ExecTransType} so override this method to not do anything */
public Message executionReportAugment(Message inMessage) throws FieldNotFound {
super.executionReportAugment(inMessage);
// remove the ExecTransType field
inMessage.removeField(ExecTransType.FIELD);
return inMessage;
}
/** Undo the changes made in FIX_40 augmentor
* Starting with FIX.4.3, the {@link OrdType#MARKET_ON_CLOSE} is deprecated
* so we want to use {@link TimeInForce#AT_THE_CLOSE} instead
* @param inMessage
* @return
*/
private Message handleOnCloseBehaviour(Message inMessage) {
try {
if((OrdType.MARKET_ON_CLOSE == inMessage.getChar(OrdType.FIELD)) &&
(TimeInForce.DAY == inMessage.getChar(TimeInForce.FIELD))) {
inMessage.setField(new OrdType(OrdType.MARKET));
inMessage.setField(new TimeInForce(TimeInForce.AT_THE_CLOSE));
} else if((OrdType.LIMIT_ON_CLOSE == inMessage.getChar(OrdType.FIELD)) &&
(TimeInForce.DAY == inMessage.getChar(TimeInForce.FIELD))) {
inMessage.setField(new OrdType(OrdType.LIMIT));
inMessage.setField(new TimeInForce(TimeInForce.AT_THE_CLOSE));
}
} catch (FieldNotFound fieldNotFound) {
return inMessage;
}
return inMessage;
}
}