AS-6.3 Teollisuuden tietojärjestelmät Kotitehtävä 7. Max 5 pistettä. Demo ja/tai 2..204 mennessä sähköpostitse olli.kilkki@aalto.fi. Neuvontaa saa samasta osoitteesta Aihe: Sisältö: Java web-sovelluspalvelun kehittäminen. Tehdään Web-sovelluspalvelu (SearchAssistant), joka suorittaa hakuja Dict.org sanakirjan Web Service-rajapintojen kautta o Kyseessä on näin Web-sovelluspalvelu, joka toimii myös asiakkaan roolissa. Työkalut: Harjoitustyökoneella tunnuksena on sukunimi ja salasanana opiskelijanumero (muistakaa vaihtaa salasana) Harjoituksessa käytetään avoimen lähdekoodin GlassFish-projektin tarjoamia JAX-WS (Java API for XML Web Services) työkaluja palvelun toteuttamiseen. JAX-WS on osa Oraclen Java EE alustaa ja tavallaan korvaa vanhemman JAX-RPC:n siirtymällä RPC-tyylisestä (Remote Procedure Call) lähestymisestä enemmän dokumentti- ja sanomapohjaisiin web-sovelluspalveluihin. Erilaisten käännös, generointi ym. tehtävien hallintaan käytetään Ant-työkalua (ant.apache.org) ja build-skriptejä. Ajonaikaisena J2EE säilönä web-sovelluspalveluille käytetään Glassfish J2EE sovelluspalvelinta. Java EE 7 SDK:n ja GlassFish-serverin voi ladata kotikoneelle osoitteista http://www.oracle.com/technetwork/java/javaee/downloads/index.html ja http://www.oracle.com/technetwork/java/javase/downloads/index.html. Harjoitustyökoneella ohjelmistot ovat valmiiksi asennettuna. Kehitysympäristönä käytetään Eclipse-kehitysympäristöä, jonka saa ladattua https://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/lunar. Harjoitustyökoneella ohjelmisto on valmiiksi asennettuna (C:\eclipse) Harjoitus koostuu kolmesta osasta:. Tehdään staattinen asiakas Dict.org sanakirjapalvelulle ja muutetaan asiakas yleiskäyttöiseksi luokaksi DictionaryClient. (JAX-WS:llä voi luoda myös dynaamisia asiakkaita, joilla sitominen voidaan tehdä ajonaikaisesti.) Halutessasi voit tutustua sanakirjaan myös web-käyttöliittymän kautta osoitteessa http://www.dict.org. 2. Tehdään palvelu SearchAssistant, joka tarjoaa käyttäjäystävällisen getsimpledefinition()-metodin. SearchAssistant käyttää DictionaryClient asiakasta hakujen tekemiseen. Tässä tehtävä palvelu toimii ikään kuin kääreenä taustalla olevalle Dict.org sanakirjapalvelulle. 3. Tehdään yksinkertainen asiakas SearchAssistant-palvelun toiminnan kokeilemiseksi.
. DictionaryClientTester +main() Temporary classes for testing purposes. 3. SearchAssistantTester +main() 2. ISearchAssistant DictionaryClient +getworddefinition() +getdefinitionsarraylist() SearchAssistant +getsimpledefinition() SearchAssistant Dict.org WS interface http://services.aonaware.com/dictservice/ DictService.asmx?WSDL dictionaryservicestubs searchassistantstubs
Aluksi: Web-sovelluspalvelun tekemisessä JAX-WS:llä merkittävä osa työtä on valmiiden työkalujen käyttämistä web-sovelluspalvelurajapintoja vastaavien tynkäluokkien luontiin tai web-sovelluspalvelurajapintojen generointiin toteutuksen pohjalta. Tässä harjoituksessa näitä työkaluja käytetään ant-skriptin build.xml kautta, joka tässä annetaan kutakuinkin valmiina. JAX-WS:ään ja käytettäviin työkaluihin voi tutustua esim. GlassFish-projektin JAX-WS referenssitoteutuksen dokumentaation ja ohjeistuksen avulla osoitteessa https://jax-ws.java.net/. Pluginin asentaminen Jotta Eclipsessä voidaan luoda GlassFish-projekteja, on Eclipseen asennettava plugin sitä varten. Avaa Eclipse Marketplace valitsemalla Help->Eclipse Marketplace. Hae Marketplacesta plugineja kirjoittamalla Find-kenttään esimerkiksi Glassfish. Valitse listasta GlassFish Java EE Glassfish tools for Luna ja klikkaa Install. Asennus saattaa kestää jonkin aikaa ja voit joutua välillä hyväksymään sopimusehtoja yms. Ympäristön konfigurointi Koska tässä harjoituksessa käytetään ant-skriptejä mm. kääntämiseen, täytyy JDK:n (Java Development Kit) puolelta asettaa tools.jar käytettävän JRE:n (Java Runtime Environment) saataville. Se lisätään Eclipsen JRE-valikoimaan seuraavasti: Window -> Preferences, Java -> Installed JREs, painetaan Addpainiketta, valitaan Standard VM ja klikataan Next. JRE home-poluksi asetetaan C:\Program Files\Java\jdk.8.0_20 (tai muu hakemisto, mistä JDK löytyy). Tämän jälkeen painetaan Add External JARs.. -painiketta ja selataan jdk.8.0_20\lib\ ja lisätään tools.jar. (Sovellusta ajettaessa tulee huolehtia, että käytetään oikeaa ajoympäristöä ja tarvittaessa valita Run-kohdasta Java Application, jonka JREvälilehdeltä asetetaan kyseinen JRE. ) Lisäksi Glassfish täytyy lisätä palvelimiin Window->Preferences->Server->Runtime Environments alta. Add ja Glassfish 4.0, JDK:ksi jdk.8.0_20 ja kansioksi C:\Program Files\Java\glassfish4\glassfish tai muu hakemisto mistä glassfish löytyy. Osa, Asiakkaan tekeminen Dict.org sanakirjapalvelulle. Käynnistä Eclipse. Luo uusi Dynamic Web Project -projekti nimeltään SearchAssistant. Valitse Target Runtimeksi GlassFish Server 4.0 ja konfiguraatioksi Default Configuration for GlassFish 4.0. Projektin luonnin yhteydessä määrittele Glassfishille myös oikea juurihakemisto (harjoitustyökoneella C:\Program Files\Java\glassfish4\glassfish) tai luo uusi paikallinen serveri. 2. Ennen varsinaisen asiakkaan koodaamista on generoitava sen tarvitsemat tynkäluokat (stub) sanakirjapalvelun palvelukuvauksesta. Tutustu myös palvelukuvaukseen esim. selaimella (http://services.aonaware.com/dictservice/dictservice.asmx?wsdl). Generointi tapahtuu käyttäen JAX-WS:n wsimport työkalua. Generointia varten on luotu valmis ant-tehtävä build.xml tiedostoon. Kopio se projektin hakemistoon. Tutustu tiedoston sisältöön ja käy läpi eri vaiheet, jotka generointi pitää sisällään. Tutustu varsinkin parametreihin ja tehtävään, jossa sanakirjapalvelun tynkäluokat luodaan palvelukuvaukseen (WSDL) perustuen. 3. Seuraavaksi generoidaan tynkäluokat ajamalla generate-dictionary-stubs. Ant-tehtävän saa ajettua helposti valitsemalla Eclipsen outline-näkymästä hiiren oikealla painikkeella kyseisen tehtävän kohdalta Run As -> Ant Build ja valitsemalla Targets välilehdeltä generate-dictionary-stubs. 4. Onnistuneen operaation tuloksena Console-näkymään tulee lopuksi teksti BUILD SUCCESSFUL. Päivittämällä projektin sisällön Package Explorer-näkymästä, pitäisi Java Resources/src-kansion alle ilmestyä uusi pakkaus tynkäluokkineen. Silmäile syntyneitä uusia luokkia ja vertaa tarvittaessa sanakirjapalvelun WSDL-kuvaukseen. (Näkymän saa päivitettyä valitsemalla projektin kohdalta oikealla hiirinäppäimelllä avautuvasta valikosta Refresh.) 5. Luo seuraavaksi uusi luokka nimeltä DictionaryClient pakettiin aos.jws.dictionary. Lisää luokkaan DictService tyyppinen yksityinen jäsenmuuttuja dict, jonka instantioit rakentajassa. Lisää luokalle
myös toinen yksityinen jäsenmuuttuja DictServiceSoap nimeltä dictsoap ja lisää luokan rakentajaan myös: dict = new DictService(); // Alustaa palvelua vastaavan tyngän dictsoap = dict.getdictservicesoap(); // SOAP binding DictService tarjoaa muitakin tapoja palvelun kutsumiseen (HttpGet,HttpPost,Soap,Soap2), mutta tässä käytetään SOAP:ia. 6. Kirjoita sitten DictionaryClient-luokalle julkinen metodi getworddefinition(string word), joka hakee ja palauttaa sanakirjapalvelulta annetun parametrin mukaisen WordDefinition olion. return dictsoap.define(word); 7. Kokeillaan sanakirjapalvelun ja client-luokan toimintaa väliaikaisen testiluokan avulla. Luo main metodin sisältämä DictionaryClientTester luokka aos.jws.testers-pakkaukseen ja lisää luonnin yhteydessä valinta kohtaan public statid void main Luo main-metodin sisällä DictionaryClient-instanssi ja käytä sitä seuraavasti: DictionaryClient dc = new DictionaryClient(); String testword = "substitute"; WordDefinition worddefresult = dc.getworddefinition(testword); // returns original word passed and the number of definitions found System.out.println( "Dictionary returned "+ worddefresult.getdefinitions().getdefinition().size() + " definitions for word "+ worddefresult.getword() ); Voit ajaa DictionaryClientTester-sovellusta painamalla luokan kohdalla hiiren oikeaa painiketta ja valitsemalla Run As -> Java Application. Ajamalla Debug-tilassa (Debug As -> Java Application) voit lisäksi sopivan breakpointin asetettuasi tarkastella esim. DictionaryClient-oliolta ja sanakirjapalvelulta haun tuloksena saatua WordDefinition-oliota. 8. Seuraavaksi modifioidaan DictionaryClient-luokkaa yleiskäyttöisemmäksi lisäämällä helppokäyttöisempi getdefinitionsarraylist() -metodi määritelmien hakemiseen. Metodin paluuarvon tulee olla tyypiltään ArrayList<Definition> ja parametrina se ottaa merkkijonon word. return (ArrayList<Definition>) dictsoap.define(word).getdefinitions().getdefinition(); 9. Voit kokeilla uutta metodia DictionaryClientTester-luokalla vaikkapa seuraavasti: ArrayList<Definition> definitions = dc.getdefinitionsarraylist("substitute"); for(int i=0; i < definitions.size(); ++i ) { } System.out.println( "\n Definition by "+ definitions.get(i).getdictionary().getname()+": \n"+ definitions.get(i).getworddefinition() ); Osa 2, SearchAssistant web-sovelluspalvelun toteuttaminen. Web-sovelluspalvelussa hyödynnetään edellisessä vaiheessa luotua DictionaryClient-luokkaa, joka kapseloi Dict.org sanakirjapalvelun ja sen kutsumekanismin. Tässä osassa luotavan websovelluspalvelun on tarkoitus tarjota alkuperäistä Dict.org palvelua yksinkertaisempi palvelurajapinta.
2. Luo uusi rajapinta ISearchAssistant pakettiin aos.jws.service. Määritä rajapintaan seuraava metodi: public String getsimpledefinition(string word); 3. Luo tämän jälkeen rajapinnan toteuttava luokka SearchAssistant samaan pakkaukseen. getsimpledefinition()-metodissa yksinkertaisesti luo uusi DictionaryClient ja käytä sen tarjoamaa hakumetodia määritelmien hakemiseen. Palauta saadun ArrayListin ensimmäisestä alkiosta palvelun palauttama määritelmä seuraavasti: DictionaryClient dc = new DictionaryClient(); ArrayList<Definition> defs = dc.getdefinitionsarraylist(word); if( defs.size() > 0) { return defs.get(0).getworddefinition(); } else { return "no definition found"; } 4. Määritellään seuraavaksi SearchAssistant-luokka julkaistavaksi web-sovelluspalveluna lisäämällä luokan eteen annotaatio @WebService. Lisää tämän jälkeen kooditiedoston alkuun import javax.jws.webservice (josta kyseinen annotaatio löytyy) esim. hyväksymällä Eclipsen ehdottama korjausehdotus virheilmoituksesta. Näin annotoidun luokan jokaista julkista metodia vastaava web-sovelluspalvelumetodi luodaan palvelurajapintaan. Tässä harjoituksessa tämä annotaatio riittää, sillä tässä tapauksessa kaikki julkisest metodit julkaistaan automaattisesti ja käytössä on ainoastaan perustietotyyppejä parametreina ja paluuarvoina. 5. Sovelluksen siirto palvelimelle tapahtuu helpoiten valitsemalla projektin kohdalta oikealla hiirinäppäimellä avautuvasta valikosta Run As -> Run on Server -> GlassFish 4.0, muut asetukset oletusarvoilla, paitsi (harjoitustehtäväkoneella) Domain pathiksi pitää asettaa: C:\Users\<user>\domain. Mikäli sovelluspalvelin ei vielä ole käynnissä se käynnistyy ja sovellus siirretään palvelimelle ajoon. Eclipsen Servers-näkymästä voi seurata palvelimia ja siellä ajossa olevia sovelluksia. 6. Tutustu luotuun palvelukuvaukseen osoitteessa http://localhost:8080/searchassistant/searchassistantservice?wsdl. Voit myös kokeilla palvelimella ajossa olevaa web-sovelluspalvelua sen selaintestikäyttöliittymän avulla osoitteessa http://localhost:8080/searchassistant/searchassistantservice?tester. Osa 3, SearchAssistant palvelun toiminnallisuuden kokeilu. Tehdään vielä asiakas juuri luodulle ja käyttöönotetulle SearchAssistant-palvelulle sen nopeaksi testaamiseksi. 2. Kuten osassa, tarvittavat ant-tehtävät on annettu ant-skriptissä (generate-searchassistant-stub). Täydennä tehtävän parametreihin luomasi palvelun WSDL-palvelukuvauksen sijainti ja generoi tynkäluokat (muista päivittää projektipuu jos tynkäluokat eivät näy). 3. Tee uusi asiakasluokka palvelun kokeilemiseksi aot.jws.testers-pakkaukseen kuten osassa. Anna luokan nimeksi SearchAssistantServiceTester ja lisää main-metodiin: SearchAssistantService saservice = new SearchAssistantService(); SearchAssistant sa = saservice.getsearchassistantport(); System.out.println("Definition for substitute is "+ sa.getsimpledefinition("substitute")); 4. Aja testiluokka valitsemalla Run As -> Java Application