/*
* Copyright 2007 Colin Crist
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package hermes.fix;
import java.io.StringWriter;
import java.util.Iterator;
import quickfix.DataDictionary;
import quickfix.Field;
import quickfix.FieldMap;
import quickfix.FieldNotFound;
import quickfix.FieldType;
import quickfix.Group;
import quickfix.field.SenderCompID;
import quickfix.field.TargetCompID;
/**
* @author colincrist@hermesjms.com
* @version $Id$
*/
public class CompactFIXPrettyPrinter implements FIXPrettyPrinter {
public String print(FIXMessage message) {
StringBuffer rval = new StringBuffer();
StringBuffer line = new StringBuffer();
line.append(message.getString(SenderCompID.FIELD)).append(" -> ").append(message.getString(TargetCompID.FIELD)).append(":");
try {
line = processFieldMap(rval, line, message.getDictionary(), message.getMsgType(), message.getMessage().getHeader());
line = processFieldMap(rval, line, message.getDictionary(), message.getMsgType(), message.getMessage());
line = processFieldMap(rval, line, message.getDictionary(), message.getMsgType(), message.getMessage().getTrailer());
return rval.toString();
} catch (Exception ex) {
return ex.getMessage();
}
}
private boolean isGroupCountField(DataDictionary dd, Field field) {
return dd.getFieldTypeEnum(field.getTag()) == FieldType.NumInGroup;
}
private StringBuffer processFieldMap(StringBuffer writer, StringBuffer lineWriter, DataDictionary dd, String msgType, FieldMap fieldMap) throws FieldNotFound {
Iterator fieldIterator = fieldMap.iterator();
while (fieldIterator.hasNext()) {
Field field = (Field) fieldIterator.next();
if (!isGroupCountField(dd, field)) {
String value = fieldMap.getString(field.getTag());
if (dd.hasFieldValue(field.getTag())) {
value = dd.getValueName(field.getTag(), fieldMap.getString(field.getTag())) + " (" + value + ")";
}
StringWriter tagtext = new StringWriter();
String fieldName = dd.getFieldName(field.getTag());
if (fieldName == null) {
fieldName = "Unknown" ;
}
int tag = field.getTag();
String fieldValue = value == null ? "" : value;
String fieldValueName = null;
try {
fieldValueName = dd.getValueName(field.getTag(), fieldMap.getString(field.getTag()));
} catch (Throwable ex) {
fieldValueName = "" ;
}
tagtext.append(fieldName).append("<").append(Integer.toString(tag)).append(">=").append(fieldValue);
if (fieldValueName != null) {
tagtext.append("<").append(fieldValueName).append(">");
}
if (lineWriter.length() != 0) {
lineWriter.append(" ");
} else {
lineWriter.append(" ");
}
lineWriter.append(tagtext.toString());
if (lineWriter.length() > 80) {
writer.append(lineWriter).append("\n");
lineWriter = new StringBuffer();
}
}
}
Iterator groupsKeys = fieldMap.groupKeyIterator();
while (groupsKeys.hasNext()) {
int groupCountTag = ((Integer) groupsKeys.next()).intValue();
int groupCount = fieldMap.getGroupCount(groupCountTag);
if (lineWriter.length() != 0) {
lineWriter.append(" ");
} else {
lineWriter.append(" ");
}
lineWriter.append(dd.getFieldName(groupCountTag)).append("<").append(Integer.toString(groupCountTag)).append(">=").append(Integer.toString(groupCount));
// System.out.println(prefix + dd.getFieldName(groupCountTag) +
// ": count = " + fieldMap.getInt(groupCountTag));
Group g = new Group(groupCountTag, 0);
int i = 1;
while (fieldMap.hasGroup(i, groupCountTag)) {
fieldMap.getGroup(i, g);
lineWriter = processFieldMap(writer, lineWriter, dd, msgType, g);
i++;
}
}
return lineWriter;
}
}