Locatie van de opdracht: http://tarantula.students.cs.uu.nl/~pjede/
Bestanden in deze zip-file: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.
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.
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.
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.
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.
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.
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.
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.
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.
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.