com.opengamma.web.analytics.formatting.FudgeMsgFormatter.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.web.analytics.formatting.FudgeMsgFormatter.java

Source

/**
 * 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;
    }

}