/** * Copyright (C) 2012 - 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.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.threeten.bp.temporal.ChronoUnit; import com.opengamma.analytics.math.curve.NodalObjectsCurve; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.util.ParallelArrayBinarySort; import com.opengamma.util.time.Tenor; /** * Formats {@link NodalObjectsCurve}s with {@link Tenor} x values and {@link Double} y values. */ @SuppressWarnings("rawtypes") /* package */ class NodalObjectsCurveFormatter extends AbstractFormatter<NodalObjectsCurve> { private static final Logger s_logger = LoggerFactory.getLogger(NodalObjectsCurveFormatter.class); NodalObjectsCurveFormatter() { super(NodalObjectsCurve.class); addFormatter(new Formatter<NodalObjectsCurve>(Format.EXPANDED) { @Override Object format(NodalObjectsCurve value, ValueSpecification valueSpec, Object inlineKey) { return formatExpanded(value); } }); } @Override public List<Double[]> formatCell(NodalObjectsCurve value, ValueSpecification valueSpec, Object inlineKey) { if (value.size() != 0 && (value.getXData()[0] instanceof Tenor) && (value.getYData()[0] instanceof Double)) { final Tenor[] tenors = (Tenor[]) value.getXData(); final Object[] ys = value.getYData(); ParallelArrayBinarySort.parallelBinarySort(tenors, ys); List<Double[]> data = new ArrayList<>(); for (int i = 0; i < tenors.length; i++) { double x = tenors[i].getPeriod().get(ChronoUnit.YEARS); data.add(new Double[] {x, (Double) ys[i]}); } return data; } else { s_logger.info("Unable to format curve {}", value); return null; } } private List<Double[]> formatExpanded(NodalObjectsCurve value) { if (value.size() != 0 && (value.getXData()[0] instanceof Tenor) && (value.getYData()[0] instanceof Double)) { final Tenor[] tenors = (Tenor[]) value.getXData(); final Object[] ys = value.getYData(); ParallelArrayBinarySort.parallelBinarySort(tenors, ys); int dataLength = tenors.length; Double[] xs = new Double[dataLength]; for (int i = 0; i < dataLength; i++) { xs[i] = (double) tenors[i].getPeriod().get(ChronoUnit.YEARS); } List<Double[]> detailedData = new ArrayList<>(); for (int i = 0; i < ys.length; i++) { detailedData.add(new Double[]{xs[i], (Double) ys[i]}); } return detailedData; } else { s_logger.info("Unable to format curve {}", value); return null; } } @Override public DataType getDataType() { return DataType.CURVE; } }