Hops
Meeskond
- Liikmed:
- Artur Hokkonen
- Margus Parts
- Hanno Sirkel
- Lauri Õunmaa
Idee
Luua 4-tasemeline XML definitsioon, näidis sellele ning transleerimised HTML ja XML formaati.
XML
XML fail
<?xml version="1.0" encoding="UTF-8"?>
<tns:autod xmlns:tns="http://www.example.org/autod" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/autod autod.xsd ">
<tns:auto id="0" mark="Ford" mudel="Sierra">
<tns:mootor>
<tns:kytus>bensiin</tns:kytus>
<tns:kubatuur yhik="ccm">2000</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="punane"/>
</tns:auto>
<tns:auto id="1" mark="ZAZ" mudel="969">
<tns:mootor>
<tns:kytus>diisel</tns:kytus>
<tns:kubatuur yhik="ccm">2500</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="roheline"/>
</tns:auto>
<tns:auto id="2" mark="Saab" mudel="9-5">
<tns:mootor>
<tns:kytus>bensiin</tns:kytus>
<tns:kubatuur yhik="ccm">1500</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="sinine"/>
</tns:auto>
<tns:auto id="3" mark="Volvo" mudel="960">
<tns:mootor>
<tns:kytus>elekter</tns:kytus>
</tns:mootor>
<tns:kere v2rv="sinine"/>
</tns:auto>
<tns:auto id="4" mark="Volvo" mudel="V40">
<tns:mootor>
<tns:kytus>diisel</tns:kytus>
<tns:kubatuur yhik="ccm">2400</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="must"/>
</tns:auto>
<tns:auto id="5" mark="Volvo" mudel="V70">
<tns:mootor>
<tns:kytus>gaas</tns:kytus>
<tns:kubatuur yhik="ccm">2000</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="valge"/>
</tns:auto>
</tns:autod>
XSD fail
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/autod"
xmlns:tns="http://www.example.org/autod"
elementFormDefault="qualified">
<simpleType name="kytusSimpleType">
<restriction base="string">
<enumeration value="bensiin"></enumeration>
<enumeration value="diisel"></enumeration>
<enumeration value="elekter"></enumeration>
</restriction>
</simpleType>
<complexType name="mootorComplexType">
<sequence>
<element name="kytus" type="tns:kytusSimpleType"
maxOccurs="1" minOccurs="0">
</element>
<element name="kubatuur" maxOccurs="1" minOccurs="0">
<complexType>
<simpleContent>
<extension base="int">
<attribute name="yhik" use="required">
<simpleType>
<restriction base="string">
<enumeration value="ccm"/>
<enumeration value="l"/>
</restriction>
</simpleType>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
<complexType name="autoComplexType">
<sequence>
<element name="mootor" type="tns:mootorComplexType"></element>
<element name="kere" type="tns:kereComplexType"
maxOccurs="1" minOccurs="1">
</element>
</sequence>
<attribute name="id" type="int"></attribute>
<attribute name="mark" type="string"></attribute>
<attribute name="mudel" type="string"></attribute>
</complexType>
<simpleType name="v2rvSimpleType">
<restriction base="string">
<enumeration value="punane"></enumeration>
<enumeration value="roheline"></enumeration>
<enumeration value="sinine"></enumeration>
</restriction>
</simpleType>
<complexType name="kereComplexType">
<attribute name="v2rv" type="tns:v2rvSimpleType"></attribute>
</complexType>
<element name="autod" type="tns:AutodListComplexType"></element>
<complexType name="AutodListComplexType">
<sequence>
<element name="auto" type="tns:autoComplexType" maxOccurs="unbounded" minOccurs="0"></element>
</sequence>
</complexType>
</schema>
XSLT failid
XML -> HTML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">
<xsl:output encoding="UTF-8" method="html" />
<xsl:template match="/">
<html>
<body>
<h2>Autode nimekiri</h2>
<table border="1">
<tr><td>Mark</td><td>Mudel</td><td>Värv</td><td>Mootor</td></tr>
<xsl:for-each select="tns:autod/tns:auto">
<tr>
<td><xsl:value-of select="@mark"/></td>
<td><xsl:value-of select="@mudel"/></td>
<td><xsl:value-of select="tns:kere/@v2rv"/></td>
<td><xsl:value-of select="tns:mootor/tns:kytus"/> <xsl:text> </xsl:text> <xsl:value-of select="tns:mootor/tns:kubatuur"/><xsl:value-of select="tns:mootor/tns:kubatuur/@yhik"/></td>
</tr>
<p> </p>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML -> XML
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<tns:autod>
<xsl:for-each select="tns:autod/tns:auto">
<xsl:if test="@mark='Volvo'">
<auto>
<mark>
<xsl:value-of select="@mark"/>
</mark>
<mudel>
<xsl:value-of select="@mudel"/>
</mudel>
</auto>
</xsl:if>
</xsl:for-each>
</tns:autod>
</xsl:template>
</xsl:stylesheet>
Veebiteenus
Tähtajaks tehtud osa ("deadline" branch):
https://github.com/onu/currency-converter/tree/deadline1
"Master" branch:
https://github.com/onu/currency-converter
Retsensioonid
XML
Meeskond Hops on loonud xml vormingus faili autode teemal. Xml failil on neli loogilist dimensiooni ning kolmel neist on kasutatud atribuute, mis on enamat, kui lihtsalt id. Lisaks xml failile on loodud ka selle skeemifail xsd vormingus. Xml vormingus olevale failile on loodud 2 xslt faili: esimene neist transformeerib andmed html vormingusse ning tulemuseks on andmetabel, kus iga auto kohta on esitatud mark, mudel värv ja mootori andmed; teine xslt fail muudab algse xml faili vormingut ning välja antakse iga auto kohta margi ja mudeli andmed. Tehtud kodutöö vastab seega väga täpselt esitatud tingimustele.
Esitatud kodutöö kood ei ole kommenteeritud. Samuti ei ole meeskonna wiki lehel ühtegi kommentaari selle kohta, mis on antud XML alamülesande teema või eesmärk. Kuna kodutöö ülesande püstituses neid otseselt nõutud ei ole, siis ei saa seda ka puuduseks lugeda. Kood on sellegipoolest loetav ja arusaadav.
Ka dokumentatsiooni ei ole antud ülesande lahendusele lisatud, aga ka see ei olnud ka nõutud kodutöö ülesande püstituses. Samas, kui see ülesanne on loogiline osa ülejäänud kursuse kodutööde komplektist, siis juba alguses dokumentatsiooniga alustamine, oleks hea tava järgimine.
Puudustena võiks märkida, et meeskonna wiki lehel võiks siiski olla väike kokkuvõte tehtud töö sisust ja eesmärgist. Kuna kood ei ole kommenteeritud ning samuti ei ole lisatud dokumentatsiooni, siis oleks võinud meeskonna wiki lehel olla iga faili juure lause või kaks selgituseks. Kuna tehtud töö eesmärk (kui välja arvata kodutöö ära tegemise fakt) on selgusetu, siis on väga raske hinnata, kas esitatud xml fail on piisav või vajaliku struktuuriga. Ka ei saa sellistes tingimustes hinnata, kas lisatud atribuudid kolmel dimensioonil on asjakohased või mitte.
Meeskond Leemur
XML'i retsensioon
XML
XML-failis on dimensioonid 1. autod 2. auto 3. mootor, kere 4. kytus. kubatuur Kokku seega 4 dimensiooni- nagu nõutud. Atribuute on kasutatud kolmel dimensioonil- jällegi nõuetele vastavalt. Tegijad ei ole põhjendanud, miks auto atribuut "mark" ei võiks olla auto all eraldi dimensioon. Sealt edasi mõeldes võiks auto atribuut "mudel"olla auto alaelement samal tasemel koos margiga.
XSD
XSD-failis on XLSi elementide puhul nõutud, et nende elemendid oleksid kindlas järjekorras kirjeldatud. See on koodi selguse ja loetavuse seisukohalt hea. Koodi vaadates torkab silma, et auto värvidest on lubatud ainult punane, roheline ja sinine. Töö kirjeldusest ei tule välja, kas see on mingi spetsiifiline taotlus ja kui on, siis miks.
XSL
HTMLi kujule teisendavas koodis tundub kõik loogiline. HTMLi kujul esitatakse tabel, kus on auto mark, mudel, kere värv ja kütuseliik. Tabeli loomisel trükitakse välja nii XMLi elementide, kui ka nende atribuutide väärtusi. XMLi formaati töötlevas XSLi failis antakse väljundisse auto mark ja mudel juhul, kui automargiks on Volvo. Ülesande nõue, XMLi töötlemine XSLi koodiga, on seega täidetud.
Kokkuvõtvalt võib öelda, et ülesande formaalsed nõuded on kõik täidetud. Meeskond võiks selgituseks kirja panna loodava rakenduse eesmärgi ja veidike kommenteerida XMLi struktuuri. Vastasel juhul jääb lihtsalt mõnest lahendusest mulje, et see ei ole päris läbi mõeldud (näiteks atribuudi asemel võiks olla eraldi element).
Meeskond TeravC
Veebiteenuse retsensioon - TeravC
Arhitektuuriline ja tehnoloogiline ülesehitus
Lahendus on vastavalt kursuse nõuetele ülesse ehitatud, eraldi seisvad projektid eri otstarbega teekidena:
- andmemudeli teegi (CurrencyModelsLibrary),
- andme ligipääsu teegi (CurrencyDAL),
- teenuse enda teostuse (ASPNETMVCService).
Kasutusel Code first Entity Framework andmeligipääsu kihis, ning ASP.NET Web API teenuste poole pealt. Visual Studio solution-failis on eraldi projektina ka WCF-rakendus (WcfService), mis stub'ina ootab tuleviku teostust.
Domeeni mudel
Andmemudel on lihtne ning selge. On, millest õppida. Meeldib mulle, et kasutusel Interface'id olemite ühtlustamiseks (IntegrityContracts). Lisaks teostatud korralik custom validator (NonNegativeDoubleAttribute).
Andmeligipääsu kiht
Andmeligipääsu kiht (DAL) teostatud nii, nagu kursusel õpetatud. Retsenseerija jaoks uudne oli lahendus, kus dependency resolver asemel kasutatakse Factory mustrit. Pisut Internetis ringi kolades, võin öelda, et Factory meetod on pigem klassikaline, ning Dependency Resolver uuemat laadi. Antud lahenduse skoobis, antud tehnikate vahe ei löö välja, aga kui projekt areneb, arvan et Factory meetod võib saada pudelikaelaks.
Kasutatud EF erinevaid sättimise võimalusi optimaalse tulemuse saamiseks andmebaasi poole pealt:
- Cascade On-Delete seadistamine (Antud võimalust otsisid taga ka retsensiooni autorid. Aitähh :) )
- Välja kommenteerituna, aga siiski. Kurikuulusatest S-idest lahti, mis iga olemi nime lõppu EF topib.
Repository poole pealt võiks välja tuua selle, et eeldatud, on et iga objekti repodel on ühesugused meetodid. Projekti edasi arenendes võib see saada pudelikaelaks.
Web API teenus
Esimese asjana märkasin ja võibolla abiks ka õppejõule, et ennem veebi käivitamist tuleb käivitada konsooli rakenduse, mis tekitab vajalikud andmed andmebaasi. Seejärel alles saab asuma WEB API testimist.
Teenusest endast
Web API teenus töötab api/currency väljastab valuutade nimekirja. Paraku ei ole meetodit, mis kehtivad valuuta vahetuse kursid väljastaks. CRUD operatsioonidest on esindatud retsensiooni kirjutamise hetkel R-Read.
Osaliselt on teostatud CurrencyController. HomeController ja ValuesController on jäänud sinna projekti templeidist.
Vaikimisi väljastab teenus andmed xml-formaadis. Kui GET päringu päisesse panna Accept "text/json", siis väljastab JSON formaadis.
TESTI KIRJELDUS 1 - Vastus XML-formaadis
HTTP päringu päis:
GET http://localhost:5189/api/currency HTTP/1.1 Host: localhost:5189 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive
HTTP vastus päringule:
HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: application/xml; charset=utf-8 Expires: -1 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcQW5kcmVcRGVza3RvcFxjdXJyZW5jeS1jb252ZXJ0ZXItbWFzdGVyXGN1cnJlbmN5LWNvbnZlcnRlci1tYXN0ZXJcQVNQTkVUTVZDU2VydmljZVxhcGlcY3VycmVuY3k=?= X-Powered-By: ASP.NET Date: Sun, 26 May 2013 14:46:47 GMT Content-Length: 483
<ArrayOfCurrency xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CurrencyModelsLibrary.Models"><Currency><Created>2013-05-26T16:07:49.987</Created><CreatorUser i:nil="true" /><CurrencyID>1</CurrencyID><IsVisible>true</IsVisible><Name>EUR</Name></Currency><Currency><Created>2013-05-26T16:07:49.99</Created><CreatorUser i:nil="true" /><CurrencyID>2</CurrencyID><IsVisible>true</IsVisible><Name>USD</Name></Currency></ArrayOfCurrency>
TESTI KIRJELDUS 2 - Vastus JSON-formaadis
HTTP päringu päise sisu:
GET http://localhost:5189/api/currency HTTP/1.1 Host: localhost:5189 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 Accept: text/json
HTTP vastus päringule:
HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: text/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcQW5kcmVcRGVza3RvcFxjdXJyZW5jeS1jb252ZXJ0ZXItbWFzdGVyXGN1cnJlbmN5LWNvbnZlcnRlci1tYXN0ZXJcQVNQTkVUTVZDU2VydmljZVxhcGlcY3VycmVuY3k=?= X-Powered-By: ASP.NET Date: Sun, 26 May 2013 14:39:57 GMT Content-Length: 292
[ { "CurrencyID": 1, "Name": "EUR", "IsVisible": true, "Created": "2013-05-26T16:07:49.987", "CreatorUser": null }, { "CurrencyID": 2, "Name": "USD", "IsVisible": true, "Created": "2013-05-26T16:07:49.99", "CreatorUser": null } ]
Logimine
Logimise jaoks oli eeldus loodud. Vajalikud koodiread failides Filters/WebAPIActionLoggingAttribute.cs ja Modules/MyModule1.cs oli välja kommenteeritud. Retsensenseeriad ei hakanud kommentaare eemaldama ning logimise osa testima.
Kasutajate audentimisest ja autoriseerimisest
Ülesandes oli nõutud kasutajate audentimist, haldamist, kasutusstastikia pidamist. Valuuta vahetuse kursi kuvamine võib olla avalik teenus, seetõttu sellel nõudel suurt praktilist rakendust pole, aga miinusena mul tuleb see välja tuua :(.
Kodeerimise stiil ja parimad praktikad
Stiil on puhas, vajalikud ja ebaselged kohad ära kommenteeritud. Ära on märgitud viited kui kasutatud weebi ja õppejõudude materjali abi. Meeldib, et lahendusele on lähenetud minimalistliku printsiibiga: Teha mustris võimalikult vähe muudatusi kui võimalik. Iga projekti Referencide nimekirja vaadates ei hakanud midagi kummalist silma, kõik on selliselt nagu peab.
Veebiteenuse retsensioon - meeskond Leemur
Retsenseerija on kasutanud testimiseks ja retsensiooni kirjutamiseks meeskonna tähtajaks tehtud osa („deadline“ branch).
1. töö vastavust esitatud tingimustele
Tehtud töö ei vasta praegu veel täielikult esitatud tingimustele, kuna kolmest alamülesandest on vaid üks realiseeritud, nimelt teenuse osa. Kasutajate tuvastamine ja haldus ning statistika osa on ei ole vähemalt hetkel avalikult kättesaadav.
Teenuse poole pealt on realiseeritud Currency kontroller osaliselt – realiseeritud on GET meetodid, mis töötavad ning väljastavad andmeid XML vormingus. PUT, POST ja DELETE meetodid tagastavad NotImplemented teate.
GET meetodi test: http://localhost:5189/api/currency/ aadress tagastab vastuseks
<ArrayOfCurrency> <Currency> <Created>2013-05-27T12:15:44.867</Created> <CreatorUser i:nil="true"/> <CurrencyID>1</CurrencyID> <IsVisible>true</IsVisible> <Name>EUR</Name> </Currency> <Currency> <Created>2013-05-27T12:15:44.867</Created> <CreatorUser i:nil="true"/> <CurrencyID>2</CurrencyID> <IsVisible>true</IsVisible> <Name>USD</Name> </Currency> </ArrayOfCurrency>
GET (GetById) meetodi test: http://localhost:5189/api/currency/2 aadress tagastab vastuseks
<Currency> <Created>2013-05-27T12:15:44.867</Created> <CreatorUser i:nil="true"/> <CurrencyID>2</CurrencyID> <IsVisible>true</IsVisible> <Name>USD</Name> </Currency>
Lisades GET meetodi aadressile id väärtuse, mida baasist ei ole võimalik leida (näiteks http://localhost:5189/api/currency/3 ), siis saab vastuseks:
<Currency i:nil="true"/>
Seega midagi on tehtud, aga mitte liiga palju. Samas on tehtud osa realiseeritud nii, nagu koolis õpitud ja kodutöös ka nõuti. Ehk et eraldi on andmete ligipääsu kiht (DAL), mudelid ning teenuse enda osa.
2. programmikoodi loetavus ning kommenteeritus
Koodis on palju välja kommenteerimisi, aga mitte liiga palju kommentaare. See teeb asjast aru saamise natuke keeruliseks. Samas on kood minimalistlik ja igasuguse liiasuseta.
3. dokumentatsiooni olemasolu
Teenusele eraldi dokumentatsiooni lisatud ei ole. Otseselt see nõutud ei ole, seega puuduseks just lugeda ei saa. Samas, kuna kood ei ole ka sisuliselt üldse kommenteeritud, siis on see üsna suureks puuduseks.
4. kirjeldada puudusi
Kasutajate tuvastamise ning halduse ja statistika osa on täielikult puudu. Seda, et enne teenuse kasutamist ja testimist tuleb konsooli rakendus käivitada, oleks võinud ka kusagil mainida, näiteks meeskonna wiki lehel.