Hops

From EIK wiki

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.