XYZ: Difference between revisions
No edit summary |
|||
(27 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
==Kodutöö XML osa | ==Kodutöö XML osa == | ||
Line 10: | Line 10: | ||
Projekti failid asuvad [https://drive.google.com/ | Projekti failid asuvad [https://drive.google.com/open?id=0B1SZnPnN5D7Ab1BCM2I2RlBqUWc&authuser=0 siin] (esitatud 15.02.2015) | ||
== Reisiportaali XML andmefail== | === Reisiportaali XML andmefail=== | ||
<pre> | <pre> | ||
<?xml version="1.0" encoding="utf-8" ?> | <?xml version="1.0" encoding="utf-8" ?> | ||
<reisipakkumised xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | <reisipakkumised xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:noNamespaceSchemaLocation="Reisipakkumised_skeem.xsd" | xsi:noNamespaceSchemaLocation="Reisipakkumised_skeem.xsd" | ||
kehtib_kuni=" | kehtib_kuni="2015-12-31" keel="ee"> | ||
<kontinendid> | <kontinendid> | ||
Line 30: | Line 30: | ||
<reis soodus_hind="true" vabu_kohti_reisil="20" reisID="1"> | <reis soodus_hind="true" vabu_kohti_reisil="20" reisID="1"> | ||
<sihtkoht>Pariis</sihtkoht> | <sihtkoht>Pariis</sihtkoht> | ||
<algus_kuupäev> | <algus_kuupäev>2015-05-01</algus_kuupäev> | ||
<lõpp_kuupäev> | <lõpp_kuupäev>2015-05-15</lõpp_kuupäev> | ||
<hind>500</hind> | <hind>500</hind> | ||
<lühikirjeldus><![CDATA[Külasta Pariisi | <lühikirjeldus><![CDATA[Külasta Pariisi kevadel]]></lühikirjeldus> | ||
<kirjeldus> | <kirjeldus> | ||
<![CDATA[ | <![CDATA[Tänapäeval on Pariis üks maailma juhtivatest äri- ja kultuurikeskustest.]]> | ||
</kirjeldus> | </kirjeldus> | ||
<url><![CDATA[http://en.wikipedia.org/wiki/Paris]]></url> | <url><![CDATA[http://en.wikipedia.org/wiki/Paris]]></url> | ||
Line 42: | Line 41: | ||
<reis soodus_hind="false" vabu_kohti_reisil="4" reisID="2"> | <reis soodus_hind="false" vabu_kohti_reisil="4" reisID="2"> | ||
<sihtkoht>Amsterdam</sihtkoht> | <sihtkoht>Amsterdam</sihtkoht> | ||
<algus_kuupäev> | <algus_kuupäev>2015-09-17</algus_kuupäev> | ||
<lõpp_kuupäev> | <lõpp_kuupäev>2015-09-20</lõpp_kuupäev> | ||
<hind>700</hind> | <hind>700</hind> | ||
<lühikirjeldus><![CDATA[Amsterdami punased laternad]]></lühikirjeldus> | <lühikirjeldus><![CDATA[Amsterdami punased laternad]]></lühikirjeldus> | ||
<kirjeldus><![CDATA[Amsterdam pulbitseb elust ja on ka üllatavalt vaikne | <kirjeldus><![CDATA[Amsterdam pulbitseb elust ja on ka üllatavalt vaikne, eksootiline ja tolerantne. Pidevate muutuste eest hoolitsevad vaid aastaajad, mis näivad seal eriliselt silma paistvat.]]></kirjeldus> | ||
<url><![CDATA[http://en.wikipedia.org/wiki/Amsterdam]]></url> | <url><![CDATA[http://en.wikipedia.org/wiki/Amsterdam]]></url> | ||
</reis> | </reis> | ||
</reisid> | </reisid> | ||
</kontinent> | </kontinent> | ||
<kontinent kontinentID="2"> | <kontinent kontinentID="2"> | ||
<nimi>Aasia</nimi> | <nimi>Aasia</nimi> | ||
Line 64: | Line 63: | ||
<lühikirjeldus><![CDATA[Tokyo ringreis]]></lühikirjeldus> | <lühikirjeldus><![CDATA[Tokyo ringreis]]></lühikirjeldus> | ||
<kirjeldus><![CDATA[Tokyo südameks on keisririigile kohaselt 19. sajandist pärinev imperaatoriloss. Lossile pääseb ligi vaid kahel päeval aastas: 2. jaanuaril ning 23. detsembril (viimane on keisri sünnipäev). Lossist edelas asub valitsusasutuste ja luksuslike restoranide poolest huvi pakkuv Akasaka piirkond, sealt ida suunas Ginza- paik, mis on maailmakuulus eksklusiivsete kaupluste ning ohtra meelelahutuse poolest. Akasakast lõuna suunda jääv Roppongi on aga linna kosmopoliitsem piirkond, kus keeb tormiline ööelu ja mis meelitab kohale väga kirju seltskonna (sealhulgas küll ka kriminaalse).]]></kirjeldus> | <kirjeldus><![CDATA[Tokyo südameks on keisririigile kohaselt 19. sajandist pärinev imperaatoriloss. Lossile pääseb ligi vaid kahel päeval aastas: 2. jaanuaril ning 23. detsembril (viimane on keisri sünnipäev). Lossist edelas asub valitsusasutuste ja luksuslike restoranide poolest huvi pakkuv Akasaka piirkond, sealt ida suunas Ginza- paik, mis on maailmakuulus eksklusiivsete kaupluste ning ohtra meelelahutuse poolest. Akasakast lõuna suunda jääv Roppongi on aga linna kosmopoliitsem piirkond, kus keeb tormiline ööelu ja mis meelitab kohale väga kirju seltskonna (sealhulgas küll ka kriminaalse).]]></kirjeldus> | ||
<url><![CDATA[http://en.wikipedia.org/wiki/ | <url><![CDATA[http://en.wikipedia.org/wiki/Tokyo]]></url> | ||
</reis> | </reis> | ||
</reisid> | </reisid> | ||
Line 70: | Line 69: | ||
<kontinent kontinentID="3"> | <kontinent kontinentID="3"> | ||
<nimi>Lõuna-Ameerika</nimi> | <nimi>Lõuna-Ameerika</nimi> | ||
<kirjeldus><![CDATA[Lõuna-Ameerika moodustab 3.5% maakera pinnast.]]></kirjeldus> | <kirjeldus><![CDATA[Lõuna-Ameerika moodustab 3.5% maakera pinnast.]]></kirjeldus> | ||
<url><![CDATA[http://en.wikipedia.org/wiki/South_America]]></url> | <url><![CDATA[http://en.wikipedia.org/wiki/South_America]]></url> | ||
</kontinent> | </kontinent> | ||
</kontinendid> | </kontinendid> | ||
<valuutad> | <valuutad> | ||
<valuuta nimi="USD">1.3871</valuuta> | <valuuta nimi="USD">1.3871</valuuta> | ||
Line 85: | Line 84: | ||
</pre> | </pre> | ||
===XML skeemifailid jaotatud nimeruumidesse === | ===XML skeemifailid jaotatud nimeruumidesse === | ||
''' | '''Reisipakkumised_skeem.xsd''' | ||
<pre> | <pre> | ||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<xs:schema | <xs:schema | ||
xmlns:reis="reis_nimeruum" | xmlns:reis="reis_nimeruum" | ||
xmlns:ty="ühised_tüübid_nimeruum" | xmlns:ty="ühised_tüübid_nimeruum" | ||
Line 98: | Line 96: | ||
xmlns:xs="http://www.w3.org/2001/XMLSchema"> | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
<xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> | <xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> | ||
<xs:import schemaLocation="Reisi_skeem.xsd" namespace="reis_nimeruum"/> | <xs:import schemaLocation="Reisi_skeem.xsd" namespace="reis_nimeruum"/> | ||
<xs:import schemaLocation="Valuutad_skeem.xsd" namespace="valuuta_kursid_nimeruum"/> | <xs:import schemaLocation="Valuutad_skeem.xsd" namespace="valuuta_kursid_nimeruum"/> | ||
<xs:element name="reisipakkumised"> | <xs:element name="reisipakkumised"> | ||
<xs:complexType> | <xs:complexType> | ||
<xs:sequence> | <xs:sequence> | ||
Line 111: | Line 109: | ||
<xs:complexType> | <xs:complexType> | ||
<xs:sequence> | <xs:sequence> | ||
<xs:element name="nimi" type="ty:ainult_üks_sõna_tüüp" /> | <xs:element name="nimi" type="ty:ainult_üks_sõna_tüüp" /> | ||
<xs:element name="kirjeldus" type="ty:üks_kuni_viisteist_sõna_tüüp"/> | <xs:element name="kirjeldus" type="ty:üks_kuni_viisteist_sõna_tüüp"/> | ||
<xs:element name="url" type="ty:wiki_url_tüüp" /> | <xs:element name="url" type="ty:wiki_url_tüüp" /> | ||
<xs:element minOccurs="0" name="reisid"> | <xs:element minOccurs="0" name="reisid"> | ||
<xs:complexType> | <xs:complexType> | ||
<xs:sequence> | <xs:sequence> | ||
<xs:element maxOccurs="unbounded" name="reis" type="reis:reisi_andmed_tüüp"/> | <xs:element maxOccurs="unbounded" name="reis" type="reis:reisi_andmed_tüüp"/> | ||
</xs:sequence> | </xs:sequence> | ||
</xs:complexType> | </xs:complexType> | ||
</xs:element> | </xs:element> | ||
</xs:sequence> | </xs:sequence> | ||
<xs:attribute name="kontinentID" type="xs: | <xs:attribute name="kontinentID" type="xs:unsignedInt" use="required"/> | ||
</xs:complexType> | </xs:complexType> | ||
</xs:element> | </xs:element> | ||
Line 130: | Line 128: | ||
</xs:complexType> | </xs:complexType> | ||
</xs:element> | </xs:element> | ||
<xs:element name="valuutad"> | <xs:element name="valuutad"> | ||
<xs:complexType> | <xs:complexType> | ||
Line 138: | Line 136: | ||
</xs:complexType> | </xs:complexType> | ||
</xs:element> | </xs:element> | ||
</xs:sequence> | </xs:sequence> | ||
<xs:attribute name="kehtib_kuni" type="xs:date" use="required" /> | <xs:attribute name="kehtib_kuni" type="xs:date" use="required" /> | ||
Line 148: | Line 146: | ||
</xs:simpleType> | </xs:simpleType> | ||
</xs:attribute> | </xs:attribute> | ||
</xs:complexType> | </xs:complexType> | ||
</xs:element> | </xs:element> | ||
</xs:schema> | </xs:schema> | ||
Line 181: | Line 179: | ||
</xs:attribute> | </xs:attribute> | ||
<xs:attribute name="soodus_hind" type="xs:boolean" use="optional"/> | <xs:attribute name="soodus_hind" type="xs:boolean" use="optional"/> | ||
<xs:attribute name="reisID" type="xs: | <xs:attribute name="reisID" type="xs:unsignedInt" use="required"/> | ||
</xs:complexType> | </xs:complexType> | ||
Line 192: | Line 190: | ||
<pre> | <pre> | ||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<xs:schema targetNamespace="valuuta_kursid_nimeruum" | <xs:schema targetNamespace="valuuta_kursid_nimeruum" | ||
xmlns:ty="ühised_tüübid_nimeruum" | xmlns:ty="ühised_tüübid_nimeruum" | ||
xmlns:xs="http://www.w3.org/2001/XMLSchema"> | xmlns:xs="http://www.w3.org/2001/XMLSchema"> | ||
<xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> | <xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> | ||
<xs:complexType name="valuuta"> | <xs:complexType name="valuuta"> | ||
<xs:simpleContent> | <xs:simpleContent> | ||
Line 228: | Line 226: | ||
<xs:restriction base="xs:decimal"> | <xs:restriction base="xs:decimal"> | ||
<xs:minExclusive value="0"/> | <xs:minExclusive value="0"/> | ||
<xs:fractionDigits value="4"/> | <xs:fractionDigits value="4"/> | ||
</xs:restriction> | </xs:restriction> | ||
</xs:simpleType> | </xs:simpleType> | ||
<xs:simpleType name="positiivne_täisarv_tüüp"> | |||
<xs:restriction base="xs:unsignedByte"> | <xs:restriction base="xs:unsignedByte"> | ||
</xs:restriction> | </xs:restriction> | ||
</xs:simpleType> | </xs:simpleType> | ||
<xs:simpleType name="wiki_url_tüüp"> | <xs:simpleType name="wiki_url_tüüp"> | ||
Line 262: | Line 260: | ||
</xs:restriction> | </xs:restriction> | ||
</xs:simpleType> | </xs:simpleType> | ||
<xs:simpleType name="üks_kuni_viisteist_sõna_tüüp"> | <xs:simpleType name="üks_kuni_viisteist_sõna_tüüp"> | ||
<xs:restriction base="xs:string"> | <xs:restriction base="xs:string"> | ||
Line 269: | Line 267: | ||
</xs:restriction> | </xs:restriction> | ||
</xs:simpleType> | </xs:simpleType> | ||
</xs:schema> | </xs:schema> | ||
</pre> | </pre> | ||
Line 276: | Line 274: | ||
===XSLT töötlused === | ===XSLT töötlused === | ||
'''Reisipakkumiste info näidatakse tabelitena''' | '''Reisipakkumiste info näidatakse tabelitena (Reisipakkumised_töötlus.xslt)''' | ||
<pre> | <pre> | ||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<xsl:stylesheet version="2.0" | <xsl:stylesheet version="2.0" | ||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
xmlns:msxsl="urn:schemas-microsoft-com:xslt" | xmlns:msxsl="urn:schemas-microsoft-com:xslt" | ||
exclude-result-prefixes="msxsl"> | exclude-result-prefixes="msxsl"> | ||
<xsl:output method="html" indent="yes"/> | |||
<xsl:template match="/"> | |||
<html> | |||
<head> | |||
<title>Reiside andmed html kujul</title> | |||
</head> | |||
</html> | |||
<body> | |||
<h1> | |||
Reisipakkumiste info seisuga: | |||
<xsl:value-of select ="reisipakkumised/@kehtib_kuni"/> | |||
</h1> | |||
<br/> | |||
<ul> | |||
<xsl:for-each select ="reisipakkumised/kontinendid/kontinent"> | |||
<li> | |||
<xsl:value-of select="nimi"/> | <xsl:value-of select="nimi"/> | ||
<xsl:if test="count(reisid/reis) > 0"> | |||
<table border ="1"> | <table border ="1"> | ||
<tr> | <tr> | ||
Line 312: | Line 312: | ||
<th>Reisi hind EUR</th> | <th>Reisi hind EUR</th> | ||
</tr> | </tr> | ||
<xsl:for-each select="reisid/reis"> | |||
<xsl:variable name="hind_eur" select="hind"></xsl:variable> | |||
<tr> | <tr> | ||
<td> | <td> | ||
Line 331: | Line 331: | ||
<td> | <td> | ||
<xsl:value-of select="hind"/> | <xsl:value-of select="hind"/> | ||
</td> | </td> | ||
</tr> | </tr> | ||
</xsl:for-each> | </xsl:for-each> | ||
</table> | </table> | ||
<br/> | <br/> | ||
</xsl:if> | |||
<xsl:if test="count(reisid/reis)=0"> | |||
<br/> | |||
Reisid puuduvad. | |||
<br/> | |||
</xsl:if> | |||
</li> | |||
</xsl:for-each> | |||
</ul> | |||
<br/> | |||
Kõikide reiside arv kokku: <xsl:value-of select ="count(reisipakkumised/kontinendid/kontinent/reisid/reis)"/> | |||
</body> | |||
</xsl:template> | |||
</xsl:stylesheet> | </xsl:stylesheet> | ||
Line 360: | Line 360: | ||
''' | '''Reiside hinnad arvutatakse valuutakursside lõikes (Reiside_hinnad_valuutakursside_lõikes.xslt) ''' | ||
<pre> | <pre> | ||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> | xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> | ||
<xsl:output method="html" indent="yes"/> | |||
<xsl:template match="/"> | |||
<html> | |||
<head> | |||
<title>Reiside hinnad teisendatuna erinevatesse valuutadesse</title> | |||
</head> | |||
</html> | |||
<body> | |||
<h1>Reiside hinnakiri valuutade lõikes:</h1> | |||
<table border ="1"> | |||
<tr bgcolor="#9acd32"> | |||
<th>Reis</th> | |||
<th> | <th>EUR</th> | ||
<xsl:for-each select="reisipakkumised/valuutad/valuuta"> | <xsl:for-each select="reisipakkumised/valuutad/valuuta"> | ||
< | <th> | ||
<xsl:value-of select=" | <xsl:value-of select="@nimi"/> | ||
</ | </th> | ||
</xsl:for-each> | |||
</tr> | |||
<xsl:for-each select="reisipakkumised/kontinendid/kontinent/reisid/reis"> | |||
<xsl:variable name="hind_eur" select="hind"></xsl:variable> | |||
<tr> | |||
<td> | |||
<xsl:value-of select="sihtkoht"/> | |||
</td> | |||
<td> | |||
<xsl:value-of select="hind"/> | |||
</td> | |||
<xsl:for-each select="/reisipakkumised/valuutad/valuuta"> | |||
<xsl:variable name="valuuta_kurss" select="."></xsl:variable> | |||
<td> | |||
<xsl:value-of select="number($hind_eur) * number($valuuta_kurss)"/> | |||
</td> | |||
</xsl:for-each> | </xsl:for-each> | ||
</tr> | </tr> | ||
</xsl:for-each> | |||
</table> | |||
</body> | |||
</xsl:template> | |||
</xsl:stylesheet> | </xsl:stylesheet> | ||
</pre> | </pre> | ||
==Veebiteenus ja klientrakendus == | |||
'''Analüüs | |||
Projekti failid asuvad [https://drive.google.com/open?id=0B1SZnPnN5D7AfmpuSTlJVDdWR1hTZ0x2bGtkeWI4cEhDRlpxVTQwNldYSmh1ajNXdV9TeXM&authuser=0 siin] | |||
Eesmärgiks oli luua rakendus finantsaegridade - näiteks aktsiahinnad, toorainete hinnad- kuvamiseks ja haldamiseks. Aine programmis oli täiendavataks nõudeks esitatud kasutajate haldamine ja kasutuse statistika kogumine. Andmebaasis on kokku 9 olemit, lisaks veel paar tabelit, kasutajate haldamiseks, mis olid süsteemi poolt tekitatud. | |||
Andmebaasi ülesehitus lähtub sellest, et aegridu saaks hoida nn. puustruktuuris. Veebiteenuses on puustruktuuri haldamiseks abstraktne klass „TreeItem“. Tabelite päriluse realiseerimiseks teostati ’self join’ . „TreeItem“ klassist pärinevad omakorda puustruktuuri konkreetsed klassid „RootItem“, „Folder“ ja „Table“. Ühes aegridade „Table“ olemis võib sisalduda üks või mitu aegrida „Series“. Iga aegrida „Series“ koosneb omakorda andmepunktidest „DataPoint“. | |||
Hierarhilisest puustruktuurist päringute tegemiseks on mitu võimalust. Proovimise käigus selgus, et kõige kiiremad päringud saaks teha kasutades rekursiivset ’stored procedure’, mida nimetatakse Common Table Expression (CTE). Samas võimaldab ka Entity Framework puustruktuurist küllaltki mugavalt päringuid teha, kuid see koormab serverit, sest puustruktuuri iga alamkataloogi laadimiseks tehakse serverisse uus päring. | |||
Oli planeeritud see, et aegridu saaks teisendada ja muuta. Planeeritud funktsionaalsus õnnestus töö käigus realiseerida ainult osaliselt. | |||
'''Veebiteenus | |||
Veebiteenus põhineb REST Web Api tehnoloogial. See võimaldab tabeleid ja aegridu SQL serverist tuua JSON formaadis, mis on esitatud „puukujuliselt“. Puu koostamiseks on LINQ Extension meetodid, mis võimaldavad leida iga puulehe ’parent’, ’children’, ’siblings’ ja ’root’ kataloogi. Repositooriumite haldus toimub „Unit of Work patten“ lähtudes. Web Api võimaldab andmebaasist tuua järgnevad andmed: | |||
1. kogu puustruktuuri, | |||
2. ühe puulehe kaupa, | |||
3. ühe konkreetse puulehe koos tema järglastega (lazy loading võimalus), | |||
4. otsida puustruktuurist sõna järgi. | |||
Web Api kasutamise eelduseks on see, et päringud tehakse Basic Authentication lähtudes. Selleks on vajalik, et päringu päisesse oleks lisatud kasutajanimi ja password encoded kujul. | |||
'''Klientrakendus | |||
Klientrakendus on ASP.NET MVC. See võimaldab puustruktuuri ja aegridu graafiliselt kujutada. Kasutajate registreerimine ja sisse logimine toimub läbi WebSceurity mooduli. Kasutajaliides põhineb kolmel kolmel JavaScript komponendil, mille autoriks on jqxWidgets.com. Puustruktuuri kuvamiseks kasutasin ’jqxTree’, aegridade omadused näitatakse ’jqxGrid’ vaates ja aegridade väärtused kuvatakse joonisel ’jqxChart’. Nende komponentide andmed saadakse Webapi veebiteenusest kasutades Ajax päringuid. Klientrakenduse planeeritud funktsionaalsust ei õnnestunud täielikult realiseerida. |
Latest revision as of 18:28, 12 June 2015
Meeskond XYZ
Meeskonna liikmed:
- Sulev Pert
Kodutöö XML osa
Projekti failid asuvad siin (esitatud 15.02.2015)
Reisiportaali XML andmefail
<?xml version="1.0" encoding="utf-8" ?> <reisipakkumised xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Reisipakkumised_skeem.xsd" kehtib_kuni="2015-12-31" keel="ee"> <kontinendid> <kontinent kontinentID="1"> <nimi>Euroopa</nimi> <kirjeldus><![CDATA[Euroopa katab 2% maakera pindalast.]]></kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/Europe"]]></url> <reisid> <reis soodus_hind="true" vabu_kohti_reisil="20" reisID="1"> <sihtkoht>Pariis</sihtkoht> <algus_kuupäev>2015-05-01</algus_kuupäev> <lõpp_kuupäev>2015-05-15</lõpp_kuupäev> <hind>500</hind> <lühikirjeldus><![CDATA[Külasta Pariisi kevadel]]></lühikirjeldus> <kirjeldus> <![CDATA[Tänapäeval on Pariis üks maailma juhtivatest äri- ja kultuurikeskustest.]]> </kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/Paris]]></url> </reis> <reis soodus_hind="false" vabu_kohti_reisil="4" reisID="2"> <sihtkoht>Amsterdam</sihtkoht> <algus_kuupäev>2015-09-17</algus_kuupäev> <lõpp_kuupäev>2015-09-20</lõpp_kuupäev> <hind>700</hind> <lühikirjeldus><![CDATA[Amsterdami punased laternad]]></lühikirjeldus> <kirjeldus><![CDATA[Amsterdam pulbitseb elust ja on ka üllatavalt vaikne, eksootiline ja tolerantne. Pidevate muutuste eest hoolitsevad vaid aastaajad, mis näivad seal eriliselt silma paistvat.]]></kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/Amsterdam]]></url> </reis> </reisid> </kontinent> <kontinent kontinentID="2"> <nimi>Aasia</nimi> <kirjeldus><![CDATA[Aasia on maailma kõige suurem ja rahvarikkam kontinent, mis katab 8,7% maakera pindalast.]]></kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/Asia]]></url> <reisid> <reis soodus_hind="false" vabu_kohti_reisil="25" reisID="3"> <sihtkoht>Tokyo</sihtkoht> <algus_kuupäev>2015-07-25</algus_kuupäev> <lõpp_kuupäev>2015-08-17</lõpp_kuupäev> <hind>1000</hind> <lühikirjeldus><![CDATA[Tokyo ringreis]]></lühikirjeldus> <kirjeldus><![CDATA[Tokyo südameks on keisririigile kohaselt 19. sajandist pärinev imperaatoriloss. Lossile pääseb ligi vaid kahel päeval aastas: 2. jaanuaril ning 23. detsembril (viimane on keisri sünnipäev). Lossist edelas asub valitsusasutuste ja luksuslike restoranide poolest huvi pakkuv Akasaka piirkond, sealt ida suunas Ginza- paik, mis on maailmakuulus eksklusiivsete kaupluste ning ohtra meelelahutuse poolest. Akasakast lõuna suunda jääv Roppongi on aga linna kosmopoliitsem piirkond, kus keeb tormiline ööelu ja mis meelitab kohale väga kirju seltskonna (sealhulgas küll ka kriminaalse).]]></kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/Tokyo]]></url> </reis> </reisid> </kontinent> <kontinent kontinentID="3"> <nimi>Lõuna-Ameerika</nimi> <kirjeldus><![CDATA[Lõuna-Ameerika moodustab 3.5% maakera pinnast.]]></kirjeldus> <url><![CDATA[http://en.wikipedia.org/wiki/South_America]]></url> </kontinent> </kontinendid> <valuutad> <valuuta nimi="USD">1.3871</valuuta> <valuuta nimi="SEK">1.8867</valuuta> <valuuta nimi="DKK">7.4647</valuuta> </valuutad> </reisipakkumised>
XML skeemifailid jaotatud nimeruumidesse
Reisipakkumised_skeem.xsd
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:reis="reis_nimeruum" xmlns:ty="ühised_tüübid_nimeruum" xmlns:v="valuuta_kursid_nimeruum" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> <xs:import schemaLocation="Reisi_skeem.xsd" namespace="reis_nimeruum"/> <xs:import schemaLocation="Valuutad_skeem.xsd" namespace="valuuta_kursid_nimeruum"/> <xs:element name="reisipakkumised"> <xs:complexType> <xs:sequence> <xs:element name="kontinendid"> <xs:complexType> <xs:sequence> <xs:element minOccurs="1" maxOccurs="unbounded" name="kontinent"> <xs:complexType> <xs:sequence> <xs:element name="nimi" type="ty:ainult_üks_sõna_tüüp" /> <xs:element name="kirjeldus" type="ty:üks_kuni_viisteist_sõna_tüüp"/> <xs:element name="url" type="ty:wiki_url_tüüp" /> <xs:element minOccurs="0" name="reisid"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="reis" type="reis:reisi_andmed_tüüp"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="kontinentID" type="xs:unsignedInt" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="valuutad"> <xs:complexType> <xs:sequence> <xs:element name="valuuta" maxOccurs="unbounded" type="v:valuuta"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="kehtib_kuni" type="xs:date" use="required" /> <xs:attribute name="keel" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]{2}"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema>
Reisi_skeem.xsd
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="reis_nimeruum" xmlns:ty="ühised_tüübid_nimeruum" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> <xs:complexType name="reisi_andmed_tüüp"> <xs:sequence> <xs:element name="sihtkoht" type="ty:ainult_üks_sõna_tüüp"/> <xs:element name="algus_kuupäev" type="ty:kuupäev_tüüp"/> <xs:element name="lõpp_kuupäev" type="ty:kuupäev_tüüp" /> <xs:element name="hind" type="ty:positiivne_reaalarv_tüüp" /> <xs:element name="lühikirjeldus" type="ty:üks_kuni_viisteist_sõna_tüüp" /> <xs:element name="kirjeldus" type="xs:string" /> <xs:element name="url" type="ty:wiki_url_tüüp"/> </xs:sequence> <xs:attribute name="vabu_kohti_reisil" use="required"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9]{1,2}"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="soodus_hind" type="xs:boolean" use="optional"/> <xs:attribute name="reisID" type="xs:unsignedInt" use="required"/> </xs:complexType> </xs:schema>
Valuutad.xsd
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="valuuta_kursid_nimeruum" xmlns:ty="ühised_tüübid_nimeruum" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import schemaLocation="Ühised_tüübid_skeem.xsd" namespace="ühised_tüübid_nimeruum"/> <xs:complexType name="valuuta"> <xs:simpleContent> <xs:extension base="ty:positiivne_reaalarv_tüüp"> <xs:attribute name="nimi"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="USD"/> <xs:enumeration value="SEK"/> <xs:enumeration value="GBP"/> <xs:enumeration value="DKK"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:schema>
Ühised_tüübid.xsd
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="ühised_tüübid_nimeruum" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:simpleType name="positiivne_reaalarv_tüüp"> <xs:restriction base="xs:decimal"> <xs:minExclusive value="0"/> <xs:fractionDigits value="4"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="positiivne_täisarv_tüüp"> <xs:restriction base="xs:unsignedByte"> </xs:restriction> </xs:simpleType> <xs:simpleType name="wiki_url_tüüp"> <xs:restriction base="xs:anyURI"> <xs:pattern value="http://en.wikipedia.org/.*"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="kolmetäheline_valuutakurss_tüüp"> <xs:restriction base="xs:string"> <xs:pattern value="[A-Z]{3}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="kuupäev_tüüp"> <xs:restriction base="xs:date"> <xs:minInclusive value="2014-01-01"/> <xs:maxInclusive value="2020-01-01"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="ainult_üks_sõna_tüüp"> <xs:restriction base="xs:string"> <xs:pattern value="\W*(\w+\W+){0,1}\w+\W*"/> <xs:maxLength value="30"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="üks_kuni_viisteist_sõna_tüüp"> <xs:restriction base="xs:string"> <xs:pattern value="\W*(\w+\W+){0,15}\w+\W*"/> <xs:maxLength value="150"/> </xs:restriction> </xs:simpleType> </xs:schema>
XSLT töötlused
Reisipakkumiste info näidatakse tabelitena (Reisipakkumised_töötlus.xslt)
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Reiside andmed html kujul</title> </head> </html> <body> <h1> Reisipakkumiste info seisuga: <xsl:value-of select ="reisipakkumised/@kehtib_kuni"/> </h1> <br/> <ul> <xsl:for-each select ="reisipakkumised/kontinendid/kontinent"> <li> <xsl:value-of select="nimi"/> <xsl:if test="count(reisid/reis) > 0"> <table border ="1"> <tr> <th>Jrk</th> <th>Reis</th> <th>Alguse kuupäev</th> <th>Lõpp kuupäev</th> <th>Reisi hind EUR</th> </tr> <xsl:for-each select="reisid/reis"> <xsl:variable name="hind_eur" select="hind"></xsl:variable> <tr> <td> <xsl:value-of select="position()"/>. </td> <td> <xsl:value-of select="sihtkoht"/> </td> <td> <xsl:value-of select="algus_kuupäev"/> </td> <td> <xsl:value-of select="lõpp_kuupäev"/> </td> <td> <xsl:value-of select="hind"/> </td> </tr> </xsl:for-each> </table> <br/> </xsl:if> <xsl:if test="count(reisid/reis)=0"> <br/> Reisid puuduvad. <br/> </xsl:if> </li> </xsl:for-each> </ul> <br/> Kõikide reiside arv kokku: <xsl:value-of select ="count(reisipakkumised/kontinendid/kontinent/reisid/reis)"/> </body> </xsl:template> </xsl:stylesheet>
Reiside hinnad arvutatakse valuutakursside lõikes (Reiside_hinnad_valuutakursside_lõikes.xslt)
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Reiside hinnad teisendatuna erinevatesse valuutadesse</title> </head> </html> <body> <h1>Reiside hinnakiri valuutade lõikes:</h1> <table border ="1"> <tr bgcolor="#9acd32"> <th>Reis</th> <th>EUR</th> <xsl:for-each select="reisipakkumised/valuutad/valuuta"> <th> <xsl:value-of select="@nimi"/> </th> </xsl:for-each> </tr> <xsl:for-each select="reisipakkumised/kontinendid/kontinent/reisid/reis"> <xsl:variable name="hind_eur" select="hind"></xsl:variable> <tr> <td> <xsl:value-of select="sihtkoht"/> </td> <td> <xsl:value-of select="hind"/> </td> <xsl:for-each select="/reisipakkumised/valuutad/valuuta"> <xsl:variable name="valuuta_kurss" select="."></xsl:variable> <td> <xsl:value-of select="number($hind_eur) * number($valuuta_kurss)"/> </td> </xsl:for-each> </tr> </xsl:for-each> </table> </body> </xsl:template> </xsl:stylesheet>
Veebiteenus ja klientrakendus
Analüüs
Projekti failid asuvad siin
Eesmärgiks oli luua rakendus finantsaegridade - näiteks aktsiahinnad, toorainete hinnad- kuvamiseks ja haldamiseks. Aine programmis oli täiendavataks nõudeks esitatud kasutajate haldamine ja kasutuse statistika kogumine. Andmebaasis on kokku 9 olemit, lisaks veel paar tabelit, kasutajate haldamiseks, mis olid süsteemi poolt tekitatud. Andmebaasi ülesehitus lähtub sellest, et aegridu saaks hoida nn. puustruktuuris. Veebiteenuses on puustruktuuri haldamiseks abstraktne klass „TreeItem“. Tabelite päriluse realiseerimiseks teostati ’self join’ . „TreeItem“ klassist pärinevad omakorda puustruktuuri konkreetsed klassid „RootItem“, „Folder“ ja „Table“. Ühes aegridade „Table“ olemis võib sisalduda üks või mitu aegrida „Series“. Iga aegrida „Series“ koosneb omakorda andmepunktidest „DataPoint“. Hierarhilisest puustruktuurist päringute tegemiseks on mitu võimalust. Proovimise käigus selgus, et kõige kiiremad päringud saaks teha kasutades rekursiivset ’stored procedure’, mida nimetatakse Common Table Expression (CTE). Samas võimaldab ka Entity Framework puustruktuurist küllaltki mugavalt päringuid teha, kuid see koormab serverit, sest puustruktuuri iga alamkataloogi laadimiseks tehakse serverisse uus päring. Oli planeeritud see, et aegridu saaks teisendada ja muuta. Planeeritud funktsionaalsus õnnestus töö käigus realiseerida ainult osaliselt.
Veebiteenus
Veebiteenus põhineb REST Web Api tehnoloogial. See võimaldab tabeleid ja aegridu SQL serverist tuua JSON formaadis, mis on esitatud „puukujuliselt“. Puu koostamiseks on LINQ Extension meetodid, mis võimaldavad leida iga puulehe ’parent’, ’children’, ’siblings’ ja ’root’ kataloogi. Repositooriumite haldus toimub „Unit of Work patten“ lähtudes. Web Api võimaldab andmebaasist tuua järgnevad andmed: 1. kogu puustruktuuri, 2. ühe puulehe kaupa, 3. ühe konkreetse puulehe koos tema järglastega (lazy loading võimalus), 4. otsida puustruktuurist sõna järgi. Web Api kasutamise eelduseks on see, et päringud tehakse Basic Authentication lähtudes. Selleks on vajalik, et päringu päisesse oleks lisatud kasutajanimi ja password encoded kujul.
Klientrakendus
Klientrakendus on ASP.NET MVC. See võimaldab puustruktuuri ja aegridu graafiliselt kujutada. Kasutajate registreerimine ja sisse logimine toimub läbi WebSceurity mooduli. Kasutajaliides põhineb kolmel kolmel JavaScript komponendil, mille autoriks on jqxWidgets.com. Puustruktuuri kuvamiseks kasutasin ’jqxTree’, aegridade omadused näitatakse ’jqxGrid’ vaates ja aegridade väärtused kuvatakse joonisel ’jqxChart’. Nende komponentide andmed saadakse Webapi veebiteenusest kasutades Ajax päringuid. Klientrakenduse planeeritud funktsionaalsust ei õnnestunud täielikult realiseerida.