/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.conversion;
import java.util.HashSet;
import java.util.Set;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.region.Region;
import com.opengamma.core.region.RegionSource;
import com.opengamma.financial.convention.HolidaySourceCalendarAdapter;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.id.ExternalId;
import com.opengamma.util.money.Currency;
/**
* Utilities and constants for {@code Calendar}.
* <p>
* This is a thread-safe static utility class.
*/
public class CalendarUtils {
/**
* Restricted constructor.
*/
protected CalendarUtils() {
super();
}
//-------------------------------------------------------------------------
public static Calendar getCalendar(final RegionSource regionSource, final HolidaySource holidaySource,
final ExternalId regionId) {
String separator = getMultipleRegionSeparator(regionId);
if (separator != null) {
String[] regions = regionId.getValue().split(separator);
final Set<Region> resultRegions = new HashSet<>();
for (final String region : regions) {
if (regionId.isScheme(ExternalSchemes.FINANCIAL)) {
resultRegions.add(regionSource.getHighestLevelRegion(ExternalSchemes.financialRegionId(region)));
} else if (regionId.isScheme(ExternalSchemes.ISDA_HOLIDAY)) {
resultRegions.add(regionSource.getHighestLevelRegion(ExternalSchemes.isdaHoliday(region)));
}
}
return new HolidaySourceCalendarAdapter(holidaySource, resultRegions.toArray(new Region[resultRegions.size()]));
}
final Region region = regionSource.getHighestLevelRegion(regionId); // we've checked that they are the same.
return new HolidaySourceCalendarAdapter(holidaySource, region);
}
/**
* Returns the escaped separator character for parsing multiple regions
*
* @param regionId the region id to parse.
* @return the escaped separator charactor.
*/
private static String getMultipleRegionSeparator(ExternalId regionId) {
if (!(regionId.isScheme(ExternalSchemes.FINANCIAL) || regionId.isScheme(ExternalSchemes.ISDA_HOLIDAY))) {
return null;
}
String regions = regionId.getValue();
if (regions.contains("+")) {
return "\\+";
} else if (regions.contains(",")) {
return ",";
} else {
return null;
}
}
public static Calendar getCalendar(final HolidaySource holidaySource, final Currency... currencies) {
return new HolidaySourceCalendarAdapter(holidaySource, currencies);
}
}