/*
* Copyright (c) 2012 Brown Bag Consulting.
* This file is part of the ExpressUI project.
* Author: Juan Osuna
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License Version 3
* as published by the Free Software Foundation with the addition of the
* following permission added to Section 15 as permitted in Section 7(a):
* FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
* Brown Bag Consulting, Brown Bag Consulting DISCLAIMS THE WARRANTY OF
* NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License.
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial activities involving the ExpressUI software without
* disclosing the source code of your own applications. These activities
* include: offering paid services to customers as an ASP, providing
* services from a web application, shipping ExpressUI with a closed
* source product.
*
* For more information, please contact Brown Bag Consulting at this
* address: juan@brownbagconsulting.com.
*/
package com.expressui.domain.geonames;
import com.expressui.domain.RestClientService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Services for fetching currency code and postal code information about countries
* from http://www.geonames.org.
*/
@Configuration
@Service
public class GeoNamesService extends RestClientService {
@Resource
private GeoNamesClient geoNamesClient;
@Value("${geoNamesService.username:}")
private String username;
public Map<String, CountryInfo> getCountries() {
Map<String, CountryInfo> countries = new HashMap<String, CountryInfo>();
GeoNamesResponse geoNamesResponse = geoNamesClient.getPostalCodeCountryInfo(username);
for (CountryInfo country : geoNamesResponse.countries) {
countries.put(country.countryCode, country);
}
return countries;
}
public Map<String, String> getCurrencyCodes() {
Map<String, String> currencyCodes = new HashMap<String, String>();
GeoNamesResponse geoNamesResponse = geoNamesClient.getCountryInfo(username);
for (CountryInfo info : geoNamesResponse.countries) {
currencyCodes.put(info.countryCode, info.currencyCode);
}
return currencyCodes;
}
@Bean
public GeoNamesClient getGeoNamesClient(@Value("${geoNamesService.url:}") String url) throws Exception {
return create(url, GeoNamesClient.class);
}
@Path("/")
public static interface GeoNamesClient {
@Path("/postalCodeCountryInfo")
@GET
@Produces("application/xml")
GeoNamesResponse getPostalCodeCountryInfo(@QueryParam("username") String username);
@Path("/countryInfo")
@GET
@Produces("application/xml")
GeoNamesResponse getCountryInfo(@QueryParam("username") String username);
}
@XmlRootElement(namespace = "", name = "geonames")
@XmlAccessorType(XmlAccessType.FIELD)
public static class GeoNamesResponse {
@XmlElement(name = "country")
public List<CountryInfo> countries;
}
@XmlAccessorType(XmlAccessType.FIELD)
public static class CountryInfo {
public String countryCode;
public String minPostalCode;
public String maxPostalCode;
public String currencyCode;
}
}