/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.basics.index;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Logger;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.collect.io.IniFile;
import com.opengamma.strata.collect.io.PropertySet;
import com.opengamma.strata.collect.io.ResourceConfig;
import com.opengamma.strata.collect.named.NamedLookup;
/**
* Loads standard floating rate names from INI.
*/
final class FloatingRateNameIniLookup
implements NamedLookup<FloatingRateName> {
/**
* The logger.
*/
private static final Logger log = Logger.getLogger(FloatingRateNameIniLookup.class.getName());
/**
* The singleton instance of the lookup.
*/
public static final FloatingRateNameIniLookup INSTANCE = new FloatingRateNameIniLookup();
/**
* INI file for floating rate names.
*/
private static final String FLOATING_RATE_NAME_INI = "FloatingRateNameData.ini";
/**
* Restricted constructor.
*/
private FloatingRateNameIniLookup() {
}
//-------------------------------------------------------------------------
@Override
public Map<String, FloatingRateName> lookupAll() {
return Loader.INSTANCE.names;
}
// finds a default
FloatingRateName defaultIborIndex(Currency currency) {
FloatingRateName frname = Loader.INSTANCE.iborDefaults.get(currency);
if (frname == null) {
throw new IllegalArgumentException("No default Ibor index for currency " + currency);
}
return frname;
}
// finds a default
FloatingRateName defaultOvernightIndex(Currency currency) {
FloatingRateName frname = Loader.INSTANCE.overnightDefaults.get(currency);
if (frname == null) {
throw new IllegalArgumentException("No default Overnight index for currency " + currency);
}
return frname;
}
//-------------------------------------------------------------------------
static class Loader {
/** Instance. */
private static final Loader INSTANCE = new Loader();
/** The cache by name. */
private final ImmutableMap<String, FloatingRateName> names;
/** The Ibor defaults by currency. */
private final ImmutableMap<Currency, FloatingRateName> iborDefaults;
/** The Overnight defaults by currency. */
private final ImmutableMap<Currency, FloatingRateName> overnightDefaults;
//-------------------------------------------------------------------------
Loader() {
ImmutableMap<String, FloatingRateName> names = ImmutableMap.of();
ImmutableMap<Currency, FloatingRateName> iborDefaults = ImmutableMap.of();
ImmutableMap<Currency, FloatingRateName> overnightDefaults = ImmutableMap.of();
try {
IniFile ini = ResourceConfig.combinedIniFile(FLOATING_RATE_NAME_INI);
names = parseIndices(ini);
iborDefaults = parseIborDefaults(ini, names);
overnightDefaults = parseOvernightDefaults(ini, names);
} catch (RuntimeException ex) {
// logging used because this is loaded in a static variable
log.severe(Throwables.getStackTraceAsString(ex));
// return an empty instance to avoid ExceptionInInitializerError
}
this.names = names;
this.iborDefaults = iborDefaults;
this.overnightDefaults = overnightDefaults;
}
// parse the config file FloatingRateName.ini
private static ImmutableMap<String, FloatingRateName> parseIndices(IniFile ini) {
HashMap<String, FloatingRateName> map = new HashMap<>();
parseSection(ini.section("ibor"), "-", FloatingRateType.IBOR, map);
parseSection(ini.section("overnightCompounded"), "", FloatingRateType.OVERNIGHT_COMPOUNDED, map);
parseSection(ini.section("overnightAveraged"), "", FloatingRateType.OVERNIGHT_AVERAGED, map);
parseSection(ini.section("price"), "", FloatingRateType.PRICE, map);
return ImmutableMap.copyOf(map);
}
// parse a single section
private static void parseSection(
PropertySet section,
String indexNameSuffix,
FloatingRateType type,
HashMap<String, FloatingRateName> mutableMap) {
// find our names from the RHS of the key/value pairs
for (String key : section.keys()) {
ImmutableFloatingRateName name = ImmutableFloatingRateName.of(key, section.value(key) + indexNameSuffix, type);
mutableMap.put(key, name);
mutableMap.putIfAbsent(key.toUpperCase(Locale.ENGLISH), name);
}
}
//-------------------------------------------------------------------------
// load currency defaults
private static ImmutableMap<Currency, FloatingRateName> parseIborDefaults(
IniFile ini,
ImmutableMap<String, FloatingRateName> names) {
ImmutableMap.Builder<Currency, FloatingRateName> map = ImmutableMap.builder();
PropertySet section = ini.section("currencyDefaultIbor");
for (String key : section.keys()) {
FloatingRateName frname = names.get(section.value(key));
if (frname == null) {
throw new IllegalArgumentException("Invalid default Ibor index for currency " + key);
}
map.put(Currency.of(key), frname);
}
return map.build();
}
//-------------------------------------------------------------------------
// load currency defaults
private static ImmutableMap<Currency, FloatingRateName> parseOvernightDefaults(
IniFile ini,
ImmutableMap<String, FloatingRateName> names) {
ImmutableMap.Builder<Currency, FloatingRateName> map = ImmutableMap.builder();
PropertySet section = ini.section("currencyDefaultOvernight");
for (String key : section.keys()) {
FloatingRateName frname = names.get(section.value(key));
if (frname == null) {
throw new IllegalArgumentException("Invalid default Overnight index for currency " + key);
}
map.put(Currency.of(key), frname);
}
return map.build();
}
}
}