package org.marketcetera.util.quickfix; import java.io.PrintStream; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.ObjectUtils; import org.marketcetera.util.misc.ClassVersion; import quickfix.DataDictionary; import quickfix.Field; import quickfix.FieldMap; import quickfix.FieldNotFound; import quickfix.FieldType; import quickfix.Group; /** * Analyzes a QuickFIX/J field, producing a human-readable * representation of its contents. * * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: AnalyzedField.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ @ClassVersion("$Id: AnalyzedField.java 16154 2012-07-14 16:34:05Z colin $") public class AnalyzedField { // INSTANCE DATA. private final Field<?> mQField; private final FieldType mQType; private final String mName; private final boolean mRequired; private final String mValue; private final List<AnalyzedGroup> mGroups= new LinkedList<AnalyzedGroup>(); // CONSTRUCTOR. /** * Creates a new analyzed field for the given QuickFIX/J field. * The field is part of the given QuickFIX/J field map, and the * map is part of (or same as) the message with the given * type. One data dictionary is used to translate field tags and * enumerated values (the <i>name</i> dictionary); another (the * <i>scope</i> dictionary) is used for scope-dependent lookups * such as required flags and subgroup analysis. * * @param nameQDict The name dictionary. * @param scopeQDict The scope dictionary. * @param qMap The field map. * @param msgType The message type. * @param qField The field. */ AnalyzedField (DataDictionary nameQDict, DataDictionary scopeQDict, FieldMap qMap, String msgType, Field<?> qField) { mQField=qField; mQType=nameQDict.getFieldTypeEnum(getQFieldTag()); mName=nameQDict.getFieldName(getQFieldTag()); mRequired=scopeQDict.isRequiredField(msgType,getQFieldTag()); // Value: enumerated (valid or invalid) or arbitrary. String value=getQFieldValueAsString(); if (nameQDict.hasFieldValue(getQFieldTag())) { if (nameQDict.isFieldValue(getQFieldTag(),value)) { mValue=Messages.ENUM_FIELD_VALUE.getText (value,nameQDict.getValueName(getQFieldTag(),value)); } else { mValue=Messages.INVALID_FIELD_VALUE.getText(value); } } else { mValue=value; } // Groups. DataDictionary.GroupInfo info=scopeQDict.getGroup (msgType,getQFieldTag()); if (info==null) { return; } int count=Integer.valueOf(value); for (int i=0;i<count;i++) { Group group=new Group(getQFieldTag(),info.getDelimeterField()); try { qMap.getGroup(i+1,group); } catch (FieldNotFound ex) { Messages.MISSING_GROUP.error(this,ex,i+1,qMap); continue; } mGroups.add(new AnalyzedGroup (nameQDict,info.getDataDictionary(),group,msgType)); } } // INSTANCE METHODS. /** * Returns the receiver's QuickFIX/J field. * * @return The field. */ public Field<?> getQField() { return mQField; } /** * Returns the receiver's QuickFIX/J field type. * * @return The type. */ public FieldType getQType() { return mQType; } /** * Returns the receiver's name. * * @return The name. */ public String getName() { return mName; } /** * Returns true if the receiver is a required field. * * @return True if so. */ public boolean getRequired() { return mRequired; } /** * Returns the receiver's (analyzed) value. * * @return The value. */ public String getValue() { return mValue; } /** * Returns the receiver's groups. * * @return The groups. */ public List<AnalyzedGroup> getGroups() { return mGroups; } /** * Returns the receiver's QuickFIX/J field tag. * * @return The tag. */ public int getQFieldTag() { return getQField().getTag(); } /** * Returns the receiver's QuickFIX/J field value. * * @return The value. It may be null. */ public Object getQFieldValue() { return getQField().getObject(); } /** * Returns the receiver's QuickFIX/J field value in string form. * * @return The value. It may be null. */ public String getQFieldValueAsString() { return ObjectUtils.toString(getQFieldValue(),null); } /** * Prints the receiver onto the given stream. Each line printed is * preceded by the given prefix. * * @param stream The stream. * @param prefix The prefix. */ public void print (PrintStream stream, String prefix) { stream.print(prefix); stream.print(Messages.SINGLE_FIELD.getText (getName(),getQFieldTag(),getValue(), (getRequired()?1:0))); prefix+=' '; //$NON-NLS-1$ String groupPrefix=prefix+' '; //$NON-NLS-1$ int i=0; for (AnalyzedGroup group:getGroups()) { stream.println(); stream.print(prefix); stream.print(Messages.GROUP_TITLE.getText(++i)); group.print(stream,groupPrefix); } } }