Valid HTML 4.01 Transitional

Studenten:
Wesley Kok: 3019853
Pieter van Ede: 3019764

Locatie van de opdracht: http://tarantula.students.cs.uu.nl/~pjede/

Bestanden in deze zip-file:
DTD van ons eigen XML-formaat: data.dtd
Voorbeeld van ons eigen XML-formaat: voorbeeldXML.xml
SQL-data-definitie van onze database: sqlDataDefinitie.sql
web.xml servlet configuratie-bestand: web.xml
In onze aggregator is al de RSS-feed van http://news.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml opgenomen, hiermee kunt u de collaborative filtering testen.
Wij kunnen allen het iTunes formaat en RSS 2.0 parsen. Andere RSS formaten specifiek of XML-formaten in het algemeen zouden prima te implementeren zijn (in het XSL stylesheet) mits we meer tijd hadden. Echter het principe blijft het zelfde.
Omdat wij de opdracht nogal vaag vonden omtrent de vereisten van het eigen XML-formaat, hebben wij Arthur van Leeuwen gevraagd hoe het precies zit. Hieronder staat de mail en zijn antwoord:
-------------------------------------------------------
On 4-apr-2006, at 13:53, Pieter van Ede wrote:

> Beste Arthur,
>
> Aangaande de java servlet opdracht is behoorlijke onduidelijkheid
> ontstaan. De studentpracticumbegeleiders weten ook niet hoe het
> zit, want
> ze hebben alledrie een ander idee over hoe het volgende moet worden
> geimplementeerd:
>
> je moet een eigen xml formaat maken, en daarin diverse soorten
> informatie
> opslaan. je kan dit doen door 1)zeer weinig tags te gebruiken zoals
> titel
> en content en allerlei data-specifiek (zoals tracklengte voor muziek)
> gewoon in plain tekst in content gooien of 2)in je xml onderscheid
> maken
> tussen de generieke types news, muziek enz.. en per type data opslaan.
>
> Een nadeel van 1 is dat heel veel controle over data kwijtraakt. Een
> nadeel van 2 is dat je voor elk type dat je extra wil importeren je
> dtd
> wil aanpassen (bijvoorbeeld als je MathML erin wilt voegen)
>
> Duidelijkheid hierin zou voor iedereen een stuk werkbaarder zijn,
> dus ik
> hoop dat U wel weet wat de bedoeling is.

De bedoeling is eenvoudig: je eerste optie is de juiste. Het gaat
om datafiltering, niet datapresentatie. Probeer het minste te doen
dat je kunt doen en dat nog zinnig lijkt en aan de opgave voldoet.

Met vriendelijke groet, Arthur.
-------------------------------------------------------

Aggregator

Onze aggregator-klasse is een extensie van HttpServlet. Hij heeft drie methoden: doGet, doPost en init.

- De init wordt aangeroepen tijdens het opstarten van onze servlet. Dit gebeurt dus eenmalig. Tijdens deze init worden een database-object, sessie-object, een scherm- en een verwerker-object aangemaakt. Het database-object wordt steeds doorgespeeld naar alle andere klassen, zodat er maar een keer verbinding hoeft te worden gemaakt.

- De doGet handelt alle verzoeken aan onze servlet via de GET-methode af. Dit zijn eigenlijk hoofdzakelijk verzoeken om een ander scherm te tonen. Hij maakt een sessie aan, zie verder bij de klasse sessie. Wel is hierover het vermelden waard, dat doGet niet zeker weet of de gebruiker al eens eerder bij deze aggregator is geweest. Dit twijfelgeval is cruciaal wanneer er geen parameters achter de link staat, zoals ?page=summ. Onze applicatie kijkt dan in het resultaat van de methode sessie.getID of de sessie al bestaat of niet, en zo niet laat hij het datasource selection scherm zien, anders gelijk de selected list (scherm 1 resp. scherm 3).

- De doPost wordt voornamelijk gebruikt voor het verwerken van de formulier op het eerste scherm (datasource selection scherm). Deze methode is weinig anders dan een doorgeefluik naar de juiste methode uit VerwerkInput.

Database

De database klasse maakt een connectie aan, en biedt vervolgens twee methoden om querys mee uit te voeren, zodat de eigenlijke opdrachten en het maken van connectie worden afgeschermd van de gebruiker van de database. Ook zaken als wachtwoord en gebruikersnaam kunnen zo centraal worden beheerd.

- De constructor maakt eenmalig een verbinding aan met de database en slaat die lokaal op. Hier kunnen ook later wachtwoord en gebruikersnaam worden veranderd.

- resultQuery is een methode die gebruikt moet worden als een query een resultaat op moet leveren.

- nonResultQuery is de andere SQL-methode, die gebruikt moet worden als een query geen resultaat verwacht.

RegEx

De RegEx klasse kan worden gebruikt om regular expressions mee uit te voeren, zonder zelf eerst een pattern en een matcher aan te maken. Voor simpele expressies wordt deze klasse gebruikt, voor moeilijkere expressies niet.

- de methode regularExpression voert een regularExpression uit en retourneert van de eerste match de gespecificeerde groep. Tevens onthoud deze methode in zijn object ook waar het gebleven is met matchen voor de andere methode.

- de methode continueMatch gaat verder met de match die begonnen is in regularExpression, eventueel het resultaat in een andere groep retournerend.

Schermen

Deze klasse is verantwoordelijk voor het displayen van de verschillende schermen. Het heeft de volgende methoden:

- De constructor krijgt een database en verwerker object mee, dit om geheugen en database-connecties te sparen.

- De methoden dataScherm, selectScherm en summScherm maken de schermen. selectScherm produceert de schermen 3 en 4 uit de opdracht.

- De private methode cssLink zorgt ervoor dat een wijziging van locatie van het css-bestand makkelijk aan te passen is. Dat de link er zo vreemd uitziet, is dat de tomcat server het css bestand niet in zijn directory leest.

Sessie

Deze klasse wordt gebruikt voor het herkennen van een user. Hij heeft 2 methodes:

- getId, deze methode haalt de userID op uit het cookie. Indien deze niet bestaat laat hij MakeSessieID een nieuw cookie maken. Vervolgens stuurt hij de userID en een string, die aangeeft of een gebruiker al eens de aggregator had bezocht, terug.

- makeSessieID, deze methode maakt een cookie user met een nieuw gegenereerd userID.

Util

Dit is een beetje de rommelklasse. In Util staan allerlei methodes die we door de hele aggegrator heen gebruiken.

- getSubmit is de methode die aangeroepen wordt vanuit de doPost. Hij haalt de waarde(n) van de POST op, en stop deze in een array samen met de naam van het formulier die de POST heeft aangeroepen. In het geval van de checkboxjes, plakt hij alle waarden van de geselecteerde checkboxjes achterelkaar, gescheiden door spaties.

- makeURL krijgt een url mee, en checkt met behulp van regular expressions, of deze url een geldige url is.

- escapeString vervangt karakters die problemen opleveren in SQL-querys ( ' en " ) door de html-entities of de karakter- encoding, zodat ze in de querys geen problemen geven, maar de inhoud van een veld wel goed op het scherm wordt weergegeven.

VerwerkInput

Deze klasse verwerkt de invoer van de schermen.

- verwerkItem wordt gebruikt om de boolean presented van de summary_list voor een gebruiker om te zetten.

- verwerkPrivateFile zet de inhoud van een lokaal bestand dat de gebruiker uploadt, naar de database.

- updateItems haalt voor alle publieke bronnen, de (nieuwe) items op en zet de nieuwe items in de itemlist en alle publieke items in de summarylist voor deze gebruiker.

- verwerkPublicURL zet een door de gebruiker toegevoegde publieke url in de database.

- sourceToDatabase zet een bron (public en private) in de tabel bronnen.

- naarDatabase probeert alle items uit een gegeven bron toe te voegen in de database.

- verwerkCheckboxjes verwerkt de checkboxjes. Dat wil zeggen hij zorgt ervoor dat de checkboxjes in het eerste scherm (datasource selection) werken, dus dat de geselecteerd-status wordt bijgewerkt in de bronnenlist tabel.

XSLTransformer

Deze klasse wordt gebruikt om XML data te converteren.

- de methode transformer transformeert gegeven XML data voor een bepaalde mode. Mode 1 betekent dat er wordt geconverteerd met behulp van een XSL stylesheet van de buitenwereld naar ons eigen dataformaat. Mode 2 betekent dat ons eigen data-formaat wordt omgezet naar xHTML code met behulp van een ander XSL stylesheet.

Toelichting database

We zullen hier even kort ons database design toelichten. Een ER-diagram vinden we een beetje veel van het goede hier, naast het feit dat we die pas volgend blok zullen leren.

- bronnen is de tabel waarin de bronnen staan opgeslagen, met informatie specifiek voor een bron.

- bronnenlist is waar een bron aan een user wordt gekoppeld, en waar wordt bijgehouden of een gebruiker een bron heeft geselecteerd.

- items is de tabel waar alle items worden opgeslagen, met voor een item specifieke informatie

- summary_list is de tabel waar items aan een gebruiker worden gekoppeld, en waar wordt bijgehouden of een item shown, presented, etc is.

Extra

We leveren er ook nog een standalone XSL Transformer bij, die zeer eenvoudig lokaal xml kan converteren. Zie voor het gebruik het uitgebreide commentaar in de JAVA file.