/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.conversion; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * */ public class ResultConverterCache { private final Map<Class<?>, ResultConverter<?>> _converterMap = new ConcurrentHashMap<Class<?>, ResultConverter<?>>(); public ResultConverterCache() { // Add standard converters here registerConverter(new BigDecimalConverter()); registerConverter(new DoubleConverter()); registerConverter(new DoubleMatrix1DConverter()); registerConverter(new DoubleMatrix2DConverter()); registerConverter(new TimeSeriesConverter()); registerConverter(new YieldAndDiscountCurveConverter()); registerConverter(new LabelledMatrix1DConverter()); registerConverter(new LabelledMatrix2DConverter()); registerConverter(new CurrencyAmountConverter()); registerConverter(new MultipleCurrencyAmountConverter()); registerConverter(new MultipleCurrencyInterestRateCurveSensitivityConverter()); registerConverter(new VolatilitySurfaceDataConverter()); } public <T> void registerConverter(ResultConverter<?> converter) { _converterMap.put(converter.getConvertedClass(), converter); } /** * Gets, the converter to be used for a given result, in order to transform the result into a * a String/Double map suitable for writing into a database. * * @param <T> the type of the value to be converted * @param value the result to be converted, assumed to be representative of all results for the requirement name * @return the converter to be used * @throws IllegalArgumentException If no converter was found */ @SuppressWarnings("unchecked") public <T> ResultConverter<? super T> getConverter(T value) { ResultConverter<?> converter = findConverterForType(value.getClass()); if (converter == null) { throw new IllegalArgumentException("No converter found for " + value.getClass()); } return (ResultConverter<? super T>) converter; } private ResultConverter<?> findConverterForType(Class<?> type) { ResultConverter<?> converter = _converterMap.get(type); if (converter != null) { return converter; } if (type.getSuperclass() != null) { converter = findConverterForType(type.getSuperclass()); if (converter != null) { return converter; } } for (Class<?> intface : type.getInterfaces()) { converter = findConverterForType(intface); if (converter != null) { return converter; } } return null; } }