/**
* Copyright (c) Codice Foundation
* <p>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package org.codice.ddf.internal.country.converter.local;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.codice.ddf.internal.country.converter.api.CountryCodeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Splitter;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import ddf.security.PropertiesLoader;
/**
* Service to convert county codes into various formats by performing a local lookup. This works by
* loading in a static properties file containing the FIPS 10-4 to ISO 3166-1 alpha 3 country code
* mappings and builds multi maps of the mappings in order to perform the conversions. The country
* code mappings file is provided by default and can be configured if the country code mappings
* would ever change. For more information on how the country code mappings are formatted, refer to
* this feature's README file.
*/
public class LocalCountryCodeConverter implements CountryCodeConverter {
private static final Logger LOGGER = LoggerFactory.getLogger(LocalCountryCodeConverter.class);
private Multimap<String, String> fipsToIso3Map;
private Multimap<String, String> iso3ToFipsMap;
public List<String> convertFipsToIso3(@Nullable String fipsCountryCode) {
if (StringUtils.isNotBlank(fipsCountryCode)) {
List<String> convertedCountryCodes = (List<String>) fipsToIso3Map.get(fipsCountryCode);
if (!convertedCountryCodes.isEmpty()) {
return convertedCountryCodes;
}
}
LOGGER.debug("Could not find a corresponding ISO 3166-1 alpha 3 country code given the"
+ "FIPS 10-4 country code: {}", fipsCountryCode);
return Collections.emptyList();
}
public List<String> convertIso3ToFips(@Nullable String iso3alphaCountryCode) {
if (StringUtils.isNotBlank(iso3alphaCountryCode)) {
List<String> convertedCountryCodes = (List<String>) iso3ToFipsMap.get(
iso3alphaCountryCode);
if (!convertedCountryCodes.isEmpty()) {
return convertedCountryCodes;
}
}
LOGGER.debug("Could not find a corresponding FIPS 10-4 country code given the ISO 3166-1"
+ " alpha 3 country code: {}", iso3alphaCountryCode);
return Collections.emptyList();
}
public void setCountryCodeMappingsFile(String countryCodeMappingFile) {
if (StringUtils.isNotBlank(countryCodeMappingFile)) {
fipsToIso3Map = ArrayListMultimap.create();
iso3ToFipsMap = ArrayListMultimap.create();
Map<String, String> countryCodesMap =
PropertiesLoader.toMap(PropertiesLoader.loadProperties(countryCodeMappingFile));
for (Map.Entry<String, String> countryMappingEntry : countryCodesMap.entrySet()) {
List<String> mappedCountries = Splitter.on(',')
.splitToList(countryMappingEntry.getValue());
for (String isoCountry : mappedCountries) {
String newCountry = countryMappingEntry.getKey();
fipsToIso3Map.put(newCountry, isoCountry);
iso3ToFipsMap.put(isoCountry, newCountry);
}
}
}
if (fipsToIso3Map.isEmpty() || iso3ToFipsMap.isEmpty()) {
LOGGER.warn("Country code maps are empty. Verify the 'fipsToIso.properties' file is "
+ "located in the $DDF_HOME/etc/ directory and contains valid country code "
+ "mappings.");
}
}
}