/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.report.framework.format; import java.time.LocalDate; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.google.common.collect.ImmutableMap; import com.opengamma.strata.basics.StandardId; import com.opengamma.strata.basics.currency.Currency; import com.opengamma.strata.basics.currency.CurrencyAmount; import com.opengamma.strata.basics.date.AdjustableDate; import com.opengamma.strata.market.param.CurrencyParameterSensitivity; /** * Provides and caches format settings across types. */ public class FormatSettingsProvider { // TODO extensibility - perhaps drive from properties file /** * The default instance. */ public static final FormatSettingsProvider INSTANCE = new FormatSettingsProvider(); /** * The map of settings by type. */ private static final Map<Class<?>, FormatSettings<?>> TYPE_SETTINGS = ImmutableMap .<Class<?>, FormatSettings<?>>builder() .put(String.class, FormatSettings.of(FormatCategory.TEXT, ValueFormatters.TO_STRING)) .put(Currency.class, FormatSettings.of(FormatCategory.TEXT, ValueFormatters.TO_STRING)) .put(StandardId.class, FormatSettings.of(FormatCategory.TEXT, ValueFormatters.TO_STRING)) .put(LocalDate.class, FormatSettings.of(FormatCategory.DATE, ValueFormatters.TO_STRING)) .put(AdjustableDate.class, FormatSettings.of(FormatCategory.DATE, ValueFormatters.ADJUSTABLE_DATE)) .put(CurrencyAmount.class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.CURRENCY_AMOUNT)) .put(CurrencyParameterSensitivity.class, FormatSettings.of(FormatCategory.TEXT, ValueFormatters.CURRENCY_PARAMETER_SENSITIVITY)) .put(Double.class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.DOUBLE)) .put(Short.class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.TO_STRING)) .put(Integer.class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.TO_STRING)) .put(Long.class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.TO_STRING)) .put(double[].class, FormatSettings.of(FormatCategory.NUMERIC, ValueFormatters.DOUBLE_ARRAY)) .build(); /** * The settings cache. */ private final Map<Class<?>, FormatSettings<?>> settingsCache = new ConcurrentHashMap<>(); /** * Creates an instance. */ protected FormatSettingsProvider() { } //------------------------------------------------------------------------- /** * Obtains the format settings for a given type. * * @param <T> the type of the value * @param clazz the type to format * @param defaultSettings the default settings, used if no settings are found for the type * @return the format settings */ @SuppressWarnings("unchecked") public <T> FormatSettings<T> settings(Class<? extends T> clazz, FormatSettings<Object> defaultSettings) { FormatSettings<T> settings = (FormatSettings<T>) settingsCache.get(clazz); if (settings == null) { settings = (FormatSettings<T>) TYPE_SETTINGS.get(clazz); if (settings == null) { settings = (FormatSettings<T>) defaultSettings; } settingsCache.put(clazz, settings); } return settings; } }