AS-75.3600 Semanttiset Web-palvelut

Harjoitustyöohje

Tuukka Ruotsalo ja Eetu Mäkelä

Ensin

Lue ohje kokonaan läpi ennen kuin teet mitään.

Yleistä

Ideana on, että opiskelijat voivat AS-mikroluokassa (Huone 1521, TUAS-talo) tehdä työtä itsenäisesti. Mikroluokkaan on asennettu ympäristö, jossa on tarvittavat ohjelmistot työn tekemiseen.

Varsinaiset harjoituskerrat järjestetään AS-mikroluokassa torstaisin klo 12-14 ja 14-16. Harjoituksiin ilmoittaudutaan web-topissa. Harjoitustilaisuuksilla on kaksi tarkoitusta: 1) tilaisuuksissa käydään demoamassa ja tarkistuttamassa assistenteilla harjoitystyön vaiheita. 2) tilaisuuksissa on mahdollista saada opastusta työn tekemiseen. Vinkkejä saa ottaa myös muilta opiskelijoilta ja siihen jopa kannustetaan, sinun tulee kuitenkin kyetä selittämään ja demoamaan tekemääsi kun palautat harjoitustyön.

Ohjeissa esiintyvät hakasulkeet [] ja niiden sisältö sitten tarkoittavat sitä että niiden sijalle pitää itse keksiä jotain fiksua, ja niitä hakasulkeita ei varsinaiseen komentoon tule.

Ympäristö

Jokaiseen AS-luokan koneeseen on asennettu Tomcat 5.5.17 ja Axis 1.4, joita käytetään paikallisesti. Tomcatin käynnistys- ja alasajoskriptit löytyvät windowsin startup-valikosta.

Kurssille on tehty hakemisto windows-palvelimelle: \\win.hut.fi\gen\courses\AS\75\3600. Sen alihakemistosta general löytyy työtä helpottavia skriptejä, sekä esimerkkejä. Alihakemmistoon students voi tallentaa kaikkien käyttöön ja muokattavaksi tiedostoja, jos sille ilmenee tarpeita.

Jotta skriptit saa käyttöön, pitää ajaa Windowsin command promptissa käsky \\win.hut.fi\gen\courses\AS\75\3600\general\SetupAxis.bat. Command promptiin pääsee ottamalla Windowsin start-valikosta run.. ja kirjoittamalla kenttää cmd. Jos sinun tarvitsee avata useita command prompteja, \\win.hut.fi\gen\courses\AS\75\3600\general\SetupAxis.bat pitää ajaa jokaisessa.

Tämän jälkeen pitäisi voida käyttää komentoja wsdl2java, java2wsdl, adminclient ja tcpmon.

Komentojen ajamisesta tulee aina erilaisia WARN-viestejä, mutta näistä ei tarvitse huolehtia jos nämä liittyvät log4j:n tai mail tai xmlsec.jareihin. Ylipäänsä kannattaa huolestua yleensä vasta jos tulee ERROR-virheitä (ja yleensä silloin niitä tulee pari sivua).

Aina kun loggaat koneelle sisään, on hyvä tehdä seuraavat toiminnot: 1. sulje mahdollisesti käynnissä oleva tomcat Start-valikosta. 2. palauta originaalit axis-tiedostot Start-valikosta. Tämä siksi, ettei jonkun muun kurssilaisen palvelimella jo mahdollisesti pyörivä koodi aiheuta ongelmia vaan pääset aloittamaan puhtaalta pöydältä.

Jos teet harjoitustyötä kotona

Kolme toimintoa

Kolme useasti tarvittua toimintoa (kurssin) Web Services -ympäristössä

Toiminto 1: Oman Web Servicen julkaisu

  1. Suunnittele palvelun käyttämä tietomalli, ja implementoi sen toteuttavat JavaBeanit
  2. Suunnittele ja toteuta palvelun rajapintaluokka
  3. Käännä javaluokat (javac *.java)
  4. Paketoi kääntämäsi luokat jar-pakettiin. (esimerkiksi: aja src-hakemistossa jar cvf sws-example-server.jar .)
  5. Kopioi luomasi jar-paketti hakemistoon c:\programs\axis\webapps\axis\WEB-INF\lib, niin että Tomcat ja Axis saavat luokkatiedostot näkyviinsä
  6. Käynnistä Tomcat uudestaan, jotta Tomcat ja Axis huomaavat uuden jarin.
  7. Luo palvelulle deploy.wsdd muokaten hakemistossa \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-server olevaa esimerkkiä.
  8. Aja komento adminclient deploy.wsdd
  9. Tarkista että palvelusi näkyy Axiksen listauksessa (http://localhost:8080/axis/servlet/AxisServlet)

Kokonainen esimerkki ensimmäisistä harjoituksista

0. Varmista että ympäristöskriptit toimivat: aja komentorivillä \\win.hut.fi\gen\courses\AS\75\3600\general\SetupAxis.bat
  1. Tehty valmiiksi.
  2. Tehty valmiiksi.
    1. cd z:\[hakemisto]\sws-example-server\src\fi\seco\courses\sws\example
    2. javac *.java
    1. cd z:\[hakemisto]\sws-example-server\src
    2. jar cvf sws-example-server.jar . (<- huomaa olennainen piste)
  3. copy sws-example-server.jar c:\programs\axis\webapps\axis\WEB-INF\lib
  4. Start-menusta restart tomcat
  5. Tehty valmiiksi
  6. adminclient z:\[hakemisto]\sws-example-server\deploy.wsdd
  7. Mene selaimella osoitteeseen http://localhost:8080/axis/servlet/AxisServlet

Toiminto 2: Web Servicen ottaminen käyttöön

  1. Mene projektin sorsien juurihakemistoon [src]
  2. Aja komento wsdl2java -p [pakettinimi, esim fi.seco.courses.sws.example.gen] [wsdl:n verkko-osoite, esim. http://localhost:8080/axis/services/CurrencyExchangeService?wsdl]
  3. Ohjelmoi asiakas käyttämään hyväksi palvelua. Esimerkit hakemistoissa \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-client ja \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-amazon-client.
  4. Käännä asiakasohjelma (esim javac -cp %AXISCP% *.java gen/*.java)
  5. Aja asiakas ja testaa sitä (java -cp %AXISCP% fi.seco.courses.sws.example.TestCurrencyExchangeRateService)

Kokonainen esimerkki ensimmäisistä harjoituksista

0. Varmista että ympäristöskriptit toimivat: aja komentorivillä \\win.hut.fi\gen\courses\AS\75\3600\general\SetupAxis.bat
  1. cd z:\[hakemisto]\sws-example-client\src
  2. wsdl2java -p fi.seco.courses.sws.example.gen http://localhost:8080/axis/services/CurrencyExchangeService?wsdl
  3. Tehty valmiiksi
    1. cd fi\seco\courses\sws\example
    2. javac -cp %AXISCP% *.java gen\*.java
    1. cd z:\[hakemisto]\sws-example-client\src
    2. java -cp %AXISCP% fi.seco.courses.sws.example.TestCurrencyExchangeRateService

Toiminto 3: Web Servicen SOAP-liikenteen seuraaminen

  1. Aja komento tcpmon
  2. Täytä kohtaan Host kuunneltavan webservicen osoite
  3. Täytä kohtaan Port kuunneltavan webservicen portti
  4. Täytä kohtaan Listen Port jokin portti, esim. 8888
  5. Kutsu clientissasi locatoria osoitteella joka ohjautuu tcpmoniin, (muuta locator.get[JokuService]() muotoon locator.get[JokuService](new URL("[urli]")); ja lisää tarvittavat importit ja throws-määreet) niin saat palvelun joka menee monitorin läpi.

Kokonainen esimerkki ensimmäisistä harjoituksista

UKK

WSDL ei käänny oikein (esim. could not find serializer for..) Tarkista, että kaikilla beaneilla on oikean muotoiset get- ja set-metodit. Tee myös palvelurajapintaan metodit, joiden deklaraatiossa mainitset luokat joita palvelu käyttää. Käyttämämme Axis tuntuu olevan niin tyhmä, ettei ymmärrä tehdä serialisoijia luokille joita ei ole määritelty metodideklaraaatiossa. Määrittele siis vaikkapa metodi public Book getBook(name);, jossa siis mainitset Book tietotyypin.

(Tomcat - restore-vbs ei pysty tekemään mitään)

Tämä pitää ajaa silloin kun tomcat ei ole päällä.

wsdl4j-1.5.1.jar org.apache.axis.client.AdminClient deploy.wsdd Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/client/AdminClient

Tämä taas johtuu siitä ettei ole ajanut komentoa \\win.hut.fi\gen\courses\AS\75\3600\general\SetupAxis.bat .

Fault - Could not find class for the service named: fi.seco.courses.sws.example.CurrencyExchangeRateService Hint: you may need to copy your class files/tree into the right location (which depends on the servlet system you are using).; nested exception is: java.lang.ClassNotFoundException: fi.seco.courses.sws.example.CurrencyExchangeRateService

Ja tämä siitä ettei c:\programs\axis\webapp\axis\WEB-INF\lib-hakemistoon ole kopioitu esimerkin jar-tiedostoa, se on luotu jossain muussa hakemistossa kuin src tai mahdollisesti myös siitä ettei Tomcatia ole käynnistetty uudestaan.

Kurssin harjoitustyö

Kurssin pääharjoitusehtävänä on suunnitella jälleenmyyjäpalvelu, joka kytkeytyy Amazon.comin kirjakauppawebpalveluun ja myy tuotteita eteenpäin pienellä provikalla käyttäen hyväksi kolmannen osapuolen pankkiwebpalvelua.

1. harjoituskerta 5.10.

  1. Harjoitustyöympäristöön tutustuminen
  2. Valmiin esimerkkiwebpalvelun pystytys ja kutsuminen
  3. Amazon.comin hakuwebpalvelun kutsuminen testiasiakkaalla
  4. Amazon.comin ja testiasiakkaan välisen kommunikaation seuraaminen

Tarkemmat ohjeet

HUOM: vaikka ensimmäisen harjoituksen voi suorittaa käytännössä vain kopioimalla komentorivejä, olennaista on ymmärtää mitä missäkin kohdassa tehdään. Siis kysy erityisesti siitä, jos et ymmärrä.

Asenna esimerkkiwebpalvelu (kopioi itsellesi hakemistosta \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-server) paikalliseen Tomcatiin. Kohta kohdalta ohjeet Toiminta 1:n kohdalla.

Kopioi itsellesi myös hakemisto \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-client. Luo edellisessä kohdassa asentamastasi esimerkkisovelluksesta client-edustajaluokat hakemistoon src wsdl2javalla. Kutsu palvelu-sovellusta client-sovelluksella. Kohta kohdalta ohjeet Toiminta 2:n kohdalla.

Kopioi itsellesi hakemisto \\win.hut.fi\gen\courses\AS\75\3600\general\sws-example-amazon-test-client. Luo client-edustajaluokat hakemistoon src komennolla "wsdl2java -p fi.seco.courses.sws.example.gen http://soap.amazon.com/schemas2/AmazonWebServices.wsdl". Kokeile Amazonin web-palvelun kutsumista annetulla client-sovelluksella. Pystytä tcpmon asetuksilla Listen Port = 8888, Target hostname = soap.amazon.com ja Target port = 80, ja muuta asiakasta niin että locatorista saadaan monitorin läpi kulkeva versio palvelusta: service = locator.getAmazonSearchPort(new URL("http://localhost:8888/onca/soap2")); (Lisäksi joudut muuttamaan java-koodin "throws ServiceException, RemoteException" muotoon "throws ServiceException, RemoteException, MalformedURLException" ja lisätä import-lauseet "import java.net.URL;" ja "import java.net.MalformedURLException". Ruksaa tcpmonista kohta XML Format ja aja asiakas. Katsele SOAP-viestien sisältöä.

12.10. mennessä

Suunnittele toimijoiden (jälleenmyyjäpalvelun, Amazon.comin webpalvelun, maksupalvelun ja käyttäjän) välisen keskustelun kulku ja kussakin vaiheessa välitettävät tietoalkiot. Amazon.comin webpalvelu on tietysti valmiina, mutta muut keskustelun osakkaat (jälleenmyyjäpalvelu, maksupalvelu, käyttäjä) sinun täytyy suunnitella itse.

Vinkki: mieti miten prosessi etenee, mitkä toimijat missäkin vaiheessa keskustelevat toistensa kanssa, mikä on missäkin vaiheessa kunkin toimijan rooli, ja mitä tietoa tämän pitää kumppanilleen tuossa prosessin vaiheessa välittää.

Käytännössä mahdollisia prosessikulkuja on kaksi, eroten siinä miten maksuliikenne pankkipalvelun suhteen hoidetaan. Yritä keksiä kumpikin, ja vertaile niitä.

Jotta harjoitustyö olisi mielekäs (ja pääset siitä läpi) sinulla tulisi olla ainakin tiedot kirjoista, tilauksesta ja maksutapahtumasta. Rohkeat voivat tehdä laajemmankin sovelluksen. Kirjassa tulisi olla tilattavan tuotteen nimi ja hinta. Maksutapahtumassa tulisi ilmetä kokonaishinta, joka lasketaan kirjojen hinnasta sekä joitain muita tietoja, kuten maksajan nimi, luottokortin numero jne. Suunnittele tietomalli vapaavalintaisella menetelmällä, esimerkiksi käyttämällä UML:n luokkakaavioita. Suunnitelmasta tulisi käydä ilmi tietotyypit attribuuteille ja luokkakuvaukset metodeineen. Muista tukiluennolla annetut suunnitteluvinkit tietotyyppien ja listojen osalta, sekä bean spesifikaation vaatimukset getter ja setter metodien osalta.

Suunnittele lisäksi palvelukuvausten rajapinnat. Minkälaisia palveluita tarvitset, jotta tilaus ja maksaminen onnistuu ja kuvaa myös nämä. Käytännössä kannattaa tehdä jokaiselle erilliselle palvelulle metodeista koostuva rajapinta ja määritellä metodit ja niiden parametrit sekä palautusarvot. Ota huomioon että palvelut ovat tilattomia, eli et voi säilöä palvelinpäässä sessiotietoa. Täten palveluille tulisi voida kerralla lähettää kaikki sen tarvitsema tieto.

Kurssityössä ei tarvitse huolehtia transaktioihin tai tietoturvaan liittyvistä tiedon eheysperiaatteiden toteutumisesta, joten voit halutessasi tehdä myös useita palvelukutsuja vaativan palvelurajapinnan.

Tässä vaiheessa luokkia tai palvelurajapintoja ei kannata vielä toteuttaa eikä tehdä näistä webpalveluita, vain suunnitella ne! Tee suunnitelmasta pieni dokumentti (1-2 sivua) ja tuo se mukanasi seuraaviin harjoituksiin. Suunnitelmasta tulee käydä ilmi ainakin seuraavat asiat: (1) kommunikaatioprosessi eli kuka kutsuu mitä palvelua missäkin vaiheessa, (2) siirrettävät tietorakenteet kussakin vaiheessa ja (3) palveluiden rajapinnat.

Huomioitavaa: 1. Käytämme Amazon-yhteyksiin Amazonin vanhaa rajapintaa, kahdesta syystä: koska se on nykyistä yksinkertaisempi, ja koska siitä ei ole enää dokumentaatiota saatavilla. Teidän on siis syytä kaivaa tarvittavat tiedot WSDL-kuvauksesta (jonka "pitäisi" riittää) ja esimerkistä. 2. Tarkoitus ei siis ole oikeasti tilata mitään Amazonista asti, vaan tilauksen ja maksun välittäminen Amazonille on syytä jättää pois toiminnallisuudesta, tyytyen vain kuittaamaan tilaajalle että tilaus on ok.

15.11. mennessä

Toteuta mahdollisesti suunnitelmaasi saamat korjausehdotukset. Kun suunnitelma on mielestäsi (ja ohjaajien mielestä) riittävän tarkka ja siinä on otettu huomioon mm. harjoitustyön tukiluennolla esiin tuodut asiat, voit toteuttaa palvelusi. Toteuta suunnittelemasi tietorakenteet, rajapinnat ja palveluluokka. Kirjoita asiakas ja testaa, että palvelu toimii. Joudut demoamaan tämän seuraavassa harjoituksessa.

29.11. mennessä

Toteuttamasi palvelun semantisoimiseen liittyvä kolmikohtainen lisätehtävä, joka paljastetaan myöhemmin.