⌛⌛ Maiden tilastoja (JSON)

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round7/jsoncountries-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Tee luokatiedostot Country.java ja CountryData.java ja liitä ne fi.tuni.prog3.jsoncountries-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa round7/jsoncountries/src/main/java/fi/tuni/prog3/jsoncountries. NetBeans osaa luoda tehtävässä pom.xml-tiedoston ja hakemistorakenteen automaattisesti, kun annat Maven-projektia luodessasi oikeat tiedot.

Materiaalien etätietovarastossa on saatavilla aineistoa (round7/jsoncountries-hakemisto).

Tässä tehtävässä kokeillaan JSON-datan lukemista sekä kirjoittamista käyttäen valmista siihen sopivaa Googlen GSON-kirjastoa: https://github.com/google/gson/blob/master/UserGuide.md. Tämän linkin takaa löytyy tieto, millainen Maven-riippuvuus kirjaston käyttöön tarvitaan.

Tehtävän pohja-aineistona toimii maailmanpankin julkaisemasta avoimesta datasta poimittu otos, joka sisältää tietoa maiden pinta-alasta, väkiluvusta ja bruttokansantuotteesta (GDP, gross domestic product). Tehtävän aineisto on muunnettu ohjelmallisesti XML-muodosta JSON-muotoon. Tämän vuoksi aineiston rakenne on hieman kömpelö: muunnostyökalu on pyrkinyt noudattamaan orjallisesti alkuperäisen XML-tiedoston muotoa.

Sinun tulee toteuttaa luokat Country ja CountryData, joilla on ainakin alla kuvatut ominaisuudet. Voit päättää muut yksityiskohdat itse.

  • Luokka Country tallettaa maan nimen (merkkijono), pinta-alan (double), väkiluvun (long) ja bruttokansantuotteen (double).

    • Määritetty pakkaukseen fi.tuni.prog3.jsoncountries.

    • Toteuttaa rajapinnan Comparable<Country> niin, että vertailu perustuu maan nimeen String-luokan luonnollisen järjestyksen mukaisesti.

    • Julkinen jäsenfunktio String toString(), joka palauttaa maan tiedot esimerkkitulosteissa kuvatulla tavalla: ensin maan nimi, ja sen alla kahdella välilyönnillä sisennettyinä omilla riveillään pinta-ala, väkiluku ja bruttokansantuote. Double-arvot yhden desimaalin tarkkuudella.

    • Julkiset jäsenfunktiot String getName(), double getArea(), long getPopulation() ja double getGdp(), jotka palauttavat nimiensä kuvaamat tiedot.

  • Luokka CountryData tarjoaa kaksi julkista staattista jäsenfunktiota maita koskevan datan lukemiseen ja kirjoittamiseen JSON-muodossa.

    • Määritetty pakkaukseen fi.tuni.prog3.jsoncountries.

    • List<Country> readFromJsons(String areaFile, String populationFile, String gdpFile) lukee maiden tietoja parametrien nimeämistä JSON-tiedostoista.

      • Tiedostot sisältävät parametrien nimien mukaisesti tietoa maiden pinta-aloista, väkiluvuista ja bruttokansantuotteista. Tiedot ovat siis kolmessa erillisessä tiedostossa.

      • Päättele tiedostojen rakenne tutkimalla annettuja esimerkkisyötetiedostoja. Kunkin tiedoston rakenne on keskenään samankaltainen: yhtä maata koskevat tiedot ovat record-objektin sisällä olevissa field-objekteissa. Kullakin field-objektilla on avaimen “attributes” alla avain “name”, jonka arvosta voit päätellä, minkä tiedon kyseinen field-objekti sisältää.

      • Funktio palauttaa jonkinlaisen rajapinnan List<Country> toteuttavan listan, joka sisältää luettua dataa kuvaavat Country-oliot. Sinun tulee näin ollen yhdistää kolmesta eri JSON-tiedostosta luetut tiedot Country-olioihin.

    • void writeToJson(List<Country> countries, String countryFile) kirjoittaa listan countries sisältämien Country-olioiden kuvaamat tiedot JSON-muodossa parametrin countryFile nimeämään tiedostoon.

      • JSON-taulukko, joka sisältää yhden JSON-objektin kutakin maata kohden. Kukin JSON-objekti kuvaa yhden maan tiedot avainten name, area, population ja gdp alla.

      • Katso tarkka muoto esimerkkitulosteista. Tulostuksen muoto vastaa GSON-kirjaston muotoilua setPrettyPrinting().

Automaattiset sekä alla kuvatut testit olettavat, että teet projektiedostoosi pom.xml seuraavat määritykset:

  • artifactId-elementin arvo on jsoncountries.

  • version-elementin arvo on 1.0.

  • Onejar-liitännäisen määritys, jonka mainClass-elementin arvo on CountryTest, joka on on alla kuvattu valmiina annettu testiluokka.

Toteutuksen testaus

Tehtävään on tarjolla kolme testiaineistoa. Alla käytetään merkkiä X viittaamaan testin numeroon, joka on 1, 2 tai 3.

Voit testata luokkiasi tiedostossa CountryTest.java annetun valmiin testiohjelman sekä tapaan areaX.json, populationX.json ja gdpX.json nimettyjen testiaineistojen, tapaan outputX.txt nimettyjen esimerkkitulosteiden sekä tapaan resultX.json nimettyjen esimerkkitulostiedostojen avulla.

Aseta CountryTest.java Maven-projektisi alihakemiston src/main/java juureen ja muut tiedostot Maven-projektisi juurihakemistoon pom.xml tiedoston seuraksi. Edellä on huomattava, että CountryTest.java ei sisällä pakkausmääritystä, joten sitä ei siksi aseteta syvempään alihakemistoon.

Voit tämän jälkeen kääntää ohjelman komennolla mvn package ja suorittaa testin X antamalla komennon java -jar target/jsoncountries-1.0.one-jar.jar areaX.json populationX.json gdpX.json countriesX.json projektin juurihakemistossa. Numeroa X käyttävän suorituksen pitäisi tuottaa vastaavassa tiedostossa outputX.txt kuvattu tuloste sekä luoda tiedosto countriesX.json, jonka sisältö on identtinen tiedoston resultX.json kanssa.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.