/** * Copyright 2010 Sven Diedrichsen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package de.jollyday.util; import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; /** * <p> * ResourceUtil class. * </p> * * @author Sven * @version $Id: $ */ public class ResourceUtil { /** * Property prefix for country descriptions. */ private static final String COUNTRY_PROPERTY_PREFIX = "country.description"; /** * Property prefix for holiday descriptions. */ private static final String HOLIDAY_PROPERTY_PREFIX = "holiday.description"; /** * The prefix of the country description file. */ private static final String COUNTRY_DESCRIPTIONS_FILE_PREFIX = "descriptions.country_descriptions"; /** * The prefix of the holiday descriptions file. */ private static final String HOLIDAY_DESCRIPTIONS_FILE_PREFIX = "descriptions.holiday_descriptions"; /** * Unknown constant will be returned when there is no description * configured. */ public static final String UNDEFINED = "undefined"; /** * Cache for the holiday descriptions resource bundles. */ private static final Map<Locale, ResourceBundle> HOLIDAY_DESCRIPTION_CACHE = new HashMap<>(); /** * Cache for the country descriptions resource bundles. */ private final static Map<Locale, ResourceBundle> COUNTRY_DESCRIPTIONS_CACHE = new HashMap<>(); /** * Util class to provide the correct classloader. */ private final transient ClassLoadingUtil classLoadingUtil = new ClassLoadingUtil(); /** * The description read with the default locale. * * @return holiday description using default locale. * @param key * a {@link java.lang.String} object. */ public String getHolidayDescription(String key) { return getHolidayDescription(Locale.getDefault(), key); } /** * The description read with the provided locale. * * @param locale * a {@link java.util.Locale} object. * @return holiday description using the provided locale. * @param key * a {@link java.lang.String} object. */ public String getHolidayDescription(Locale locale, String key) { return getDescription(HOLIDAY_PROPERTY_PREFIX + "." + key, getHolidayDescriptions(locale)); } /** * <p> * getCountryDescription. * </p> * * @return the description * @param key * a {@link java.lang.String} object. */ public String getCountryDescription(String key) { return getCountryDescription(Locale.getDefault(), key); } /** * Returns the hierarchys description text from the resource bundle. * * @param l * Locale to return the description text for. * @return Description text * @param key * a {@link java.lang.String} object. */ public String getCountryDescription(Locale l, String key) { if (key != null) { return getDescription(COUNTRY_PROPERTY_PREFIX + "." + key.toLowerCase(), getCountryDescriptions(l)); } return ResourceUtil.UNDEFINED; } /** * Returns a list of ISO codes. * * @return 2-digit ISO codes. */ public Set<String> getISOCodes() { Set<String> codes = new HashSet<>(); ResourceBundle countryDescriptions = getCountryDescriptions(Locale.getDefault()); for (String property : Collections.list(countryDescriptions.getKeys())) { String[] split = property.split("\\."); if (split != null && split.length > 2) { codes.add(split[2].toLowerCase()); } } return codes; } /** * Returns the description from the resource bundle if the key is contained. * It will return 'undefined' otherwise. * * @param key * @param bundle * @return description */ private String getDescription(String key, final ResourceBundle bundle) { if (!Collections.list(bundle.getKeys()).contains(key)) { return UNDEFINED; } return bundle.getString(key); } /** * Returns the eventually cached ResourceBundle for the holiday * descriptions. * * @param l * Locale to retrieve the descriptions for. * @return ResourceBundle containing the descriptions for the locale. */ private ResourceBundle getHolidayDescriptions(Locale l) { return getResourceBundle(l, HOLIDAY_DESCRIPTION_CACHE, HOLIDAY_DESCRIPTIONS_FILE_PREFIX); } /** * Returns the eventually cached ResourceBundle for the holiday * descriptions. * * @param l * Locale to retrieve the descriptions for. * @return ResourceBundle containing the descriptions for the locale. */ private ResourceBundle getCountryDescriptions(Locale l) { return getResourceBundle(l, COUNTRY_DESCRIPTIONS_CACHE, COUNTRY_DESCRIPTIONS_FILE_PREFIX); } /** * Returns the eventually cached ResourceBundle for the descriptions. * * @param l * Locale to retrieve the descriptions for. * @return ResourceBundle containing the descriptions for the locale. */ private ResourceBundle getResourceBundle(Locale l, Map<Locale, ResourceBundle> resourceCache, String filePrefix) { synchronized (resourceCache) { if (!resourceCache.containsKey(l)) { ResourceBundle bundle = ResourceBundle.getBundle(filePrefix, l, classLoadingUtil.getClassloader()); resourceCache.put(l, bundle); } return resourceCache.get(l); } } /** * Returns the resource by URL. * * @param resourceName * the name/path of the resource to load * @return the URL to the resource */ public URL getResource(String resourceName) { try { return classLoadingUtil.getClassloader().getResource(resourceName); } catch (Exception e) { throw new IllegalStateException("Cannot load resource: " + resourceName, e); } } }