/** * Copyright (C) 2015 - 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.List; import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import com.google.common.collect.ImmutableMap; import com.opengamma.strata.basics.currency.Currency; import com.opengamma.strata.basics.currency.CurrencyPair; import com.opengamma.strata.basics.date.DaysAdjustment; import com.opengamma.strata.basics.date.HolidayCalendarId; import com.opengamma.strata.collect.io.CsvFile; import com.opengamma.strata.collect.io.CsvRow; import com.opengamma.strata.collect.io.ResourceConfig; import com.opengamma.strata.collect.io.ResourceLocator; import com.opengamma.strata.collect.named.NamedLookup; /** * Loads standard FX Index implementations from CSV. * <p> * See {@link FxIndices} for the description of each. */ final class FxIndexCsvLookup implements NamedLookup<FxIndex> { // http://www.opengamma.com/sites/default/files/interest-rate-instruments-and-market-conventions.pdf /** * The logger. */ private static final Logger log = Logger.getLogger(FxIndexCsvLookup.class.getName()); /** * The singleton instance of the lookup. */ public static final FxIndexCsvLookup INSTANCE = new FxIndexCsvLookup(); // CSV column headers private static final String NAME_FIELD = "Name"; private static final String BASE_CURRENCY_FIELD = "Base Currency"; private static final String COUNTER_CURRENCY_FIELD = "Counter Currency"; private static final String FIXING_CALENDAR_FIELD = "Fixing Calendar"; private static final String MATURITY_DAYS_FIELD = "Maturity Days"; private static final String MATURITY_CALENDAR_FIELD = "Maturity Calendar"; /** * The cache by name. */ private static final ImmutableMap<String, FxIndex> BY_NAME = loadFromCsv(); /** * Restricted constructor. */ private FxIndexCsvLookup() { } //------------------------------------------------------------------------- @Override public Map<String, FxIndex> lookupAll() { return BY_NAME; } private static ImmutableMap<String, FxIndex> loadFromCsv() { List<ResourceLocator> resources = ResourceConfig.orderedResources("FxIndexData.csv"); Map<String, FxIndex> map = new HashMap<>(); for (ResourceLocator resource : resources) { try { CsvFile csv = CsvFile.of(resource.getCharSource(), true); for (CsvRow row : csv.rows()) { FxIndex parsed = parseFxIndex(row); map.put(parsed.getName(), parsed); map.putIfAbsent(parsed.getName().toUpperCase(Locale.ENGLISH), parsed); } } catch (RuntimeException ex) { log.log(Level.SEVERE, "Error processing resource as FX Index CSV file: " + resource, ex); return ImmutableMap.of(); } } return ImmutableMap.copyOf(map); } private static FxIndex parseFxIndex(CsvRow row) { String name = row.getField(NAME_FIELD); Currency baseCurrency = Currency.parse(row.getField(BASE_CURRENCY_FIELD)); Currency counterCurrency = Currency.parse(row.getField(COUNTER_CURRENCY_FIELD)); HolidayCalendarId fixingCal = HolidayCalendarId.of(row.getField(FIXING_CALENDAR_FIELD)); int maturityDays = Integer.parseInt(row.getField(MATURITY_DAYS_FIELD)); HolidayCalendarId maturityCal = HolidayCalendarId.of(row.getField(MATURITY_CALENDAR_FIELD)); // build result return ImmutableFxIndex.builder() .name(name) .currencyPair(CurrencyPair.of(baseCurrency, counterCurrency)) .fixingCalendar(fixingCal) .maturityDateOffset(DaysAdjustment.ofBusinessDays(maturityDays, maturityCal)) .build(); } }