Bleh
Koosseis
- Lennart Ploom
- Kalev Kärpuk
- Jaak Peldes
XML
XML Ülesanne
Eesmärk on teha online TODO-list ülesannete jälgimiseks, mida kaastudengid saavad vastavalt vajadusele täiendada. Nii tekib kodutööde nimekiri (midagi e-kooli sarnast).
<?xml version="1.0" encoding="utf-8" ?>
<Tasklist>
<Task Id ="1">
<Aine Nimetus="Matemaatiline analüüs" Oppejoud="Kristiina Hakk">
<Oppekava Id="1" Nimetus="ISArendus">
<Oppevorm Id="1" Nimetus="Päevaõpe">
<Oppeaasta Id="1">
<Kirjeldus>
<Ülesanne>Vihiku täitmine</Ülesanne>
<Tähtaeg>23.03</Tähtaeg>
<HindeSkaala>10p</HindeSkaala>
</Kirjeldus>
</Oppeaasta>
</Oppevorm>
</Oppekava>
</Aine>
</Task>
<Task Id ="2">
<Aine Nimetus="Algoritmid ja andmestruktuurid" Oppejoud ="Jaanus Pöial">
<Oppekava Id="1" Nimetus="ISArendus">
<Oppevorm Id="1" Nimetus="Päevaõpe">
<Oppeaasta Id="2">
<Kirjeldus>
<Ülesanne>Iseseisev 5</Ülesanne>
<Tähtaeg>23.06</Tähtaeg>
<HindeSkaala>10p</HindeSkaala>
</Kirjeldus>
</Oppeaasta>
</Oppevorm>
</Oppekava>
</Aine>
</Task>
<Task Id="3">
<Aine Nimetus="Tõenäosusteooria ja matemaatiline statistika" Oppejoud ="Kristiina Hakk">
<Oppekava Id="2" Nimetus="ISAdministreerimine">
<Oppevorm Id="2" Nimetus="Õhtuõpe">
<Oppeaasta Id="1">
<Kirjeldus>
<Ülesanne>1. Kontrolletöö</Ülesanne>
<Tähtaeg>11.03</Tähtaeg>
<HindeSkaala>10p</HindeSkaala>
</Kirjeldus>
</Oppeaasta>
</Oppevorm>
</Oppekava>
</Aine>
</Task>
<Task Id ="4">
<Aine Nimetus="Võrgurakendused I" Oppejoud ="Random">
<Oppekava Id="1" Nimetus="ISArendus">
<Oppevorm Id="1" Nimetus="Päevaõpe">
<Oppeaasta Id="1">
<Kirjeldus>
<Ülesanne>Vihiku täitmine</Ülesanne>
<Tähtaeg>23.01</Tähtaeg>
<HindeSkaala>6p</HindeSkaala>
</Kirjeldus>
</Oppeaasta>
</Oppevorm>
</Oppekava>
</Aine>
</Task>
</Tasklist>
XML skeemifail
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Tasklist">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Task">
<xs:complexType>
<xs:sequence>
<xs:element name="Aine">
<xs:complexType>
<xs:sequence>
<xs:element name="Oppekava">
<xs:complexType>
<xs:sequence>
<xs:element name="Oppevorm">
<xs:complexType>
<xs:sequence>
<xs:element name="Oppeaasta">
<xs:complexType>
<xs:sequence>
<xs:element name="Kirjeldus">
<xs:complexType>
<xs:sequence>
<xs:element name="Ülesanne" type="xs:string" />
<xs:element name="Tähtaeg" type="xs:date" />
<xs:element name="HindeSkaala" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Id" type="xs:unsignedByte" use="required" />
<xs:attribute name="Nimetus" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Id" type="xs:unsignedByte" use="required" />
<xs:attribute name="Nimetus" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Nimetus" type="xs:string" use="required" />
<xs:attribute name="Oppejoud" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSLT 1
Kuvab kõik olulise info HTML tabelina
<?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>
<body>
<table border="1">
<tr>
<th>Aine</th>
<th>Töö</th>
<th>Kuupäev</th>
</tr>
<xsl:for-each select="Tasklist/Task">
<tr>
<td>
<xsl:value-of select="Aine/@Nimetus"/>
</td>
<td>
<xsl:value-of select="Aine/Oppekava/Oppevorm/Oppeaasta/Kirjeldus/Ülesanne"/>
</td>
<td>
<xsl:value-of select="Aine/Oppekava/Oppevorm/Oppeaasta/Kirjeldus/Tähtaeg"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT 2
Kuvab kõik 1. kursuse ülesanded
<?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:template match="/">
<html>
<body>
Prindime välja Kõik 1. kursuse taskid.
<ul>
<xsl:for-each select="Tasklist/Task/Aine/Oppekava/Oppevorm/Oppeaasta">
<xsl:if test="@Id=1">
<li>
<xsl:value-of select="Kirjeldus"/>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLT 3
Kuvatakse esmakursuslase kõik matemaatika ülesanded
<!--PILT TULEMUSEST ASUB SIIN: http://www.upload.ee/image/3150718/EsmaArendusTahabMatat.jpg-->
<?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>
<body>
Ma tahan teada, mis ma mat.analüüsis tegema pean.<br />
Ma olen esmakursuslane, arenduse tudeng, päevaõppes
<ul>
<xsl:for-each select="Tasklist/Task">
<xsl:if test="Aine/@Nimetus = 'Matemaatiline analüüs'">
<span style="font:bold">
ID <xsl:value-of select="@Id" /><br />
</span>
<li>
Aine: <xsl:value-of select="Aine/@Nimetus"/><br />
</li>
<xsl:if test="Aine/Oppekava/@Nimetus = 'ISArendus'">
<li>
Oppekava: <xsl:value-of select="Aine/Oppekava/@Nimetus"/>
</li>
<xsl:if test="Aine/Oppekava/Oppevorm/@Nimetus = 'Päevaõpe'">
<li>
Oppevorm: <xsl:value-of select="Aine/Oppekava/Oppevorm/@Nimetus"/>
</li>
<xsl:if test="Aine/Oppekava/Oppevorm/Oppeaasta/@Id = '1'">
<li>
Oppeaasta: <xsl:value-of select="Aine/Oppekava/Oppevorm/Oppeaasta/@Id"/>
</li>
<li style="font:bold">
Ülesanne: <xsl:value-of select="Aine/Oppekava/Oppevorm/Oppeaasta/Kirjeldus/Ülesanne"/>
</li>
<li style="font:bold">
Tähtaeg: <xsl:value-of select="Aine/Oppekava/Oppevorm/Oppeaasta/Kirjeldus/Tähtaeg"/>
</li>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:if>
<br />
<br />
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Veebiteenus
Kirjeldus
Meie veebiteenus tegeleb Microsoft TeamFoundation serverist andmete pärimise, uuendamise ning lisamisega.
Tegime WCF rakenduse, mis kasutab Microsoft.TeamFoundation klassiteeke, et pakkuda klientrakendustele TFS teenust. Tegu on väga aktuaalse tootega, kuna tahvelarvutid ei saa vastavaid klassiteeke kasutada, kuid läbi meie WCF teenuse saavad nad väga kergesti oma TFS serveriga ühendust. Ühendada saab ennast Microsoft TFS serveriga või ka kohaliku (on-premises) TFS serveriga.
Avalikud meetodid
- GetProjects(Guid sessionId) - Returns List<ProjectEntity>
- GetWorkItems(string projectName, Guid sessionId) - Returns List<WorkItemEntity>
- GetSimpleWorkItems(string projectName, Guid sessionId) - Returns List<WorkItemEntity>
- GetTasksAssignedToMe(string projectName, Guid sessionId) - Return List<WorkItemEntity>
- GetBacklogItems(string projectName, Guid sessionId) - Returns List<WorkItemEntity>
- GetCurrentIteration(string projectName, Guid sessionId) - Returns IterationEntity
- GetIterations(string projectName, Guid sessionId) - Returns List <IterationEntity>
- GetProjectMembers(string projectUri, Guid sessionId) - Returns List<TeamFoundationIdentityEntity>
- AddIteration(string projectName, string iterationName, Guid sessionId) - BOOLEAN
- DeleteIteration(string projectName, string iterationName, Guid sessionId) - BOOLEAN
- EditWorkItem(WorkItemEntity workItemEntity, Guid sessionId) - BOOLEAN
- DeleteWorkItem(WorkItemEntity workItemEntity, Guid sessionId) - Returns List<WorkItemOperationErrorEntity>
- AddTask(string ProjectName, int userStoryId, string title, string description, string state, string assignedTo, Guid sessionId, string areaPath = null, string IterationPath = null) - BOOLEAN
- AddWorkItem(WorkItemEntity item, Guid sessionId) - BOOLEAN
- IsLoggedIn(Guid sessionId) - BOOLEAN
- Login(string username, string password) - Returns nullable Guid
Olemklassidest vahekiht
Allolevad olemid on antud teenuse lahutamatu osa.
Olemid (Entity) on loodud selleks, et Windows 8 rakendustes ei ole võimalik kasutada TFSi klassiteeke (Microsoft.TeamFoundation.*.dll).
ProjectEntity
string Name
int projectId
string Uri
bool HasWorkItemReadRights
WorkItemEntity
string Name
int WorkItemId
string ChangedBy
DateTime ChangedDate
string AssignedTo
string CreatedBy
DateTime CreatedDate
string State
string Description
string ProjectName
string WorkItemType
string IterationPath
double? StackRank
int? ParentId
List<WorkItemEntity> Children
Uri Uri
IterationEntity
string Name
string Path
DateTime? StartDate
DateTime? EndDate
List<UserStoryEntity> UserStories
string Uri
UserStoryEntity : WorkItemEntity
List<WorkItemEntity> NewTasks
List<WorkItemEntity> ActiveTasks
List<WorkItemEntity> ClosedTasks
TeamFoundationIdentityEntity
string Name
string Email
string Title
WorkItemOperationErrorEntity
int Id
string Exception
Klientrakendused
Windows 8
Kirjeldus
Windows 8 klientrakendus on üles ehitatud järgmiselt:
LoginPage
Esimene vaade, mida kasutaja näeb. Siinkohal täpsustab kasutaja oma kasutajanime ja parooli.
MainPage
Peamine vaade, kus asub n.ö. abiriba navigeerimiseks erinevate vaadete vahel.
MainPage sees on ka Frame, milles kuvatakse allpool kirjeldatud vaated - Backlog view, (Task)Board view, Iteration View jne.
WorkItemPage
vaade, kus on kasutusel TreeView, et kirjeldada TFS-s esinevad elemendid (User Story, Task) hierarhiliselt, sest TFS-s võivad elementidel esineda alamelemendid.
WorkItemPage on kasutusel ka "Tasks Assigned To Me" vaates.
AddNewItemPage
Vaade uue WorkItem-i lisamiseks. WorkItem võib olla nii User Story kui ka Task.
EditNewItemPage
Vaade olemasoleva WorkItem-i redigeerimiseks.
NoItemPage
Vaade, mis on kasutusel "laadimisekraanina".
Juhul kui andmeid laaditakse või uuendatakse, siis kuvatakse sellekohane info NoItemPage vaates.
NoItemPage asub taaskord MainPage vaates esineva Frame-i sees.
BoardPage
Vaade, kus on implementeeritud Drag & Drop funktsionaalsus.
Võimaldab lohistada Taske kolme staatuse vahel - Uus, Aktiivne, Lõpetatud.
Siin nimistus on ainult need User Story-d, mis esinevad praegu käivas Iteratsioonis.
IterationPage
Vaade, mis kuvab kõik projektis loodud iteratsioonid.
Download
Kooskõlastatud õppejõuga.
Retsensioonid
XML Retsensioon meeskonnale Laenutajad
Meeskond Laenutajad tegeleb koduse filmide laenutusega, kuhu peaks saama filme lisada ja vähemaks võtta. Juurelemendina on kasutusel <moviestore> ning edasiminek on võrdlemisi loogiline: On muusikapood, kus on filmid, mis on jaotatud žanridesse ning filmid on žanri põhjal ära kategoriseeritud. XMLi elementide nimed on loogiliselt esitatud ning otsingu läbiviimiseks väga loogiline ja lihtsalt haaratav. Pole liialt palju väiksemaid ebavajalike detaile(Näiteks <Produtsendi nimi> -> <A> ). Kuigi see lisaks veelgi funktsionaalsust ei ole see vast sellise mahuga projekti puhul esmavajalik. Üks XML element on siiski, mida pigem tahaks reaalse filmilaenutuse puhul näha ning selleks on <Hinnang>, mis väljendaks filmile antud hinnangut, mis on saadud kuskilt filmikriitikute kodulehelt. Nõue, et vähemalt kolmel tasemel oleks vaja rohkem, kui vaid „ ID“ attribuuti on napilt täidetud. XSL failide kohapealt on loodud üks pikk päring, mis väljastab kõik filmid ja filmide andmed. Kuigi see on tõenäoliselt väga funktsionaalne ja vajalik päring, oleks rohkem soovinud näha erinevate päringutega mängimist, et väljastada vaid valitud filme. Näiteks kõik action filmid, mis on odavamad, kui X. Lisaks on juhendis öeldud, et tuleks teha „paar-kolm sobivat XSL faili loodud XML failis olevate andmete transformeerimiseks HTML formaati“. Üldiselt on siiski tegemist loogilise ja lihtsa ülesehitusega XML failiga, kus küll puudub originaalsust ja on piirdutud kindla peale minekuga, mistõttu ei saa ka nuriseda, sest hädavajalik on kõik olemas.
XML Retsensioon meeskonnale GOW
Meeskond GOW on loonud XML faili mängude spetsifikatsioonide hoidmiseks ja kategoriseerimiseks. Tööst arusaamiseks pidime XML faili põhjalikult uurima, sest puudus igasugune sissejuhatav tekst või ülesande püstitus, rääkimata juhendist kuidas antud XML faili kasutada. Samas oli XML fail ise piisavalt lihtne ja loogiline, et selle sisu mõista.
Alustasime meeskond GOW poolt tehtud töö analüüsimist süntaksi kontrolliga, kasutades W3 Schools validaatorit. Tulemus oli veatu. Seejärel kontrollisime töö ülesandes püstitatud nõudeid. Luua tuli XML fail, skeemifail ning 'paar kolm sobivat' XSL faili. XML fail oli veatu, täidetud olid kõik nõuded XML faili struktuurile ning atribuutidele. Fail ise oli piisavalt mahukas, et demonstreerida lihtsamat funktsionaalsust. Puudu olid vaid mängude sptetsifikatsioonid, mis olid jäetud lihtsalt tühjaks. XSD skeemifail oli Visual Studio poolt automaatselt genereeritud. XSL failidest oli meeskond GOW loonud vaid ühe ning ka sellel puudus igasugune selgitus. Sidusime antud XML ja XSL faili ning saime tulemuseks html kujul mängude tabeli koos nende nime, aasta ning tootjaga. Kuna tegu oli ainult ühe XSL failiga oleks võinud välja tuua ka XML failis märgitud spetsifikatsioonid.
Kokkuvõtvalt võib öelda, et töö oli tehtud hästi, kuid poolikult. Boonuspunktide saamiseks oleks võinud lisada ka DTD skeemifaili ning natukene eestikeelset teksti.
Retsensioon meeskonnale X-Ladu
Teenus
Teenuse käivitamine juhendi järgi oli mõnevõrra keeruline, sest andmebaasi loomiseks ei ole kastutatud Entitity Framework'i ning andmebaasi loomiseks oli vaja kasutada projektis kaasasolevat andmebaasi skripti, mis minu masinas esimese hoobiga tööle ei hakanud. Kui poleks abi saanud teistelt retsenseerijatelt oleks retsensiooniks valitud ilmselt mõni teine projekt. Seevastu on pea iga projekti kõige keerulisem osa integreerimine teiste süsteemidega, mistõttu on segadus täiesti mõistetav.
Projekti ülesehitus on jaotatud mooduliteks loogiliselt ning arusaadavalt. Teenuse loogika ning liidesed on ehitatud täpselt selliselt nagu oleme seni õppinud. Samuti ka mudelid. Võib öelda, et loeks nagu enda kirjutatud koodi. Ei ole midagi ebaselget. Eriti meeldib, et mudelite meetodid on toodud eraldi kausta ja klassidesse, see teeb koodi haldamise ning koodist arusaamise kergemaks, samuti väheneb sellega ka vigade tekkimise oht. Sama kehtib ka regioonide kohta. Kõik üldised nõuded projektile on täidetud.
Peaaegu kõik on dokumenteeritud nii koodis kui ka wikis. Isegi self documented meetodid on eraldi kirjeldatud. Samas esines mõnes kohas tühjasid kommentaare, mis on ilmselt automaatselt genereeritud ning sinna ka unustatud.
Natuke puudulik on turvalisuse pool, nagu on mainitud ka projekti enda wiki lehel. Teenusest on puudu kasutajate autentimine. Teenust on võimalik kasutada ilma igasuguse turvakontrollita, näiteks mitteregistreeritud kasutajad saavad vajadusel seadeid muuta. Kasutajate loomisel puudub kontroll juba olemasolevate kasutajanimede üle. Samuti on puudu ka krüpto pool. Paroolid saadetakse üle võrgu plain text kujul.
Kasutajate statistika on teenuse poolt pakutav funktsionaalsus, mis ilmselt tähendab, et logimine tehakse kliendi poolel, see on aga väga vale lähenemine, sest administraatoril puudub logimise üle kontroll. Nii võib klient vajadusel logi muuta või selle tekitamist üldse vältida. Isegi kui keegi poleks huvitatud logi muutmisest tekitab see asjatult probleeme kui mõelda uue klientrakenduse loomisele, sest kogu logimisega seotud funktsionaalsus tuleb ilmselt uuesti kirjutada. Kui logimine istuks ilusti teenuse poole peal siis seda probleemi ei tekiks.
Üldiselt on teenus hästi tehtud. Natuke puudulik on turvalisus, kuid see ei ole antud projekti põhieesmärk. Nagu autorid ise kirjutasid on nad sellest probleemist teadlikud, kuid ajapuuduse tõttu jäi see rakendamata.