/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.analytics.formatting; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.opengamma.engine.value.ValueSpecification; /** * Formatter for {@link FudgeMsg}. */ /*package*/ class FudgeMsgFormatter extends AbstractFormatter<FudgeMsg> { private static final Comparator<FudgeField> s_nameComparator; static { s_nameComparator = new Comparator<FudgeField>() { @Override public int compare(FudgeField msg1, FudgeField msg2) { return msg1.getName().compareTo(msg2.getName()); } }; } /*package*/ FudgeMsgFormatter() { super(FudgeMsg.class); addFormatter(new Formatter<FudgeMsg>(Format.EXPANDED) { @Override Map<String, Object> format(FudgeMsg msg, ValueSpecification valueSpec, Object inlineKey) { int fieldCount = msg.getNumFields(); List<List<String>> matrix = Lists.newArrayListWithCapacity(fieldCount); List<String> yLabels = Lists.newArrayListWithCapacity(fieldCount); // Sorting fields to ensure a consistent order for display purposes. // This could change the meaning of the Fudge message so assumes no repeated fields. List<FudgeField> orderedFields = new ArrayList<FudgeField>(msg.getAllFields()); Collections.sort(orderedFields, s_nameComparator); for (FudgeField field : orderedFields) { List<String> row = Lists.newArrayListWithCapacity(2); row.add(field.getType().getJavaType().getSimpleName()); String displayValue; if (field.getValue() == null) { displayValue = ""; } else if (field.getValue() instanceof FudgeMsg) { displayValue = "Sub-message"; } else { displayValue = field.getValue().toString(); } row.add(displayValue); matrix.add(row); yLabels.add(field.getName()); } Map<String, Object> output = Maps.newHashMap(); output.put(LabelledMatrix2DFormatter.MATRIX, matrix); output.put(LabelledMatrix2DFormatter.X_LABELS, Lists.newArrayList("Name", "Type", "Value")); output.put(LabelledMatrix2DFormatter.Y_LABELS, yLabels); return output; } }); } @Override public Object formatCell(FudgeMsg value, ValueSpecification valueSpec, Object inlineKey) { return "Fudge Message (" + value.getAllFields().size() + " fields)"; } @Override public DataType getDataType() { return DataType.LABELLED_MATRIX_2D; } }