CountryCode Web Services Project

Нашел, интересный web service, самое важное, пока рабочий.
SOAP Web service
Содержит большое количество методов, которые возвращают много полезной справочной информации по странам и городам. Протестируем его, и напишем проект с заданием.

Задание:
Получить все ISO коды стран. Сервис ListOfCountryNamesByCode.
По коду ISO получить все столицы стран. Сервис CapitalCity.
Создать таблицу: COUNTRY_CATALOG.
Вставить полученные данные в таблицу.
Распарсить сайт countrycode.org и дополнить таблицу необходимыми данными.
В итоге получается заполненная таблица, с разных источников данных полученных разными способами.

Использовал:

Spring jdbc Spring context Wsimport Jsoup NamedParameterJdbc
Jackson JAXB MySQL MAMP Allure2

models – пакет с генерированными классами по wsdl с использованием Wsimport. Тут описывал как генерировать классы.
modelDb – пакет c описанной таблицей SQL -> Java.
CheckCodeRecord – сам исполняемый тест.
 
Создадим таблицу.

-- Create TABLE
CREATE TABLE COUNTRY_CATALOG (
  id INT(11) NOT NULL AUTO_INCREMENT,
  COUNTRY VARCHAR(150),
  CAPITAL VARCHAR(150),
  COUNTRY_CODE VARCHAR(150),
  ISO_CODES2 VARCHAR(150),
  ISO_CODES3 VARCHAR(150),
  POPULATION VARCHAR(150),
  AREA_KM2 VARCHAR(150),
  GDP_$USD VARCHAR(150),
  PRIMARY KEY (id)
);
DROP TABLE COUNTRY_CATALOG;
SELECT * FROM COUNTRY_CATALOG;

 
В db.xml опишем bean подключения к БД.

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
 
        <!--fix UTC defect ?serverTimezone=UTC-->
        <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

 
Далее по порядку.
Soap request к web service.

//START. Soap request
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"application-config.xml"});
CountryInfoService bean = context.getBean(CountryInfoService.class);
ArrayOftCountryCodeAndName arrayOftCountryCodeAndName = bean.getCountryInfoServiceSoap().listOfCountryNamesByCode();
List<TCountryCodeAndName> tCountryCodeAndName = arrayOftCountryCodeAndName.getTCountryCodeAndName();

 
Пробежимся циклом по разным сервисам, для сбора максимально большого количества нужной информации.

for (TCountryCodeAndName codeAndName : tCountryCodeAndName){
            String isoCode = codeAndName.getSISOCode();
            String countryName = codeAndName.getSName();
 
            String capitalCity = bean.getCountryInfoServiceSoap().capitalCity(isoCode);
            //Get Country Currency
                TCurrency currency = bean.getCountryInfoServiceSoap().countryCurrency(isoCode);
            String currencyCode = currency.getSISOCode();
            String currencyName = currency.getSName();
            //Get Country Phone Code
            String phoneCode = bean.getCountryInfoServiceSoap().countryIntPhoneCode(isoCode);
            //Get Country language
            TCountryInfo countryLanguageList = bean.getCountryInfoServiceSoap().fullCountryInfo(isoCode);
            List<TLanguage> tLanguage = countryLanguageList.getLanguages().getTLanguage();

 
Начнем заполнять таблицу.

//START. Record ISOCode and Country name in db
ClassPathXmlApplicationContext contextdb = new ClassPathXmlApplicationContext("db.xml");
nquSql = new NamedParameterJdbcTemplate(contextdb.getBean(DataSource.class));
HashMap<String, Object> param = new HashMap<>();
param.put("isoCode", isoCode);
param.put("countryName", countryName);
param.put("capitalCity", capitalCity);
param.put("countryLanguage", countryLanguage);
param.put("currencyCode", currencyCode);
param.put("currencyName", currencyName);
param.put("phoneCode", phoneCode);
String insertSql = "INSERT INTO COUNTRY_CATALOG  VALUES (id, :countryName, :capitalCity, :countryLanguage, NULL, :isoCode, NULL, NULL, NULL, NULL, :currencyCode, :currencyName, :phoneCode);";
// execute insert + count number of records / records processed by the executed query
nquSql.update(insertSql, param);
update1 ++;
//STOP. Record in db;

 
Распарсим сайт countrycode.org (библиотека jsoup) и соберем в список информацию. Сравним с нашей таблицей.

 Document doc = Jsoup.parse(new File("D:\\JAVA\\Java_SRC\\CountryCodeProject\\src\\main\\resources\\countrycode.html"), "utf-8");
        Elements inputElements = doc.select("div.visible-md > table > tbody > tr");
        int update2 = 0;
        for (Element inputElement : inputElements) {
            String country = inputElement.select("td:nth-child(1)").text();
            String countryCode = inputElement.select("td:nth-child(2)").text();
            String isoCode2 = inputElement.select("td:nth-child(3)").text().substring(0,2);
            String isoCode3 = inputElement.select("td:nth-child(3)").text().substring(5,8);
            String population = inputElement.select("td:nth-child(4)").text().replace(" ", "");
            String areaSq = inputElement.select("td:nth-child(5)").text().replace(" ", "");
            String gpd = inputElement.select("td:nth-child(6)").text();
 
            HashMap<String, Object> param = new HashMap<>();
            param.put("ISO_CODES2", isoCode2);
            List<CountryCatalog> newDatasetAirs = nquSql.query("SELECT * FROM COUNTRY_CATALOG WHERE ISO_CODES2 = :ISO_CODES2",
                    param,
                    new BeanPropertyRowMapper<>(CountryCatalog.class));

 
Обновим теперь нашу таблицу с учетом новых данных.

if (newDatasetAirs.size() != 0){
 HashMap<String, Object> param2 = new HashMap<>();
 param2.put("isoCode2", isoCode2);
 param2.put("isoCode3", isoCode3);
 param2.put("countryCode", countryCode);
 param2.put("population", population);
 param2.put("areaSq", areaSq);
 param2.put("gpd", gpd);
 String updateSql = "UPDATE COUNTRY_CATALOG SET COUNTRY_CODE = :countryCode, ISO_CODES3 = :isoCode3, POPULATION = :population, AREA_KM2 = :areaSq, GDP_$USD = :gpd WHERE ISO_CODES2 = :isoCode2";
 nquSql.update(updateSql, param2);
}

 
Получаем информативную, заполненную таблицу.

 
 
Ссылка на GitHub:
Github CountryProject

Related Posts