/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.view; import java.io.Serializable; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import java.util.Set; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.timeseries.TimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateObjectTimeSeries; /** * Result object holding the time series bundles produced by {@link ViewEvaluationFunction} containing the input market data used. */ @SuppressWarnings("rawtypes") public final class HistoricalViewEvaluationMarketData implements Serializable { private static final long serialVersionUID = 1L; private final Map<ValueSpecification, TimeSeries> _data = new HashMap<ValueSpecification, TimeSeries>(); public void addTimeSeries(final ValueSpecification specification, final TimeSeries timeSeries) { _data.put(specification, timeSeries); } public Set<ValueSpecification> getValueSpecifications() { return _data.keySet(); } public TimeSeries getTimeSeries(final ValueSpecification specification) { return _data.get(specification); } public LocalDateDoubleTimeSeries getDoubleTimeSeries(final ValueSpecification specification) { final TimeSeries ts = getTimeSeries(specification); if (ts instanceof LocalDateDoubleTimeSeries) { return (LocalDateDoubleTimeSeries) ts; } else { return null; } } public LocalDateObjectTimeSeries getObjectTimeSeries(final ValueSpecification specification) { final TimeSeries ts = getTimeSeries(specification); if (ts instanceof LocalDateObjectTimeSeries) { return (LocalDateObjectTimeSeries) ts; } else { return null; } } @Override public String toString() { int count = 0; int points = 0; for (final TimeSeries ts : _data.values()) { points += ts.size(); count++; } return "ViewEvaluationMarketData[" + points + " TS points for " + count + " specifications]"; } public FudgeMsg toFudgeMsg(final FudgeSerializer serializer) { final MutableFudgeMsg msg = serializer.newMessage(); for (final Map.Entry<ValueSpecification, TimeSeries> data : _data.entrySet()) { serializer.addToMessage(msg, null, 1, data.getKey()); serializer.addToMessage(msg, null, 2, data.getValue()); // time-series Fudge builders add their own class details } return msg; } public static HistoricalViewEvaluationMarketData fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg msg) { final HistoricalViewEvaluationMarketData result = new HistoricalViewEvaluationMarketData(); final Queue<Object> queue = new LinkedList<Object>(); boolean requirements = false; for (final FudgeField field : msg) { final Integer ord = field.getOrdinal(); if (ord != null) { if (ord.intValue() == 1) { final ValueSpecification specification = deserializer.fieldValueToObject(ValueSpecification.class, field); if (requirements) { queue.add(specification); } else if (queue.isEmpty()) { queue.add(specification); requirements = true; } else { result.addTimeSeries(specification, (TimeSeries) queue.remove()); } } else if (ord.intValue() == 2) { final TimeSeries timeSeries = deserializer.fieldValueToObject(TimeSeries.class, field); if (!requirements) { queue.add(timeSeries); } else if (queue.isEmpty()) { queue.add(timeSeries); requirements = false; } else { result.addTimeSeries((ValueSpecification) queue.remove(), timeSeries); } } } } return result; } }