XML Ohjelmistokehityksessä 8105200 1/12 1 Yleistä 1.1 Tavoiteet Harjoitus 1: Vaatimukset Harjoitustöiden tarkoituksena on tutustuttaa harjoitustyön tekijä XML:n käsittelyn perustekniikoihin ja rajapintoihin. Harjoitustyön sovellusalueena on äänilevyjen lainauspalvelu (yksinkertainen). Harjoitustyö jakaantuu kolmeen vaiheeseen: tiedon tallennus, palvelun rakentaminen ja asiakasliittymän rakentaminen. Ensimmäisen vaiheen tavoitteena on tutustuttaa XML:n käsittelyn perusteisiin: DOM- ja SAXrajapintoihin, lyhyesti XPath:iin sekä XML-Scheman kirjoittamiseen ja käyttöön. Perustekniikoita hyödynnetään yksinkertaisen XML-pohjaisen tietovaraston luomiseen. Harjoituksen ensimmäisessä vaiheessa ei saa hyödyntää JAXB tms. työkaluja, mutta muissa harjoituksen vaiheissa saa käyttää JDK:n ja JWSDP:n tarjoamia kirjastoja haluamallaan tavalla sekä ympäristön ulkopuolisia kirjastoja. Jos opiskelija käyttää ulkopuolisia kirjastoja, ne tulee toimittaa palautusten mukana. 1.2 Versiointi Versio Tila Päiväys Tekijä Selite (muutkset, korjaukset yms.) 01.01.00 Draft 12.01.05 MM Alustava versio 2 Vaatimuserittely 2.1 Yleistä Tässä vaiheessa toteutettavalle tietovarastolla voidaan hallinnoida (mm. lisätä ja poistaa) tuotenimikkeitä, jotka on rajoitettu äänilevyihin, sekä hallinnoida tuotenimikkeiden lainausta.opiskelijalta vaaditaan, että harjoitustyön palautus sisältää toteutuksen em. toiminnoille. Täämän lisäksi tarkastuksen automatisointia varten opiskelijan tulee toteuttaa vaaditut lisärajapinnat. Tarkastuksen automatisointiympäristö (xmlohj.inspector) annetaan, mutta opiskelijan saa/tulee itse toteuttaa tarpeelliset tarkastukset. Tarkastajat lisäävät omat tarkastuksensa palautuksen jälkeen. 2.1.1 Vaatimukset 0000 Yleisasiat 0001 Harjoituksessa tulee hyödyntää DOM-, SAX- ja Xpath-rajapintoja 0002 Toteutus nimikepalvelulle (ItemManager) 0003 Toteutus lainauspalvelulle (LoanManager)
XML Ohjelmistokehityksessä 8105200 2/12 0004 Tehtävä oma toteutus xmlohj.excerciseengine-luokasta (kuvaus myöh.) 0005 Tarvittavat tiedot tallennetaan XML-tiedostoon 0006 Tarvittavat tiedot luetaan XML-tiedostoon 0007 Ohjelman luo tiedoston tarvittaessa, jos sellainen ei ole olemassa 0008 Oletustiedoston nimi olkoon warehouse.xml 0009 Ohjelman tulee varautua siihen, että oletustiedosto vaihtuu ajon aikana (katso ExcerciseEngine) 0010 Palveluiden operaatiot ovat luonteeltaan atomisia eli niitä ei keskeytetä kesken suorituksen (tarkastus on sarjallistettua eli vain yksi operaatio tapahtuu tietyllä ajanhetkellä) 0011 Palveluiden operaatiot kuvaavat yhden transaktion eli operaatioiden aiheuttamat muutokset tiedoissa tallentuvat operaation lopuksi tiedostoon. 0012 Toteutettava tarkastuksen apurajapinta Inspectors 2.1.2 Ympäristömalli Ympäristömalli kuvaa toteutettavan alijärjestelmän suhteita valmiiksi annettuihin komponentteihin. cd Harjoitus1 externals xmlohj::excerciseengine + getitemmanager() : ItemManager + getloanmanager() : LoanManager + getinspectorsview() : InspectorsView «call» «instantiate» inspector::inspector LoanManager «call» LoanManager Harjoitus1 «call» ItemManager ItemManager InspectorsView InspectorsView «call» Kuva 2.1Harjoituksen ulkoiset riippuvuudet Kuvassa 2.1 on esitetty harjoituksen peruselementit. Harjoitustyöympäristö tarjoaa Inspector-luokan sekä ExerciseEngine-luokan, joka on käytännössä vain rajapintakuvaus. Samoin rajapintakuvaukset ItemManager-, LoanManager- sekä InspectorsView-rajapinnoille annetaan. cd Package DataService xmlohj::exerciseengine + getitemmanager() : ItemManager + getloanmanager() : LoanManager + getinspectorsview() : InspectorsView ExerciseEngine1 + getitemmanager() : ItemManager + getloanmanager() : LoanManager + getinspectorsview() : InspectorsView (from xmlohj) Kuva 2.2ExersiceEngine-luokan toteuts harjoituksessa Opiskelijan tulee luoda oma ExerciseEngine1-luokka (kuva 2.2), joka osaa instantioida harjoituksen rajapinnat toteuttavan luokan (tai luokat). Harjoistus1-komponetin sisäinen toteutus on täysin kiinni opiskelijan mielikuvituksesta ja harjoituksen vaatimusten rajoitteista. 2.2 Nimikepalvelu
XML Ohjelmistokehityksessä 8105200 3/12 2.2.1 Yleistä Nimikepalvelu (ItemManager) tarjoaa mekanismin hallinnoida nimikejoukkoa. Oheisessa kuvassa (kuva 2.3) esittää rajapinnan operaatiot. cd Harj1 required externals «interface» ItemManager + add(item :Item) : void + find(identifier :String, label :String) : Collection + remove(identifier :String, label :String) : void + show() : Collection + change(identifier :String, label :String, newitem :Item) : void Kuva 2.3ItemManager-rajapinta ItemManager:in toteutukselta odotetaan tietynlaista toiminnallisuutta ja vastetta, kun rajapinnan operaatioita harjoitetaan. Seuraava kuva esittää tilanteen (ja myös järjestelmän oletetun vasteen), kun järjestelmällä ei ole yhtään tietoa tallennettuna (kuva 2.4). Muiden toimintojen virheenkäsittely on yksinkertaista ja suoraviivaista, mutta 'Adding to Empty Failed' tilassa reagointi on tilan säästämiseksi kuvattu huomaute-laatikkoon kirjoitetulla pseudokoodilla. Tila itse päättelee virheen syyn ja raportoi siitä päättelyn mukaisesti. sm ItemManager Behaviour when Empty Initial Change Empty read XML [items.count == 0] /create XML IF item.id == BAD, throw InvalidIdentifierException IF item.quantity < 0, throw InvalidCountException IF item.borrowed!= 0, throw InvalidCountException IF item == INVALID, throw InvalidItemException OTHERWISE throw FunctionAddException Change( id, label, item ) /throw ItemUnknownException Adding to Empty Failed Show Empty Show [Add == FAIL] coll := {} Idle Empty Add( item ) Add Empty /throw ItemUnknownException Remove Empty Remove( id, label ) Find( item ) coll := {} Find Empty [Add == OK] Idle Items [Remove == OK AND items.count == 0] Removing Kuva 2.4Tyhjän varaston käyttäytyminen Kun oletustiedostoa ei ole olemassa, tulee järjestelmän luoda automaattisesti tyhjä tietorakenne, jota pystytään hyödyntämään (aluksi vain lisäys on järkevä toimenpide). Kun ensimmäinen alkio on onnistuneesti lisätty siirtyy järjestelmä, siirtyy järjestelmä normaaliin tila-avaruuteen (kuva 2.5). Huomaa, että kuvan 2.5 tila-avaruuteen päästään sekä kuvan 2.4 tila-avaruudesta että käynnistyksen
XML Ohjelmistokehityksessä 8105200 4/12 sm ItemManager Behaviour IF foundcollection.count > 1, throw ItemsTooManyException IF foundcollection.count == 0, throw ItemUnknownException IF item.borrowed > 0, throw ItemBorrowedException OTHERWISE throw FunctionRemoveException Showing Error [Show == FAIL] Removing Error /throw FunctionShowException Showing [Remove == FAIL] Initial [Show == OK] /coll := Show Removing read XML [items.count > 0] Show Remove( id, label ) [Remove == OK AND items.count > 0] Add Empty [Add == OK] Idle Items [Find == FAIL] /throw FunctionFindException Find( id, label ) Finding Add( item ) [Add == OK] [Find == OK] /coll := Find Adding Error Adding [Add == FAIL] Change( id, label, newitem ) [Change == OK] Changing IF item.id == RESERVED, throw ReservedIdentifierException IF item.id == BAD, throw InvalidIdentifierException IF item.quantity < 0, throw InvalidCountException IF item.borrowed!= 0, throw InvalidCountException IF item == INVALID, throw InvalidItemException OTHERWISE throw FunctionAddException [Change == FAIL] Changing Error IF foundcollection.count > 1, throw ItemsTooManyException IF foundcollection.count == 0, throw ItemUnknownException IF olditem.borrowed > newitem.quantity, throw ItemBorrowedException OTHERWISE throw FunctionChangeException Kuva 2.5Normaalin varaston käyttäytyminen kautta. Huomattavaa on myös se, että tilakaaviot kuvaavat vain ulkoisesti havaittua toimintaa eivätkä ne ota sinällään kantaa sisäiseen toteutukseen. Ainoastaan jokaisen onnistuneen muutosoperaation (add, remove, change) jälkeen xml-tieto tulee tallentaa tiedostoon. 2.2.2 Vaatimukset 1000 Nimikepalvelu (ItemManager) Nimikepalvelu hallinnoi varastossa olevia tuotteita Lisää operaatio (add) lisää yhden nimikkeen varastoon Poista operaatio (remove) poistaa yhden nimikkeen varastosta Muuta operaatio (change) muuttaa annetun nimikkeen tietoja Etsi operaatio (find) etsii yhden tai useamman nimikkeen Näytä nimikkeet operaatio (show) laistaa kaikki nimikkeet 1100 Lisää operaatio (add) Operaatiolla lisätään yksi nimike varastoon item: Varastoon lisättävän uudent tuotteen tiedot. Item item Varastoon ei voida lisätä nimikettä, jolla on sama tunniste kuin jo varastossa olevalla nimikkeellä (ReservedIdentifierException). Varastoon ei voida lisätä tyhjää tai muuten viallista nimikettä (InvalidItemException). Tunnisteen pitää olla oikean muotoinen (InvalidIdentifierException). Nimikkeen lukumäärä voi olla 0 tai positiivinen lukumäärä (lkm < 0; InvalidCountException). Lisättäessä nimikkeen lainausmäärä nollataan (eli ei yhtään lainassa). Muutoin huomaustus (InvalidCountException). Jos lisää-toiminto jostain muusta syystä toimii virheellisesti, asiasta huomautetaan (FunctionAddException). Onnistuneen lisäyksen jälkeen tulee muuttunut tietovarasto tallentaa Toteutusehdotus: DOM ratkaisu 1100 Poista operaatio (remove)
XML Ohjelmistokehityksessä 8105200 5/12 Operaatio poistaa annetun nimikkeen varastosta. String identifier String label identifier: Poistettavan tuotteen tunniste label: Poistettavan tuotteen nimi Poistettavasta nimikkeestä annetaan tunnistukseen nimi (label) ja/tai tunniste (identifier). Nimi ja tunniste voidaan kuvata myös villimerkkejä.* (mikä tahansa merkkijono) tai. (mikä tahansa yksi merkki) (java.util.regex) Poisto ei onnistu, jos nimikettä ei löydy (ItemUnknowException) Poisto ei onnistu, jos nimikkeitä löytyy useampi kuin yksi (ItemsTooManyException) Poisto ei onnistu, jos nimike on lainassa (ItemLoanedException) Jos poista-toiminto jostain syystä toimii virheellisesti, asiasta huomautetaan (FunctionRemoveException) Onnistuneen poiston jälkeen tulee muuttunut tietovarasto tallentaa Toteutusehdotus: DOM ratkaisu 1200 Muuta operaatio (change) Operaatio korvaa vanhan tuotteen tiedot uuden tuotteen tiedoilla. String identifier String label Item newitem identifier: Muutettavan tuotteen tunniste label: Muutettavan tuotteen nimi newitem: Tuotteen uudet tiedot. Tyhjä kenttä tarkoittaa, että tieto on kopioitava vanhasta. Vanha tuote tunnistetaan samoilla säännöillä kuin poistossakin. Muutettaessa kaikki vanhan (löydetyn) nimikkeen tiedot, paitsi tunniste, korvautuvat uuden nimikkeen annetuilla tiedoilla. Vain ne tiedot, jotka on uudessa nimikkeessä annettu korvaantuvat. Tieto, jota ei muuteta jätetään tyhjäksi (merkkijono) tai negatiiviseksi (numero). Lainaustietoa (borrowed) ei saa muuttaa. Lukumäärää saa muuttaa, mutta lukumäärän pitää olla vähintään lainattujen nimikkeiden määrä. (InvalidCountException). Jos vanhan nimikkeen tiedoilla löytyy useampi kuin yksi vanha nimike, ei muokkausta toteuteta (ItemsTooManyException). Jos vanhaa nimikettä ei löydy ollenkaan, ei muokkausta voida suorittaa (ItemUnknownException). Tunnisteen pitää olla oikean muotoinen (InvalidIdentifierException). Jos muokkaa-toiminto jostain syystä toimii virheellisesti, asiasta huomautetaan (FunctionChangeException). Toteutusehdotus: DOM ratkaisu 1300 Etsi operaatio (find) Etsi-toiminnossa haetaan annettua nimikettä. String identifier String label identifier: Etsittävän tuotteen tunniste label: Etsittävän tuotteen nimi Nimikettä haetaan samojen sääntöjen pohjalta kuin poista-toiminnossa. Paluutietona palautetaan nimikkejoukko (Collection), jossa on nolla tai useampi nimike. Jos jostain muusta syystä etsi-toiminto toimii virheellisesti, huomautetaan asiasta (FunctionFindException).
XML Ohjelmistokehityksessä 8105200 6/12 Toteutusehdotus: XPath ratkaisu on se mitä tavoitellaan, mutta paremman puutteessa java.util.regex:n käyttö sallitaan. XPath vaatii vähemmän koodaamista, mutta hakulauseen kirjoitus on hankalampi, RegEx-luokan käyttö vaatii huomattavasti enemmän koodaamista eikä hakulause ole paljoa sen helpompi kuin XPath-lausekkaan. 1400 Näytä operaatio (show) Näytä-toiminto palauttaa nimikejoukon kaikista varastossa olevista nimikkeistä. Paluutietona palautetaan nimikkejoukko (Collection), jossa on nolla tai useampi nimike. Jos toiminto jostain syystä epäonnistuu, niin asiasta huomautetaan (FunctionShowException). Toteutusehdotus: SAX ratkaisu 2.3 Lainauspalvelu 2.3.1 Yleistä Lainauspalvelu (LoanManager) tarjotaa mekanismin nimikkeiden lainaamisen hallintaan. Oheinen kuva (kuva 2.6) esittää LoanManager-rajapinnan operaatioden kuvaukset. cd Harj1 required externals «interface» LoanManager + borrowitem(borrower :String, itemid :String) : void + returnitem(borrower :String, itemid :String) : void + findloan(borrower :String, itemid :String) : Collection + showloans() : Collection Kuva 2.6 LoanManager-rajapinta LoanManager-rajapinnan toteutuksen tulee kyetä luomaan nimikkeen lainaus sekä suorittamaan nimikkeen palautus. Tämän lisäksi lainauksen hallinnalla voidaan etsiä lainoja ja näyttää kaikki lainat. Oheinen kuva (kuva 2.7) esittää käyttäytymistä, kun lainoja ei ole vielä yhtään tehty. Oheinen kaavio olettaa, että lainoja ei ole alussa yhtään. Kaaviossa ei oteta suoranaisesti kantaa siihen, onko yhtään nimikettä lainattavaksi. Tällöin vain ilmoitetaan, ettei lainattavaa nimikettä löytynyt. Kun nimikkeitä ilmestyy lainattavaksi voidaan kaaviosta siirtyä normaaliin tilakaavioon. Normaalista tilakaaviosta voidaan palata tyhjien lainojen kaavioon silloin, kun viimeinen laina on poistettu järjestelmästä.
XML Ohjelmistokehityksessä 8105200 7/12 sm LoanManager Behaviour when no loans Initial read XML [loans.count == 0] /create XML No Loans Borrow( name, id ) Borrowing the first [Borrow == OK] Idle Loans [Borrow == FAIL] Borrow Error IF items.find( id ) == NO_FOUND, throw ItemUnknownException OTHERWISE throw FunctionBorrowException [ReturnLoan == OK AND loans.count == 0] Returning Loan Kuva 2.7 Käyttäytyminen, kun ei ole vielä yhtään lainaa tehty sm LoanManager Behaviour Initial [FindLoan == FAIL] /throw FunctionFindLoanException Finding loans read XML [loans.count > 0] FindLoan( name, id ) Borrowing the first Borrowing Error [Borrow == OK] Borrow( name, id ) Idle Loans [FindLoan == OK] /coll := FindLoan Show [Show == OK] /coll := Show Showing Loans [ShowLoan == FAIL] /throw FunctionShowLoanException ReturnLoan( name, id ) [Borrow == FAIL] [Borrow == OK] Borrowing [ReturnLoan == OK AND loans.count > 0] IF find( id ) == NO_FOUND, throw ItemUnknownException IF founditem.quantity == founditem.borrowed, throw TooManyLoansException IF loans.find( name AND id ) > 0, throw DublicateLoanException OTHERWISE throw FunctionBorrowException Returning Error Returning Loan IF find( id ) == NO_FOUND, throw ItemUnknownException IF founditem.quantity == founditem.borrowed, throw TooManyLoansException IF founditem.borrowed == 0, throw LoanUnknownException IF loans.find( name AND id ) == 0, throw LoanUnknownException OTHERWISE throw FunctionReturnLoanException Kuva 2.8Käyttäytyminen, kun lainoja on tehty Oheinen kuva (kuva 2.8) esittää lainojen hallinnan käyttäytymisen, kun vähintään yksi lainaus on tehty. 2.3.2 Vaatimukset 2000 Lainauspalvelu-rajapinta (LoanManager) Lainauspalvelu ylläpitää lainaustietoja Lainaa nimike (borrowitem) Palauta laina (returnloan) Etsi laina (findloan) Näytä lainat (showloans)
XML Ohjelmistokehityksessä 8105200 8/12 2100 Lainaa nimike (borrowitem) Lainaa-toiminnolla lainataan nimike (Item) jollekin henkilölle. String borrower String label borrower: Lainaajan nimi label: Lainattavan tuotteen tunniste Lainauksesta kirjataan vapaamuotoinen lainaajan nimi ja nimikkeen tunniste (identifier). Lainauksen voi suorittaa tuotteelle, joka on olemassa (ItemUnknownException, jos ei olemassa). Lainauksen voi suorittaa tuotteelle, jota ei ole lainattu varastossa olevaa määrää (TooManyLoansException, jos liian monta lainaa). Yksi lainaaja ei voi lainata samaa nimikettä useaan kertaan (DublicateLoanException, jos lainaaja on lainannut nimikkeen). Lainatessa nimikkeestä tulee antaa kokonaiset tiedot (ei villimerkkejä) Jos tulee joku muu virhe, niin siitä tulee ilmoittaa (FunctionBorrowException). 2200 Palauta laina (returnloan) Palauta-toiminnolla voidaan palauttaa laina. String borrower String label borrower: Lainaajan nimi label: Lainattavan tuotteen tunniste Annetulla lainaajan nimellä ja tuotetunnisteella löytyvä lainaus voidaan palauttaa, jos vain yksi lainaus annetuilla tiedoilla löytyy (ItemsTooManyException, jos liian monta lainausta löytyy). Villimerkkien käyttö samanlainen nimikehallinnnan poista-toiminnossa Palautusta ei voida suorittaa, jos nimike ei ole olemassa (ItemUnknownException) Palautusta ei voida suorittaa, jos nimike ei ole lainattu (LoanUnknownException). Jos tulee joku muu virhe, niin siitä tulee ilmoittaa (FunctionReturnException). 2300 Etsi laina (findloan) Etsi-toiminnolla haetaan tietyn nimikkeen tunnisteen tai nimikkeen lainaajan perusteella. String identifier String label identifier: Etsittävän tuotteen tunniste label: Etsittävän tuotteen nimi Palauttaa joukon, jossa on nolla tai useampi lainatieto. Villimerkkien käyttö samanlainen nimikehallinnnan poista-toiminnossa Jos tulee joku virhe, niin siitä tulee ilmoittaa (FunctionFindLoanException). 2400 Näytä lainat (showloans) Näytä-toiminnolla haetaan kaikki lainat. Palauttaa joukon, jossa on nolla tai useampi lainatieto. Jos tulee joku virhe, niin siitä tulee ilmoittaa (FunctionFindLoanException).
XML Ohjelmistokehityksessä 8105200 9/12 2.4 Tarkastus 3000 Tarkastuksen apuvälineet (InspectorsView ja ExcerciseEngine) cd Harj1 required externals «interface» InspectorsView + getdocument() : Document + setdocument(document :Document) : void + setfile(filename :String) : void + getfile() : String InspectorsView-rajapinta tarjoaa tarkastukselle näkymän sisäisestä maailmasta Aksessorit sisäiselle DOM-puulle (getdocument, setdocument) getdocument palauttaa nykyisen DOM-dokumentin setdocument asettaa uuden DOM-dokumentin Aksessorit xml-tiedostolle (getfilename, setfilename) getfilename palautta merkkijonona (String) voimassa olevan xml-tiedoston, johon tietoja tallennetaan setfilename asettaa merkkijonona (String) xml-tiedoston, johon tietoja tullaan jatkossa tallentamaan Asetettaessa tiedoston nimeä, sen sisältö tulee lukea saman tien saataville (eli sekvenssi iv.setfilename( file.xml ); doc = iv.getdocument(); tulee palauttaa file.xml:ää vastaava DOM-dokumentti ExcerciseEngine-luokka tarjoaa tehtaan erilaisiin palvelurajapintoihin tarkastusta varten cd Inspection tools xmlohj::exerciseengine + getitemmanager() : ItemManager + getloanmanager() : LoanManager + getinspectorsview() : InspectorsView ExerciseEngine1 + getitemmanager() : ItemManager + getloanmanager() : LoanManager + getinspectorsview() : InspectorsView Opiskelija laajentaa ExcerciseEngine-luokasta luokan ExcerciseEngine1, joka palauttaa vaaditut rajapinnat opiskelijan haluamasta luokasta (luokista) getitemmanager-operaatio palauttaa ItemManager-rajapinnan toteutuksen getloanmanager -operaatio palauttaa LoanManager-rajapinnan toteutuksen getinspectorsview-operaatio palauttaa InspectorsView-rajapinnan toteutuksen 2.5 Tietorakenteet 3500 Tietotyypit (Item, ItemType ja Loan) Tietotyypit kuvaavat ongelma-alueen tietorakenteita
XML Ohjelmistokehityksessä 8105200 10/12 cd Data Types xmlohj Item - myidentifier: String - mylabel: String - mytype: ItemType = ItemType.NONE - mylocation: String - myquantity: int = 0 - myborrowedcount: int = 0 + «create» Item() + «create» Item(identifier :String, label :String, type :ItemType, location :String) + getitem() : Item + setitem(item :Item) : void + isequal(item :Item) : boolean + isequalid(item :Item) : boolean Accessor methods for attributes are not shown i.e. getsomething and setsomething methods «enumeration» ItemType + NONE: int = 0 + MC: int = 1 + LP: int = 2 + CD: int = 3 + DVD: int = 4 - myborrower: String - myitemid: String Loan + «property get» getborrower() : String + «property get» getitemid() : String + «property set» setborrower(newval :String) : void + «property set» setitemid(newval :String) : void (from Harjoitukset) Opiskelija voi laajentaa ongelma-alueen tietorakenteita perinnän avulla, mutta perustoiminnallisuuteen ei sovi kajota Item kuvaa nimikkeen tietoja ItenType on lueteltutyyppi (enumeraatio) erilaisista nimikkeistä Loan kuvaa lainan 2.6 Tietovaatimukset 4000 Tietovaatimukset 4001 Nimiketiedot ja lainatiedot tallennetaan yhteen XML-tiedostoon XML-tiedoston esimerkki <?xml version= 1.0?> <warehouse> <storage> <item id= 123-ABZ-3 > <label>jukka Kukka</label> <type>cd</type> <location>tarja s room</location> <quantity>50</quantity> <borrowed>1</borrowed> </item> <item id= 042-QQQ-3 > <label>eino Vihree</label> <type>lp</type> <location>mika s room</location> <quantity>50</quantity> <borrowed>0</borrowed> </item> </storage> <loans> <loan> <borrower>john Doe</borrower> <itemid>123-abz-3</itemid> <loan> </loans> </warehouse> XML-tiedon muodon kuvaus XML Schema-tiedostolla (warehouse.xsd) XML-tiedon muodon oikeellisuuden tarkistaminen (validointi) XML-Schema tiedoston avulla Tuotteen (Item) tunnisteen (identifier) muoto:
XML Ohjelmistokehityksessä 8105200 11/12 identifier := manufacturer + - + itemtype + - + index manufacturer := 3 {number} 3 // numeroita tasan kolme itemtype := 1 {alpha} 3 // kirjaimia yhdestä kolmeen index := alpha number // yksi kirjain tai numero number := [0-9] alpha := [A-Z] Lainaajan nimi on merkkijono, joka on muodoltaan vapaamuotoinen Lainaajan nimi on ainakin yksi merkki. Ylärajaa ei sinällään ole, mutta vähintään 32 merkkiä pitkä nimi tulee mahtua siihen. Lainaaja ei tarvitse tunnistusta Tyhjä kenttä Item-luokassa tarkoittaa sitä, että merkkijono on tyhjä, kokonaisluku on -1 ja tyyppi on NONE. 2.7 Muita asioita 5000 Toteutus 5001 Toteutuksessa pitää käyttää Java JDK:n ja JWSDP:n tarjoamia kirjastoja Toteutuksessa saa käyttää ulkopuolisia kirjastoja Operaatiot kommentoitava: operaation tarkoitus, parametrien tarkoitus, mahdolliset poikkeukset yms. 8000 Tuotteenhallinta 8001 Harjoitus tulee rakentaa hakemistoihin seuraavalla tavalla: 123456/ opiskelijanumero build.xml päätason käännösohjaustiedosto Harjoitus1/ ensimmäisen harjoituksen hakemisto build.xml harjoituksen käännösrakentaja proj.properties configure.html/.txt projektikohtaiset ominaisuudet dokumentti, joka kertoo mitä ominaisuuksia pitää määritellä, jotta käännös ja ajo onnistuisivat src/ xmlohj/ build/ Inspector/ src/ common/ junit.jar munomajokukirjasto.jar Ulkopuoliset kirjastot pitää toimittaa palautuspaketin mukana Päätason käännösohjaustiedoston (build.xml) pitää sisältää tehtävät: 1) HARJ1 käännä ja aseta ohjelma ajokuntoon 2) AJA1 suorita harjoituksen 1 Inspector-ohjelma 3) PALAUTUS tuottaa palautuspaketin Harjoitustason käännösohjaustiedosto tulee sisältää vähintään seuraavat tehtävät: 1) build oletustehtävä, joka kääntää ja valmistelee ohjelman ajoa varten 2) run_text ajaa Inspector:in tekstitilassa 3) run_graf ajaa Inspector:in graafisena 4) clean poistetaan käännöksen aikaiset tiedostot
XML Ohjelmistokehityksessä 8105200 12/12 Konfiguraatiodokumentti, jossa kerrotaan mitä ominaisuuksia pitäisi löytyä xmlohj.properties tiedostosta sekä mitä oletetaan CLASSPATH:in ja PATH:in sisällöstä. 2.8 Palautus 9000 Palautus 9001 Palautuspaketti sisältää koko harjoitustyöhakemistopuun Palautuspaketti on jar-paketti Palautuspaketin nimi on muotoa: xmlohj_opikelijanumero_etunimisukunimi.jar