/// <summary>
        /// Gets all rates curves.
        /// </summary>
        /// <returns> the map of all rates curves </returns>
        public virtual SortedDictionary <LocalDate, RatesCurveGroup> loadAllRatesCurves()
        {
            if (!subdirectoryExists(CURVES_DIR))
            {
                throw new System.ArgumentException("No rates curves directory found");
            }
            ResourceLocator curveGroupsResource = getResource(CURVES_DIR, CURVES_GROUPS_FILE);

            if (curveGroupsResource == null)
            {
                throw new System.ArgumentException(Messages.format("Unable to load rates curves: curve groups file not found at {}/{}", CURVES_DIR, CURVES_GROUPS_FILE));
            }
            ResourceLocator curveSettingsResource = getResource(CURVES_DIR, CURVES_SETTINGS_FILE);

            if (curveSettingsResource == null)
            {
                throw new System.ArgumentException(Messages.format("Unable to load rates curves: curve settings file not found at {}/{}", CURVES_DIR, CURVES_SETTINGS_FILE));
            }
            ListMultimap <LocalDate, RatesCurveGroup> curveGroups = RatesCurvesCsvLoader.loadAllDates(curveGroupsResource, curveSettingsResource, RatesCurvesResources);

            // There is only one curve group in the market data file so this will always succeed
            IDictionary <LocalDate, RatesCurveGroup> curveGroupMap = Maps.transformValues(curveGroups.asMap(), groups => groups.GetEnumerator().next());

            return(new SortedDictionary <>(curveGroupMap));
        }
        private void loadRatesCurves(ImmutableMarketDataBuilder builder, LocalDate marketDataDate)
        {
            if (!subdirectoryExists(CURVES_DIR))
            {
                log.debug("No rates curves directory found");
                return;
            }

            ResourceLocator curveGroupsResource = getResource(CURVES_DIR, CURVES_GROUPS_FILE);

            if (curveGroupsResource == null)
            {
                log.error("Unable to load rates curves: curve groups file not found at {}/{}", CURVES_DIR, CURVES_GROUPS_FILE);
                return;
            }

            ResourceLocator curveSettingsResource = getResource(CURVES_DIR, CURVES_SETTINGS_FILE);

            if (curveSettingsResource == null)
            {
                log.error("Unable to load rates curves: curve settings file not found at {}/{}", CURVES_DIR, CURVES_SETTINGS_FILE);
                return;
            }
            try
            {
                ICollection <ResourceLocator> curvesResources = RatesCurvesResources;
                IList <RatesCurveGroup>       ratesCurves     = RatesCurvesCsvLoader.load(marketDataDate, curveGroupsResource, curveSettingsResource, curvesResources);

                foreach (RatesCurveGroup group in ratesCurves)
                {
                    // add entry for higher level discount curve name
                    group.DiscountCurves.forEach((ccy, curve) => builder.addValue(CurveId.of(group.Name, curve.Name), curve));
                    // add entry for higher level forward curve name
                    group.ForwardCurves.forEach((idx, curve) => builder.addValue(CurveId.of(group.Name, curve.Name), curve));
                }
            }
            catch (Exception e)
            {
                log.error("Error loading rates curves", e);
            }
        }