package org.marketcetera.photon.views.fixmessagedetail.dialogs.executionreport.data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.marketcetera.event.HasFIXMessage;
import org.marketcetera.photon.Messages;
import org.marketcetera.quickfix.FIXVersion;
import org.marketcetera.trade.ExecutionReport;
import org.marketcetera.trade.ExecutionType;
import org.marketcetera.trade.OrderStatus;
import quickfix.Field;
import quickfix.Message;
/**
* Class representing table contents of the Execution Report
*
* @author milan
*
*/
public class ExecutionReportContainer
{
/** Execution report fields */
private List<ExecutionReportField> fExecutionReportFields;
public ExecutionReportContainer()
{
}
public void addExecutionReportField(ExecutionReportField field)
{
if(fExecutionReportFields == null)
fExecutionReportFields = new ArrayList<ExecutionReportField>();
if(fExecutionReportFields.contains(field))
{
int index = fExecutionReportFields.indexOf(field);
ExecutionReportField existingField = fExecutionReportFields.get(index);
existingField.setSelectedValue(field.getSelectedValue());
}
else
{
fExecutionReportFields.add(field);
}
}
public void removeExecutionReportFields(ExecutionReportField[] fields)
{
if(fExecutionReportFields == null)
return;
for(ExecutionReportField field: fields)
{
if(fExecutionReportFields.contains(field))
fExecutionReportFields.remove(field);
}
}
public ExecutionReportField[] getExecutionReportFields()
{
if(fExecutionReportFields == null)
return new ExecutionReportField[] {};
return (ExecutionReportField[]) fExecutionReportFields.toArray(new ExecutionReportField[fExecutionReportFields.size()]);
}
public Message createExecutionReport()
{
Message message = FIXVersion.FIX_SYSTEM
.getMessageFactory()
.newExecutionReportEmpty();
if(fExecutionReportFields != null)
{
for(ExecutionReportField reportField: fExecutionReportFields)
{
if(reportField.isFixField())
reportField.insertField(message);
}
}
return message;
}
public ExecutionReportNoneFixField[] getNoneFixFields()
{
ArrayList<ExecutionReportNoneFixField> nonFixFields = new ArrayList<ExecutionReportNoneFixField>();
if(fExecutionReportFields != null)
{
for(ExecutionReportField reportField: fExecutionReportFields)
{
if(!reportField.isFixField())
nonFixFields.add((ExecutionReportNoneFixField)reportField);
}
}
return nonFixFields.toArray(new ExecutionReportNoneFixField[nonFixFields.size()]);
}
public void fillBreakTradeFromExecutionReport(ExecutionReport executionReport)
{
Map<Integer, ExecutionReportField> executionReportFields = new HashMap<Integer, ExecutionReportField>();
ExecutionReportFixFields fixFields = new ExecutionReportFixFields();
ExecutionReportField[] presetReportFields = fixFields.getExecutionReportFields();
for(ExecutionReportField field: presetReportFields)
{
if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_CUM_QTY.getText()))
{
field.setSelectedValue(BigDecimal.ZERO.toPlainString());
}
else if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_LAST_QTY.getText()))
{
field.setSelectedValue(BigDecimal.ZERO.toPlainString());
}
else if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_LEAVES_QTY.getText()))
{
BigDecimal orderQty = executionReport.getOrderQuantity();
if(orderQty != null)
{
field.setSelectedValue(orderQty.toPlainString());
}
else
{
field.parseFromReport(executionReport);
}
}
else if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_EXECUTION_TYPE.getText()))
{
field.setSelectedValue(ExecutionType.Restated.name());
}
else if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_ORDER_STATUS.getText()))
{
field.setSelectedValue(OrderStatus.Expired.name());
}
else if(field.getFieldName().equals(Messages.EXECUTION_REPORT_FIELD_SENDING_TIME.getText()))
{
Date sendingTime = executionReport.getSendingTime();
if(sendingTime != null)
{
Calendar cal = Calendar.getInstance();
cal.setTime(sendingTime);
cal.add(Calendar.SECOND, 1);
field.setSelectedDateValue(cal.getTime());
}
else
{
field.parseFromReport(executionReport);
}
}
else
{
field.parseFromReport(executionReport);
}
executionReportFields.put(new Integer(field.getFieldTag()), field);
}
Message message = getMessageFromExecutionReport(executionReport);
Iterator<Field<?>> fieldIterator = message.iterator();
while (fieldIterator.hasNext())
{
Field<?> field = (Field<?>) fieldIterator.next();
Integer fieldTag = new Integer(field.getTag());
if(!executionReportFields.containsKey(fieldTag))
{
ExecutionReportField reportField = new CustomFixField(field.getTag());
reportField.setSelectedValue(field.getObject().toString());
executionReportFields.put(fieldTag, reportField);
}
}
for(Integer fieldTag: executionReportFields.keySet())
{
addExecutionReportField(executionReportFields.get(fieldTag));
}
}
public void fillFromExecutionReport(ExecutionReport executionReport)
{
Map<Integer, ExecutionReportField> executionReportFields = new HashMap<Integer, ExecutionReportField>();
ExecutionReportFixFields fixFields = new ExecutionReportFixFields();
ExecutionReportField[] presetReportFields = fixFields.getExecutionReportFields();
for(ExecutionReportField field: presetReportFields)
{
field.parseFromReport(executionReport);
executionReportFields.put(new Integer(field.getFieldTag()), field);
}
Message message = getMessageFromExecutionReport(executionReport);
Iterator<Field<?>> fieldIterator = message.iterator();
while (fieldIterator.hasNext())
{
Field<?> field = (Field<?>) fieldIterator.next();
Integer fieldTag = new Integer(field.getTag());
if(!executionReportFields.containsKey(fieldTag))
{
ExecutionReportField reportField = new CustomFixField(field.getTag());
reportField.setSelectedValue(field.getObject().toString());
executionReportFields.put(fieldTag, reportField);
}
}
for(Integer fieldTag: executionReportFields.keySet())
{
addExecutionReportField(executionReportFields.get(fieldTag));
}
}
private Message getMessageFromExecutionReport(ExecutionReport executionReport)
{
HasFIXMessage hasFixMessage = (HasFIXMessage) executionReport;
return hasFixMessage.getMessage();
}
}