| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
| ResourceUtil |
|
| 2.1;2,1 |
| 1 | /** | |
| 2 | * Copyright 2010 Sven Diedrichsen | |
| 3 | * | |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | * you may not use this file except in compliance with the License. | |
| 6 | * You may obtain a copy of the License at | |
| 7 | * | |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | * | |
| 10 | * Unless required by applicable law or agreed to in writing, software | |
| 11 | * distributed under the License is distributed on an | |
| 12 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either | |
| 13 | * express or implied. See the License for the specific language | |
| 14 | * governing permissions and limitations under the License. | |
| 15 | */ | |
| 16 | package de.jollyday.util; | |
| 17 | ||
| 18 | import java.net.URL; | |
| 19 | import java.util.Collections; | |
| 20 | import java.util.HashMap; | |
| 21 | import java.util.HashSet; | |
| 22 | import java.util.Locale; | |
| 23 | import java.util.Map; | |
| 24 | import java.util.ResourceBundle; | |
| 25 | import java.util.Set; | |
| 26 | ||
| 27 | /** | |
| 28 | * <p> | |
| 29 | * ResourceUtil class. | |
| 30 | * </p> | |
| 31 | * | |
| 32 | * @author Sven | |
| 33 | * @version $Id: $ | |
| 34 | */ | |
| 35 | 5017 | public class ResourceUtil { |
| 36 | ||
| 37 | /** | |
| 38 | * Property prefix for country descriptions. | |
| 39 | */ | |
| 40 | private static final String COUNTRY_PROPERTY_PREFIX = "country.description"; | |
| 41 | /** | |
| 42 | * Property prefix for holiday descriptions. | |
| 43 | */ | |
| 44 | private static final String HOLIDAY_PROPERTY_PREFIX = "holiday.description"; | |
| 45 | /** | |
| 46 | * The prefix of the country description file. | |
| 47 | */ | |
| 48 | private static final String COUNTRY_DESCRIPTIONS_FILE_PREFIX = "descriptions.country_descriptions"; | |
| 49 | /** | |
| 50 | * The prefix of the holiday descriptions file. | |
| 51 | */ | |
| 52 | private static final String HOLIDAY_DESCRIPTIONS_FILE_PREFIX = "descriptions.holiday_descriptions"; | |
| 53 | /** | |
| 54 | * Unknown constant will be returned when there is no description | |
| 55 | * configured. | |
| 56 | */ | |
| 57 | public static final String UNDEFINED = "undefined"; | |
| 58 | /** | |
| 59 | * Cache for the holiday descriptions resource bundles. | |
| 60 | */ | |
| 61 | 1 | private static final Map<Locale, ResourceBundle> HOLIDAY_DESCRIPTION_CACHE = new HashMap<>(); |
| 62 | /** | |
| 63 | * Cache for the country descriptions resource bundles. | |
| 64 | */ | |
| 65 | 1 | private final static Map<Locale, ResourceBundle> COUNTRY_DESCRIPTIONS_CACHE = new HashMap<>(); |
| 66 | /** | |
| 67 | * Util class to provide the correct classloader. | |
| 68 | */ | |
| 69 | 5021 | private transient ClassLoadingUtil classLoadingUtil = new ClassLoadingUtil(); |
| 70 | ||
| 71 | /** | |
| 72 | * The description read with the default locale. | |
| 73 | * | |
| 74 | * @return holiday description using default locale. | |
| 75 | * @param key | |
| 76 | * a {@link java.lang.String} object. | |
| 77 | */ | |
| 78 | public String getHolidayDescription(String key) { | |
| 79 | 0 | return getHolidayDescription(Locale.getDefault(), key); |
| 80 | } | |
| 81 | ||
| 82 | /** | |
| 83 | * The description read with the provided locale. | |
| 84 | * | |
| 85 | * @param locale | |
| 86 | * a {@link java.util.Locale} object. | |
| 87 | * @return holiday description using the provided locale. | |
| 88 | * @param key | |
| 89 | * a {@link java.lang.String} object. | |
| 90 | */ | |
| 91 | public String getHolidayDescription(Locale locale, String key) { | |
| 92 | 1293 | return getDescription(HOLIDAY_PROPERTY_PREFIX + "." + key, getHolidayDescriptions(locale)); |
| 93 | } | |
| 94 | ||
| 95 | /** | |
| 96 | * <p> | |
| 97 | * getCountryDescription. | |
| 98 | * </p> | |
| 99 | * | |
| 100 | * @return the description | |
| 101 | * @param key | |
| 102 | * a {@link java.lang.String} object. | |
| 103 | */ | |
| 104 | public String getCountryDescription(String key) { | |
| 105 | 0 | return getCountryDescription(Locale.getDefault(), key); |
| 106 | } | |
| 107 | ||
| 108 | /** | |
| 109 | * Returns the hierarchys description text from the resource bundle. | |
| 110 | * | |
| 111 | * @param l | |
| 112 | * Locale to return the description text for. | |
| 113 | * @return Description text | |
| 114 | * @param key | |
| 115 | * a {@link java.lang.String} object. | |
| 116 | */ | |
| 117 | public String getCountryDescription(Locale l, String key) { | |
| 118 | 673 | if (key != null) { |
| 119 | 673 | return getDescription(COUNTRY_PROPERTY_PREFIX + "." + key.toLowerCase(), getCountryDescriptions(l)); |
| 120 | } | |
| 121 | 0 | return ResourceUtil.UNDEFINED; |
| 122 | } | |
| 123 | ||
| 124 | /** | |
| 125 | * Returns a list of ISO codes. | |
| 126 | * | |
| 127 | * @return 2-digit ISO codes. | |
| 128 | */ | |
| 129 | public Set<String> getISOCodes() { | |
| 130 | 3 | Set<String> codes = new HashSet<>(); |
| 131 | 3 | ResourceBundle countryDescriptions = getCountryDescriptions(Locale.getDefault()); |
| 132 | 3 | for (String property : Collections.list(countryDescriptions.getKeys())) { |
| 133 | 1596 | String[] split = property.split("\\."); |
| 134 | 1596 | if (split != null && split.length > 2) { |
| 135 | 1596 | codes.add(split[2].toLowerCase()); |
| 136 | } | |
| 137 | 1596 | } |
| 138 | 3 | return codes; |
| 139 | } | |
| 140 | ||
| 141 | /** | |
| 142 | * Returns the description from the resource bundle if the key is contained. | |
| 143 | * It will return 'undefined' otherwise. | |
| 144 | * | |
| 145 | * @param key | |
| 146 | * @param bundle | |
| 147 | * @return description | |
| 148 | */ | |
| 149 | private String getDescription(String key, final ResourceBundle bundle) { | |
| 150 | 1966 | if (!Collections.list(bundle.getKeys()).contains(key)) { |
| 151 | 1345 | return UNDEFINED; |
| 152 | } | |
| 153 | 621 | return bundle.getString(key); |
| 154 | } | |
| 155 | ||
| 156 | /** | |
| 157 | * Returns the eventually cached ResourceBundle for the holiday | |
| 158 | * descriptions. | |
| 159 | * | |
| 160 | * @param l | |
| 161 | * Locale to retrieve the descriptions for. | |
| 162 | * @return ResourceBundle containing the descriptions for the locale. | |
| 163 | */ | |
| 164 | private ResourceBundle getHolidayDescriptions(Locale l) { | |
| 165 | 1293 | return getResourceBundle(l, HOLIDAY_DESCRIPTION_CACHE, HOLIDAY_DESCRIPTIONS_FILE_PREFIX); |
| 166 | } | |
| 167 | ||
| 168 | /** | |
| 169 | * Returns the eventually cached ResourceBundle for the holiday | |
| 170 | * descriptions. | |
| 171 | * | |
| 172 | * @param l | |
| 173 | * Locale to retrieve the descriptions for. | |
| 174 | * @return ResourceBundle containing the descriptions for the locale. | |
| 175 | */ | |
| 176 | private ResourceBundle getCountryDescriptions(Locale l) { | |
| 177 | 676 | return getResourceBundle(l, COUNTRY_DESCRIPTIONS_CACHE, COUNTRY_DESCRIPTIONS_FILE_PREFIX); |
| 178 | } | |
| 179 | ||
| 180 | /** | |
| 181 | * Returns the eventually cached ResourceBundle for the descriptions. | |
| 182 | * | |
| 183 | * @param l | |
| 184 | * Locale to retrieve the descriptions for. | |
| 185 | * @return ResourceBundle containing the descriptions for the locale. | |
| 186 | */ | |
| 187 | private ResourceBundle getResourceBundle(Locale l, Map<Locale, ResourceBundle> resourceCache, String filePrefix) { | |
| 188 | 1969 | synchronized (resourceCache) { |
| 189 | 1969 | if (!resourceCache.containsKey(l)) { |
| 190 | 9 | ResourceBundle bundle = ResourceBundle.getBundle(filePrefix, l, classLoadingUtil.getClassloader()); |
| 191 | 9 | resourceCache.put(l, bundle); |
| 192 | } | |
| 193 | 1969 | return resourceCache.get(l); |
| 194 | 0 | } |
| 195 | } | |
| 196 | ||
| 197 | /** | |
| 198 | * Returns the resource by URL. | |
| 199 | * | |
| 200 | * @param resourceName | |
| 201 | * the name/path of the resource to load | |
| 202 | * @return the URL to the resource | |
| 203 | */ | |
| 204 | public URL getResource(String resourceName) { | |
| 205 | try { | |
| 206 | 1338 | return classLoadingUtil.getClassloader().getResource(resourceName); |
| 207 | 0 | } catch (Exception e) { |
| 208 | 0 | throw new IllegalStateException("Cannot load resource: " + resourceName, e); |
| 209 | } | |
| 210 | } | |
| 211 | ||
| 212 | } |