DEPARTEMENTBEDRIJFSINFORMATIEBINF OPLEIDINGTOEGEPASTEINFORMATICA Schoonmeersstraat 52 9000 GENT ACADEMIEJAAR2006-2007
STAGEDOSSIER
ONDERWERP:Ontwerpenbackup/sizing tool
STUDENTEN:
ThomasDebrayen Pieter Vercammen
ADRES:
Zavelstraat 72, B3071Kortenberg
BEDRIJF:
SourceNV-SA
STAGEBEGELEIDERS:
ChristopheChanteuxen Bart Verstreken
STAGEMENTOR:
Margot DeDonder
Inhoudsopgave VOORWOORD....................................................................................................................................2 SOURCE NV/SA................................................................................................................................. 3 DE OPDRACHT.................................................................................................................................. 4 Inleiding........................................................................................................................................... 4 Meetingverslag: de doelstellingen................................................................................................... 5 Meetingverslag: stroomlijnen van de doelstellingen....................................................................... 6 ONDERZOEK......................................................................................................................................8 Inleiding........................................................................................................................................... 8 HP StorageWorks Sizing Tool.......................................................................................................10 Dell Storage Advisor..................................................................................................................... 11 Besluit............................................................................................................................................ 12 OPSTELLEN OMGEVING............................................................................................................... 13 Installatie Apache, PHP en Mysql................................................................................................. 13 Installatie SVN server.................................................................................................................... 14 Software......................................................................................................................................... 16 Eclipse....................................................................................................................................... 16 Adobe Photoshop en ImageReady............................................................................................ 16 Microsoft Visual Web Developer 2005.................................................................................... 17 PuTTY.......................................................................................................................................17 Gantt Project............................................................................................................................. 17 ONTWERP.........................................................................................................................................18 De onderdelen................................................................................................................................ 18 Het framework............................................................................................................................... 19 De plugin........................................................................................................................................20 De administratortool...................................................................................................................... 21 De database.................................................................................................................................... 25 De front-end................................................................................................................................... 27 Inleiding.................................................................................................................................... 27 De template............................................................................................................................... 30 DIAGRAMMEN................................................................................................................................ 32 Het framework............................................................................................................................... 32 De statussen...............................................................................................................................32 De objecten............................................................................................................................... 33 De manager............................................................................................................................... 34 De XML Loader........................................................................................................................35 De webservice........................................................................................................................... 36 Het laden van de plugins........................................................................................................... 42 Het aanmaken van een sessie.................................................................................................... 44 Een actie uitvoeren via de webservice...................................................................................... 46 De plugin........................................................................................................................................47 De objecten............................................................................................................................... 47 De database............................................................................................................................... 47 De opstartklasse........................................................................................................................ 48 De mapper................................................................................................................................. 50 De administratortool...................................................................................................................... 52 De actionlisteners...................................................................................................................... 52 De database............................................................................................................................... 54 De mappers............................................................................................................................... 56 1
Het opbouwen van de tree.........................................................................................................57 Het opbouwen van de gui..........................................................................................................58 De nodes....................................................................................................................................59 De taalmanager......................................................................................................................... 60 De Front-end.................................................................................................................................. 61 De web reference...................................................................................................................... 61 Het resetten van de tool.............................................................................................................63 TESTEN............................................................................................................................................. 64 JUnit testen.................................................................................................................................... 64 Losse testen & debugging..............................................................................................................65 Monkey testen................................................................................................................................65 Eindgebruiker-testen...................................................................................................................... 65 USE CASES....................................................................................................................................... 66 Use case: doorlopen storage/backup sizing tool op de website..................................................... 66 Use case: Administratortool - Aanmaken van een vraag...............................................................67 Use case: administratortool – Verwijderen van een vraag............................................................ 68 Use case: Administratortool - Deactiveren van een vraag.............................................................69 Use case: Administratortool – Vraagstelling wijzigen.................................................................. 70 Use case: Administratortool – Toevoegen van een antwoord....................................................... 71 Use case: Administratortool – Antwoordstelling wijzigen............................................................72 Use case: Administratortool – Aanmaken van een solution.......................................................... 73 Use case: Administratortool – Wijzigen van een solution.............................................................74 Use case: Administratortool – Verwijderen van een solution....................................................... 75 Use case: Administratortool - Deactiveren van een solution.........................................................76 Use case: Administratortool – Activeren van een plugin.............................................................. 77 Use case: Administratortool – Deactiveren van een plugin...........................................................78 SLOTWOORD................................................................................................................................... 79 BIBLIOGRAFIE................................................................................................................................ 80 BIJLAGEN......................................................................................................................................... 81 Planning......................................................................................................................................... 81 Logboek......................................................................................................................................... 82
2
VOORWOORD Wij, Thomas Debray en Pieter Vercammen, zijn twee gedreven studenten Toegepaste Informatica aan de Hogeschool Gent die reeds samen aan verscheiden projecten hebben deelgenomen. Zo hebben we reeds een beheertool voor stages en een chatserver (en -client) op het TCP/IP protocol ontwikkeld, projecten die alle succesvol beëindigd zijn. Niet voor niets lag een degelijk stageproject aan de basis van een nieuwe uitdaging. Wij hebben deze opdracht gekozen omdat de firma Source ons een kans bood die wij nergens anders konden terugvinden. Weinig stageopdrachten hielden immers in dat er een tool ontwikkeld moest worden waarvoor er nog (bijna) geen alternatieven op de markt waren en nog steeds niet zijn. Bovendien zou de tool een belangrijke rol spelen in het verdere verloop van de communicatie van Source met de buitenwereld. Hoewel de afstand (Gent – Kortenberg) enig discussiepunt was, hebben we dit nooit als hekelpunt gerekend. Het deelnemen aan een stageproject vraagt veel inzet en doorzettingsvermogen. Tijdens het tot stand komen van ons project konden we steeds rekenen op raad en daad van derden. We willen van deze gelegenheid dan ook gebruik maken om enkele mensen te bedanken. Eerst en vooral willen wij de heren Bart Verstreken en Christophe Chanteux, onze stagementoren bij Source, bedanken voor hun gedreven medewerking aan ons project. Zonder hun advies en ondersteuning was het voor ons onmogelijk geweest om deze klus te klaren. Graag hadden wij ook mevrouw Margot De Donder, onze stagementor, bedanken voor de adviezen en ondersteuning die wij van haar kregen. Tot slot wouden wij ook de mensen van Source bedanken voor hun steun en begeleiding en het management voor het verstrekken van de door ons genoten faciliteiten.
2
SOURCE NV/SA Source1 is al sinds 1991 actief op de Belgisch markt. Source is gestart als integrator voor UNIX oplossingen van Sun Microsystems. Al snel werden er storage en archiverings oplossingen aangeboden op dit unix platform. Storage kende reeds in de jaren 90 een sterke groei en er werd vooral gezocht naar veilige en stabiele oplossingen. Op die manier werd het product portfolio van Source reeds sterk in de richting van storage uitgebouwd. Source is toen gestart met het verkopen van Amass software (virtueel filesysteem voor optical en tape libraries) en Legato Networker (backup software). Voor deze 2 oplossingen waren het vooral de grotere klanten die interesse hadden. Klanten zoals Belgacom en Bacob bank waren al snel referenties voor dit type software. Om het klanten portfolio uit te breiden is Source toen beginnen samen werken met partners. Andere resellers hadden dikwijls een betere account management bij deze grotere klanten. Op die manier is Source uitgegroeid tot een volwaardige CDP (Channel Development Partner) Source heeft er toen ook voor gekozen om 100 % samen te werken met andere integrators en dus zelf niks meer rechtstreeks te verkopen. Dit is een vrij uniek principe in België en zal je waarschijnlijk niet in grotere landen terug vinden. Source is dan ook een verlengstuk van een reseller op technisch vlak. De reseller is sterk in account management en Source vult het technische luik in (pre en after-sales support). De laatste jaren heeft Source zich nog verder toegelegd om zijn kennis van de storage markt uit te breiden. Er is ook de keuze gemaakt om het aantal vendors drastisch te beperken, op die manier is er voldoende focus zodat de technische kennis optimaal is. De vendors die Source op een pro-actieve manier vertegenwoordigd zijn EMC, Sun Microsystems en Bakbone. Er zijn nog een aantal andere vendors die op het portfolio van Source staan, maar eerder op een passieve manier. Dit wil zeggen dat indien deze passen in een bepaald project ze verder zullen bekeken worden. Op deze manier heeft Source een unieke positie in de markt verkregen. Source heeft dan ook recent 2 awards gekregen als beste storage CDP. Verder heeft Source ook een training center uitgebouwd waar zowel op maat gemaakte als gecertifieerde storage trainingen worden gegeven. Sinds een aantal jaar is Source ook actief in Nederland. Het is de bedoeling dezelfde manier van werken uit te bouwen zoals in België. Vandaag zijn er maar weinig CDP’s die zo gefocussed werken met een aantal vendors. Het is de bedoeling ook deze manier van werken te handhaven in de toekomst. Natuurlijk is het ook zo dat de hele IT markt steeds onderhevig is aan veranderingen. Het kan dus best zijn dat Source zijn strategie in de toekomst aanpast aan de behoeften van de markt.
1 http://www.source.be
3
DE OPDRACHT Inleiding Aangezien Source een heel nauw contact met de resellers heeft, houdt dit ook in dat er een drempel aanwezig is om Source te contacteren. Potentiële klanten en eindgebruikers bellen niet gemakkelijk met vragen over hun backup en storage noden. Dit komt enerzijds omdat ze dit contact langs te direct vinden. Anderzijds vrezen ze dat Source vragen gaat stellen waarop ze niet meteen een antwoord kunnen geven. Met andere woorden kan men stellen dat de huidige situatie zeer tijdrovend is voor de (potentiële) klant. Vanwege deze reden gaf Source de opdracht een marketingtool te ontwikkelen die een advies kan geven aan potentiële eindklanten wat betreft backupmogelijkheden. Het concept moet eenvoudig zijn en de gebruiker doen nadenken over zijn huidige omgeving. Om dit te bereiken moet de tool de klant een aantal gerichte vragen stellen en aan de hand van de ingevoerde antwoorden nieuwe relevante vragen stellen. Dit proces moet doorgaan totdat de tool voldoende informatie heeft om een rapport te genereren met daarin een advies. Dit advies moet algemeen blijven omdat het niet de bedoeling is de klant een offerte te tonen na het doorlopen van de vragenlijst, maar eerder te informeren over de producten van Source. Een andere vereiste was dat de tool modulair moest zijn. Het kan immers steeds interessant zijn de tool later uit te breiden met nieuwe functionaliteiten. In dat geval moeten deze op een snelle en eenvoudige manier in de huidige tool geïmplementeerd kunnen worden. De grootste eis was echter dat de tool gebruiksvriendelijk en portabel moest zijn. De portabiliteit houdt in dat de tool op elke computer moet werken, onafhankelijk welk platform er gebruikt wordt. Daarnaast moet het mogelijk zijn dat er meerdere vragenlijsten op de website beschikbaar zijn, elk afzonderlijk beheerbaar. De gebruiksvriendelijkheid houdt in dat het beheer en het doorlopen van de vragen op een eenvoudige en efficiënte manier gebeurt. Bovendien moeten aanpassingen eenvoudig aangebracht kunnen worden zonder dat de gebruiker enig inzicht in de geschreven code moet hebben. Tot slot moest alles ook voldoende gedocumenteerd worden opdat - indien dit later nodig zou blijken -aanpassingen op eenvoudige wijze doorgevoerd kunnen worden. Op de volgende bladzijde vindt u een samenvattend meetingverslag van 11 december 2006, waarin de doelstellingen van het project aangehaald werden.
4
Meetingverslag: de doelstellingen De doelstelling van de tool is het uitbrengen van een advies over backup mogelijkheden op basis van een vragenlijst. De sizing tool moet, via een webinterface, de mogelijkheid bieden aan de gebruiker om een aantal vragen, over zijn huidige omgeving (focus op open systemen – dus geen mainframe), te beantwoorden. Op basis van deze antwoorden moet de sizing tool dan een rapport/advies uitbrengen over de huidige situatie en de mogelijke toekomstige omgevingen (via simulaties). Het resultaat kan ook zijn dat er consulting nodig is. ●
●
●
●
●
●
●
De basis moet makkelijk aanpasbaar zijn (technologie verandert voortdurend) ○ basis parameters: normen die niet vaak veranderen ○ geavanceerde parameters: nodig voor een meer diepgaande analyse/advies ○ “Nice to have” parameters: waar rekening mee gehouden moet worden naar de toekomst Niet uit het oog verliezen dat het om een commerciële tool gaat ○ Niet te technisch ○ invulbaar in een aanvaardbare tijdspanne (bv 10 minuten) evt werken in verschillende stappen en stelselmatig resultaat weergeven => motivatie Om de applicatie een duurzaam leven te bieden, dient er geprogrammeerd te worden volgens standaarden en normen. Er dient ook een help functie aangemaakt te worden (voor gebruikers, beheerders en ontwikkelaars) Data catalogeren: de gebruiker moet aangezet worden om hierover na te denken ○ type data: naar belangrijkheid indelen ○ indekken tegen: hardware defecten, software problemen, menselijke fouten, wetgeving ○ back-up biedt oplossing in geval van disaster recovery ○ applicaties: e-mailarchiving, databases Datagroei bepalen: ○ Via SRM (Storage Resource Management) is het mogelijk te bepalen hoeveel data er verandert/bijkomt (evt als dienst aanbieden) Backup noden bepalen ○ Tape drives / technologie ○ backup to disk Performance ○ Netwerk, disk, tape, CPU, RAM
5
Meetingverslag: stroomlijnen van de doelstellingen Na een aantal weken onderzoek bleek dat een aantal doelstellingen moesten gestroomlijnd worden. Bart en Christophe bleken immers een andere mening te hebben over de uitwerking van de applicatite. Daarom hebben we gevraagd om een extra interne meeting te houden. Oorspronkelijk was het de bedoeling dat enkel Bart, Christophe en het management aanwezig waren op deze meeting, maar vermits Pieter nog aanwezig was op het bedrijf, werd hem halverwege de meeting gevraagd de vergadering te komen bijzitten. Aanwezig: Nico, Christophe, Bart en Pieter Verontschuldigd: Danny Er werd iedereen opnieuw hun visie over het project gevraagd: – – –
Nico verkoos een marketing tool die snel en eenvoudig beheerbaar is Bart vond het belangrijk dat de tool overzichtelijk zou worden, en dat alles duidelijk invulbaar zou zijn Christophe wou dat de vragenlijst gescheiden werd van de solutions
Vervolgens werd gevraagd wat er precies technisch mogelijk was. Pieter stelde daarbij twee mogelijke oplossingen voor die uitgewerkt waren: –
Mogelijkheid 1: de vragenlijst wordt opgebouwd in een boomvorm, waarna men solutions kan aanmaken. Wanneer men een solution aanmaakt kan men vervolgens in de boom klikken waar men deze wil plaatsen. Christophe gaf hierbij aan dat dit onoverzichtelijk kon worden wanneer de tool ver uitgewerkt wordt. Bart gaf aan dat men met deze oplossing zeker is wat men uitkomt, vermits men manueel de solutions aan de boom gekoppeld heeft. Nico steunde Bart.
–
Mogelijkheid 2: de vragenlijst wordt opgebouwd in een boomvorm, waarbij elke vraag aan een thema gekoppeld wordt. Een antwoord treedt dan op als een soort parameter. Wanneer men vervolgens een solution opstelt, kan men de parameters aanduiden die tot die solution leiden. Deze manier laat toe dat men de boom (vragenlijst) kan veranderen zonder dat men de solutions dient te wijzigen. Christophe gaf aan voorstander te zijn van deze oplossing, omdat het werk zou uitsparen. Bart was van mening dat deze oplossing een risico inhield, vermits men door het wijzigen van de boom onbewust solutions zou kunnen uitsluiten. Nico beargumenteerde Christophe dat deze oplossing juist meer werk zou betekenen. Men moet immers steeds heel de boom opnieuw controleren wanneer men een vraag of solution wijzigt opdat men zeker zou zijn dat men nergens iets verkeerds uitkomt. Verder gaf Nico ook aan dat hij ooit een dergelijk programma had gemaakt voor het catalogiseren van magazines. Daarbij had hij op het probleem gestuit dat zijn zoekopdrachten na verloop van tijd totaal verkeerde informatie gaven. Verder stelde hij ook dat parameters wel tot de juiste oplossing kunnen leiden voor de klant, maar dat die oplossingen niet altijd commercieel interessant zijn, zowel voor Source als voor de klant. Een voorbeeld hiervan is wanneer de klant voor al zijn oplossingen EMC materieel zou verkiezen, waardoor hij op die wijze meer korting zou krijgen van EMC.
6
Deze twee uiteenlopende oplossingen leidden tenslotte tot een concensus. Er werd geopteerd om geen regels en parameters in te bouwen omdat men vreest dat de tool daardoor in de loop van de tijd onbruikbaar zou worden. Daarom koos men voor de eerste oplossing, welke ook het oorspronkelijk idee van aanpak was. Er werd hierbij wel gevraagd dat de gebruiker, wanneer deze zijn solution te zien krijgt, een rapportje moet krijgen van wat hij juist ingevuld heeft. Dit rapportje bevat dan een overzicht van zijn situatie.
7
ONDERZOEK Inleiding Vooraleer we konden beginnen met het ontwikkelen van de gevraagde applicatie, was het belangrijk een uitgebreid onderzoek uit te voeren. Hierbij was een degelijke planning noodzakelijk, waarvoor GanttProject 2 een hulpmiddel aanreikte.
Een aantal essentiële zaken werden met behulp van dit Gantt-chart project gepland. Hieronder vindt u het journaal van de meest belangrijke ervan: – –
– –
– –
–
Opzoeking naar bestaande tools – Het is belangrijk dat we eerst een onderzoek doen naar programma's die een gelijkaardige oplossing bieden voor het gestelde probleem. Analyse & ontwerp framework – het framework zal ervoor zorgen dat het programma modulair opgebouwd wordt. Het zal ook dat onderdeel vormen dat met de webinterface zal communiceren. Het is dan ook belangrijk dat dit framework af is voordat er aan de storage/backup sizing module en webinterface gewerkt wordt. Analyse & ontwerp webservice – De webservice zal de service verzorgen die ervoor zorgt dat de website met het framework kan praten. Analyse & ontwerp administratortool – De administratortool zal het mogelijk maken flowcharts (vragenlijsten) aan te maken en te bewerken. De administratortool zal een standalone applicatie zijn die platformonafhankelijk moet zijn. Analyse & ontwerp front-end – Wanneer het programma volledig werkt en de webservice op punt staat, kunnen we de website zelf maken, hetzij in Flash of ASP.NET. Onderzoek naar opslagmogelijkheden – We zijn van plan de flowchart intern als een tree te benaderen (zie verder). We moeten echter uitzoeken hoe we het beste de tree gaan opslaan. Waarschijnlijk zal dit dmv een relationele databank gebeuren, maar ook dan is nog uit te zoeken hoe we precies de tabellen gaan inrichten en welke O-R-mapping we gaan gebruiken (Hibernate?). Onderzoek naar een mogelijke flowchart (vragenlijst) – Bart en Paul zullen ons elk voorzien van een flowchart welke de oplossingspaden voor een backup-probleem visueel voorstellen. Zodra wij deze flowcharts in ons bezit krijgen, zullen wij deze eerst aandachtig bestuderen en
2 Een Gantt-grafiek is een grafiek of diagram die veel wordt gebruikt als hulpmiddel bij projectmanagement. “GanttProject is a free and easy to use Gantt chart based project scheduling and management tool.” http://ganttproject.biz
8
–
–
– –
vervolgens samenvoegen tot één geheel. Vervolgens zullen we van dit nieuw geheel testen door een simulatie uit te voeren van een random backup/storage probleem. Indien de samengestelde flowchart een ander antwoord geeft dan dat van een expert, moet de flowchart opnieuw bekeken en herontworpen worden. Opbouwen plugin – zodra de flowchart op punt staat en de manier van opslaan beslist is, kunnen we effectief beginnen met het ontwerpen van de module. Deze module moet naadloos in het framework passen, en indien dit niet mogelijk is, moet het framework bijgewerkt worden. Handleiding & documentatie – Gedurende de drie maanden stage zullen we regelmatig de documentatie bijwerken en de handleidingen aanvullen met de nodige informatie. De handleiding zal voornamelijk bestaan uit de verscheidene use cases. Testen – Gedurende de drie maanden stage zullen we stelselmatig de programmacode testen en controleren op fouten. Meetings – Regelmatig zullen we het het geleverde werk voorleggen aan de stagementor en/of stagebegeleiders. Het is belangrijk dat de feedback goed opgevolgd wordt opdat de applicatie naar de wensen van de eindgebruikers zal voldoen.
Om de context van de probleemstelling duidelijker te kunnen plaatsen, was het belangrijk een onderzoek te verrichten naar bestaande tools die gelijkaardige functies hebben. Het feit dat dergelijke tools erg beperkt zijn op de huidige markt maakte deze taak er niet eenvoudiger op. Uiteindelijk vonden we twee tools, enerzijds van HP en anderzijds van Dell, die in aanmerking kwamen. Beide hadden hun eigen voor- en nadelen die we hieronder kort zullen bespreken.
9
HP StorageWorks Sizing Tool Url: http://h30144.www3.hp.com/ The HP StorageWorks Sizer is a downloadable sizing tool that helps to design a storage infrastructure that will meet your customer’s needs!
Voordelen: – zeer gedetailleerd – heel veel functies – genereren rapporten – exportmogelijkheden (excel) Nadelen: – niet commercieel – te ingewikkeld – enkel voor HP producten – zeer traag om te doorlopen (vereist een grondige analyse)
10
Dell Storage Advisor Url: http://www1.ap.dell.com/content/topics/topic.aspx/ap/topics/main/en/storage_advisor?c=in&cs=inb sd1&l=en&s=bsd The Dell Storage Advisor is designed to help you navigate to a storage solution based on your organization's storage requirements. Simply answer a brief series of questions and the Storage Advisor will recommend hardware, software, services and accessories well-suited to your needs. The Storage Advisor also provides a list of “Other Things to Consider” to help you lower your total cost of storage ownership, and improve your storage scalability and management flexibility.
Voordelen: – zeer eenvoudig qua concept – snel te doorlopen (1 a 2 minuten) – geen inzicht in technische details nodig – progress overzicht – informatief – overzichtelijk Nadelen: – te eenvoudig – geen invoer van gegevens (cijfers, getallen) door de klant
11
Besluit Na onderzoek van deze bestaande tools hebben we besloten een tool te bouwen die een gelijkaardige interface naar de gebruiker toe biedt als die van Dell. Bovendien leunde deze tool het meest aan bij onze beslissing om een tree (boom) te gebruiken. Het plaatsen van de vraagstelling in een boomstructuur laat immers toe de eenvoud te bewaren. Uiteraard vereist het opmaken van een dergelijke tree een grondig inzicht in het domein van de storage wereld vermits men het probleem gaat uitdiepen en steeds verder opsplitsen zodat men voor de meeste situaties een eenduidige oplossing kan geven. De probleemsituatie wordt dus systematisch opgedeeld in verschillende categorieën waarvoor elk een aparte oplossing aangeboden wordt. Het voordeel van deze opbouw is dat er makkelijk knopen kunnen toegevoegd, verwijderd, gewijzigd of verplaatst worden. Wanneer bijvoorbeeld door de vernieuwing van de technologie een bepaalde vraag herzien moet worden, kan men makkelijk de parameters van deze knoop gaan wijzigen zonder dat het hele programma herschreven moet worden. In feite kan men stellen dat deze tree een vereenvoudigde uitwerking is van een object-georiënteerd kennissysteem, waarbij de parameters gestructureerd zijn in een boom. De flowchart van de probleemstelling (dus eigenlijk de opbouw van de vragen en plaatsing in boomstructuur) zal ontworpen worden door 2 werknemers van Source die een uitgebreid technisch inzicht hebben in de storagewereld.
12
OPSTELLEN OMGEVING Installatie Apache, PHP en Mysql MySQL is een open source relationele database management systeem (RDBMS), dat gebruik maakt van SQL. MySQL werd vroeger vaak gebruikt voor toepassingen zoals fora en gastenboeken, meestal in combinatie met PHP, tegenwoordig is het de basis van een breed scala aan internettoepassingen, maar ook stand-alone software. Het MySQL-softwarepakket bestaat onder meer uit een serverprogramma, doorgaans mysqld genoemd. Hierbij staat de d voor daemon, de Unix- of Linux-term voor een proces dat netwerkconnecties aanneemt. Verder bestaat het uit een verzameling clientprogramma's, zoals mysql en mysqldump waarmee automatisch of interactief met de server gecommuniceerd kan worden. MySQL is een populair databasemanagementsysteem dat voor het gestructureerd opslaan van gegevens voor zeer veel toepassingen wordt gebruikt. Een bekend MySQL-frontend is phpMyAdmin, een webgebaseerd MySQL-administratieprogramma geschreven in PHP. MySQL wordt veel gebruikt in combinatie met Linux, Apache en PHP of Perl. Deze combinatie van software wordt LAMP genoemd. MySQL wordt in deze combinatie echter ook gebruikt op andere besturingssystemen, bijvoorbeeld met Mac OS X (MAMP) of Microsoft Windows (WAMP). We installeren MySQL als volgt3: 1. We installeren de vereiste pakketten met behulp van yum: yum -y install httpd php mysql mysql-server php-mysql 2. We zorgen er nu voor dat de services automatisch gestart worden: /sbin/chkconfig httpd on /sbin/chkconfig --add mysqld (niet nodig vanaf FC4) /sbin/chkconfig mysqld on en starten ze vervolgens op: /sbin/service httpd start /sbin/service mysqld start 3. Vervolgens stellen we een database root paswoord in: mysqladmin -u root password 'new-password' (quotes verplicht!) 4. We dienen nu een aantal beveiligingsmaatregelen te nemen betreffende MySQL: mysql -u root -p DROP DATABASE test; (testdatabase verwijderen) DELETE FROM mysql.user WHERE user = ''; (anonieme toegang uitschakelen) FLUSH PRIVILEGES; 5. We kunnen de server nu testen door een PHP-file aan te maken in /var/www/html/ Een typisch PHP testbestand is
3 http://www.flmnh.ufl.edu/linux/install_apache.htm
13
Installatie SVN server Subversion (svn) is een tool waarmee het versiebeheer van een softwareontwikkelproject uitgevoerd wordt. Het voordeel van deze tool is dat ze makkelijk integreerbaar is met Eclipse (zie verder). Bovendien worden alle commits als atomische (ondeelbare) operaties beschouwd, waardoor onderbroken commit operaties geen corrupte of inconsistente data zullen teweegbrengen. Oorspronkelijk zou de SVN-server op een Windows-platform geïnstalleerd worden, maar door verscheidene problemen zagen we ons genoodzaakt SVN op linux te installeren. Men installeert de server als volgt: 1) Start de package manager met behulp van het volgende commando: system-config-packages De volgende onderdelen moeten aangeduid worden: - Web Server - Development Tools - subversion 2) Men zorgt er vervolgens best voor dat de laatste versie van SVN geïnstalleerd staat: yum update 3) mod_dav_svn is een package dat SubVersion nodig heeft om de DAV-functie van de Apache Web server te kunnen gebruiken. Installeer deze als volgt: yum install mod_dav_svn 4) Wanneer deze functie succesvol geïnstalleerd is, kan men SubVersion opstarten met behulp van het volgende commando: svnadmin 5) SubVersion heeft een directory structuur nodig om repositories, gebruikers en permissies te bewaren. Gewoonlijk worden deze bij elkaar gehouden in een zelfde folder. We maken nu de mappen aan: mkdir /svn mkdir /svn/repos mkdir /svn/users mkdir /svn/permissions 6) We dienen nu Apache als hoofdgebruiker van deze folders in te stellen: chown -R apache.apache /svn 7) We dienen Apache vervolgens mee te delen waar hij de svn repositories kan vinden. Daartoe dienen we het bestand /etc/httpd/conf.d/subversion.conf te wijzigen, zodanig dat ze de volgende inhoud heeft:
DAV svn SVNParentPath /svn/repos 8) We herstarten tenslotte de Apache server: service httpd reload 9) Het aanmaken van een eerste repository kan nu als volgt gerealiseerd worden: svnadmin create /svn/repos/project chown -R apache.apache /svn/repos/project
14
10) Omdat SELinux vaak niet toelaat dat men communiceert met de SVN server, dienen we een aantal maatregelen te nemen: chcon -R -h -t httpd_sys_content_t /svn/repos/project “In recent Linux versions ( including RedHat Enterprise, Fedora and other distributions ) SElinux is optionally enabled on the OS installation. The SELinux architecture enforces many kinds of mandatory access control policies. This module must be disabled to correctly run the @Mail software. Installation problems can occur such as mySQL errors, Perl library errors and restarting Apache with @Mail configuration. If you receive these errors most likely SELinux support is enabled.” 11) We kunnen SELinux als volgt tijdelijk uitschakelen (men dient ingelogd te zijn als root): /usr/bin/setenforce 0 12) Het is echter interessanter SELinux uit te schakelen bij het booten, open daarvoor het volgende bestand: /etc/sysconfig/selinux en zoek daarin de volgende regel: SELINUX=enforcing wijzig dit nu naar het volgende: SELINUX=disabled ( meer informatie op http://atmail.com/view_article.php?num=172 ) 13) Herstart de Apache server: service httpd reload 14) Men kan de SVN server via de browser nu bereiken via het volgende adres: http://yourhostname/svn/repos/project/ (op de stage werd de SVN server geïnstalleerd op de server linus ; de url is daar dus http://linus/svn/repos/project/ )
15
Software Eclipse Eclipse4 is een open-source framework voor software-ontwikkelomgevingen. Daarnaast is Eclipse ook zelfstandig te gebruiken als krachtige Java-ontwikkelomgeving. Eclipse heeft een open structuur waardoor het mogelijk is de functionaliteit uit te breiden door middel van plug-ins. Een van deze plug-ins biedt de mogelijkheid aan versioning te doen (SVN): subclipse. Waneer Eclipse geïnstalleerd is, kunnen we subclipse als volgt inschakelen: 1. Kies in het menu Help voor Software Updates en vervolgens voor Find and install... 2. We kiezen in het popup-scherm voor Search for new features to install 3. In het volgende venster dienen we een New Remote Site in te geven: (slechts een van de twee zal werken afhankelijk over welke versie je van Eclipse beschikt) Name: Subclipse 1.2.x (Eclipse 3.2+) URL: http://subclipse.tigris.org/update_1.2.x of Name: Subclipse 1.0.x (Eclipse 3.0/3.1) URL: http://subclipse.tigris.org/update_1.0.x 4. Wanneer u vervolgens terugkeert naar het vorige scherm met het overzicht, dient u de net aangemaakte site Subclipse aan te vinken, alsook de optie Ignore features not applicable to this environment. De installatie kan nu beginnen. 5. Wanneer de installatie voltooid is, dient de workbench herstart te worden. Zodra dit gebeurd is, open we het Subclipse Repository perspective 6. We maken nu een nieuwe Repository Location aan, die verwijst naar onze SVN server: http://linus/svn/repos/project/ 7. Via het menu dat beschikbaar is voor de verschillende resources kunnen we nu onze projecten synchronizeren met deze repository. Adobe Photoshop en ImageReady Adobe Photoshop is een grafisch programma voor het bewerken van foto's en ander digitaal beeldmateriaal via de computer. Photoshop is beschikbaar voor Mac OS X en Windows. Door velen wordt Photoshop beschouwd als de industriestandaard voor zowel drukwerk en DTP als voor het web wat betreft digitale beeldbewerking. De schermindeling met verplaatsbare paletten (floating palets) is door tal van andere softwaremakers in hun producten overgenomen. Ook het werken met lagen vanaf versie 3 (transparante lagen met objecten - tekst, afbeeldingen, kleuren- die boven elkaar kunnen worden geplaatst waarbij de originele afbeelding intact blijft) is een maatstaf waaraan alle andere grafische pakketten worden afgewogen. Photoshop kan overweg met filters (en ook plugins van derden), maskers, laageffecten enz. Vanaf versie 5 is het programma sterk uitgebreid met functies voor webexport. Zo maakt het aanvullende programma Image Ready het mogelijk afbeeldingen te knippen (slice) met elk een eigen adres (image map) of in tabellen te exporteren, compleet met javascript- en HTML-code. De "bewaren voor het web"-functie kan JPEG-, PNG- of GIFafbeeldingen optimaliseren en comprimeren voor webpublicatie.
4 http://www.eclipse.org/downloads/
16
Microsoft Visual Web Developer 2005 Visual Studio is een programmeerontwikkelomgeving (een Developer Studio) van Microsoft. Het biedt een complete set ontwikkelingstools om computerprogramma's in diverse programmeertalen, zoals Visual Basic en Visual C++, te ontwikkelen voor met name Windows-omgevingen. Het wordt gebruikt om ASP-webapplicaties, XML-webservices, desktop-applicaties en mobiele toepassingen te ontwerpen. Het is uitermate geschikt voor het ontwerpen van Windows-applicaties, omdat bij Visual Studio diverse standaardbibliotheken en MFC-klassenbibliotheken met programmeercode worden geleverd die het mogelijk maken om op een eenvoudige wijze Windows-kenmerken zoals vensters en keuzemenu's aan een programma te geven. PuTTY PuTTY is een vrije telnet- en SSH-client. Het is software waarmee iemand een verbinding kan maken met een andere computer, meestal zijn dit servers met een op UNIX gebaseerd besturingssysteem. PuTTY is een vervanging voor een terminal (ook wel Teletype, TTY genoemd), een domme machine die voor de introductie van de Personal Computer, gebruikt werd om te verbinden met een server. De verbinding tussen de terminalsoftware en de server verloopt tegenwoordig via het SSH-protocol, wat als de veilige opvolger wordt gezien van het verouderde telnetprotocol. We hebben PuTTY gebruikt om te kunnen werken op de linus server, die in een ander lokaal stond. Gantt Project Het programma Gantt Project laat toe om planningen te maken in een Gantt schema. We hebben deze software vooral bij de aanvang van de stage gebruikt om de verscheidene tijdsverdelingen in kaart te brengen.
17
ONTWERP De onderdelen De storage/backup sizing tool bestaat uit een samenwerking tussen verschillende onderdelen, die elk een eigen taak hebben: –
– –
–
het framework: bevat de backup-plugin en de webservice. Het framework maakt het mogelijk dat de tool kan uitgebreid worden naar het leveren van nieuwe diensten. De webservice zal de diensten van de plugin(s) aanbieden naar de buitenwereld. de administratortool: maakt het mogelijk om de specifieke backup/sizing tool plugin te beheren. Via deze tool kan de administrator vragenlijsten aanmaken en beheren. de eindgebruikersinterface: presenteert de diensten van de backup/sizing tool op de website van Source NV. In dit geval houdt dit in dat de bezoekers een of meerdere vragenlijsten kunnen doorlopen om aldus een oplossing op maat aangeboden te krijgen. de databank: bevat alle vragenlijsten
Hieronder vindt u een uitvoerige beschrijving van elk onderdeel.
De verschillende onderdelen van de backup/sizing tool
18
Het framework Het framework is gebaseerd op het Java Plug-in Framework (http://jpf.sourceforge.net/), een open source (LGPL licensed) plug-in infrastructure library voor nieuwe of bestaande Java projecten. JPF laat toe om plug-ins te laden in eenzelfde scherm door het doorgeven van vooraf gedefinieerde schermen. JPF provides a runtime engine that dynamically discovers and loads "plug-ins". A plug-in is a structured component that describes itself to JPF using a "manifest". JPF maintains a registry of available plug-ins and the functions they provide (via extension points and extensions). One major goal of JPF is that the application (and its end-user) should not pay any memory or performance penalty for plug-ins that are installed, but not used. Plug-ins are added to the registry at application start-up or while the application is running but they are not loaded until they are called. Vermits onze storage/backup sizing tool niet met schermen werkt, maar wel een gelijkaardige plugin gedachtengang tewerkstelligt, was enige aanpassing nodig. Het framework bevat ook de webservice die als server zal optreden bij communicatie met externe clients die de resultaten van een bepaalde plugin willen (hier: de vragenlijst). Als webservice hebben we gekozen AXIS25 te gebruiken, vermits deze een van de meest gebruikte frameworks is voor het ontwikkelen van dit type services. Enkele voorname voordelen van Axis2 zijn: –
Snelheid – Axis2 maakt gebruik van een eigen object model en StAX (Streaming API for XML) parsing dat sneller werkt dan de eerdere versies van Apache Axis
–
Weinig geheugengebruik
–
AXIOM – is uitbreidbaar en zeer performant
–
Hot Deployment – maakt het mogelijk Web services en handlers te schrijven terwijl het systeem blijft draaien.
–
Asynchrone Web services
–
MEP Support – ondersteuning van Message Exchange Patterns (MEPs) met ingebouwde support voor de typisch gedefinieerde MEP's uit WSDL 2.0.
–
Flexibiliteit
–
Stabiliteit
–
WSDL support – ondersteuning voor Web Service Description Language versie 1.1 en 2.0.
–
...
5 http://ws.apache.org/axis2/
19
De plugin Wanneer men een plugin wil maken, moet deze een aantal zaken implementeren vanuit het framework. Zo is het onderandere noodzakelijk een startup klasse aan te maken, en te werken met een aantal gedefinieerde objecten zoals vragen, antwoorden en reports (die men naar eigen wens verder kan uitbreiden). Zodra men een plugin geprogrammeerd heeft, kan men deze als volgt koppelen aan het framework: 1) Men dient eerst een JAR-bestand te maken van de plugin. Als voorbeeld nemen we hier aan dat dit jarbestand myplugin.jar heet en dat de klasse StartupPlugin de interface Plugin geïmplementeerd heeft. 2) Plaats het JAR-bestand in de folder /plugins van het framework 3) Open /configuration.xml en voeg de nieuwe plugin toe:
<jarlocation>myplugin.jar <mainclass>StartupPlugin The title of my plugin <description/> 1.0.0
4) Men herstart het framework opdat de plugin geladen kan worden
20
De administratortool De administratortool verzorgt het beheer van de vragenlijsten. Omdat deze tool in Java ontworpen is, kan zij op verschillende platformen uitgevoerd worden, waaronder Windows, Linux, Unix, Mac OS, NetWare, ... Om de verschillende vragenlijsten te kunnen laden en opslaan, communniceert de tool via JDBC met de databank. Om een degelijke opbouw te garanderen, is het programma in drie tiers opgedeeld: databank – domein – grafische inteface. Dit houdt in dat elke tier zijn eigen verantwoordelijkheden heeft: – – –
database – de onderste tier – maakt de verbinding via JDBC met de databank en doet de O-Rmapping. domein – de middelste tier – bouwt de vragenlijst op aan de hand van de objecten die geladen werden uit de databank en geeft deze door aan de GUI gui (Grafische User Interface) – de bovenste tier - geeft de componenten weer op het scherm en laat de gebruiker toe interactief vragenlijsten aan te maken
De communicatie tussen de verschillende tiers verloopt als volgt: De database-tier laadt alle objecten uit de databank in het geheugen en geeft deze door naar de domeinklassen. Vervolgens construeert de domein-tier de vragenlijst met behulp van de geladen objecten. Tenslotte geeft het domein deze vragenlijst door aan de gui, die deze zal visualiseren op het scherm. Om het verschil tussen al deze tiers ook op structureel niveau te behouden, hebben vragen, antwoorden en oplossingen in elke laag een representerende klasse. Zo zal een vraag in de database-tier van het type Question zijn, in de domein-tier van het type NodeQuestion en in de guitier van het type QuestionDropNode. Het komt er eigenlijk op neer dat de QuestionDropNode een NodeQuestion bevat en bijkomde informatie van hoe de node op het scherm weergegeven moet worden. De NodeQuestion bevat op zijn beurt een Question en bijkomende informatie van waar het Question-object zich in de vragenlijst bevindt. In principe kan men de vragenlijst vergelijken met een boom, in die zin dat de vragenlijst die de eindgebruiker te zien krijgt, in feite niets anders is dan een gevolgd pad van vragen en antwoorden doorheen de boom. De grote uitdaging in deze tool lag dan ook in het correct opbouwen en afbreken (lees: opslaan) van deze boom. Om persistentie te garanderen, zullen wijzigingen naar de databank enkel doorgevoerd worden wanneer de gebruiker expliciet kiest om op te slaan. Zolang de gegevens niet opgeslagen zijn, zullen de wijzigingen op de vragenlijst enkel bijgehouden worden in het lokale geheugen. Een voorbeeld van een mogelijke vragenlijst zou het bepalen van een computermodel kunnen zijn. We zouden dan als eerste vraag bijvoorbeeld kunnen stellen tot welk doel de computer gebruikt zal worden, om vervolgens meer doelgerichte vragen te kunnen stellen. Zo is het niet interessant om voor een low-end systeem te gaan vragen welke processor er precies in moet, vermits het nogal evident is dat dat aspect net variabel blijft om met behulp van enige speling de kosten te kunnen drukken.
21
Praktisch gezien komt dit dan op het volgende neer: Het voordeel van deze structuur voor het opbouwen van een vragenlijst, is de modulariteit. Het is duidelijk dat de vragenlijst op deze wijze heel snel en duidelijk kan aangemaakt worden, vermits men snel tot redelijk diepe niveaus vragen kan gaan stellen zonder dat het geheel aan overzicht verliest. Het open- en toeklappen van vragen en onderliggende structuren bevestigt deze overzichtelijkheid. Bovendien worden alle aangemaakte vragen bijgehouden in een pool, namelijk het Orphanage. Het voordeel hiervan is dat wanneer men een vraag uit de pool wijzigt, men op deze wijze alle kopiën van deze vraag ook wijzigt. Op deze wijze voorkomt het programma ook dubbelwerk wanneer dezelfde vraag meerdere malen moet voorkomen in de vragenlijst. Men kan op een analoge wijze kan men de solutions gaan beheren en koppelen aan de vragenlijst. Hierbij kan men gebruik maken van een geïmplementeerde WYSYWYGeditor die het mogelijk maakt om in een Word-alikeomgeving te kunnen werken, waarin er geen kennis van HTML vereist is.
Men kan naar wens ook nieuwe vragenlijsten aanmaken, of bestaande vragenlijsten verwijderen. Wanneer men verbinding maakt met een lege database (die de noodzakelijke tabellen bevat), zal de tool een default vragenlijst aanmaken (genaamd vragenlijst01) waarmee men meteen aan de slag kan. Tenslotte biedt het programma ook een helpfunctie aan, die bereikaar is via de menu's of de sneltoets F1. In principe bevatten de helpfiles de verschillende use cases die ontworpen werden tijdens de ontwikkeling van het programma. Men kan deze bestanden altijd bijwerken door de respectievelijke HTMLdocumenten in de folder /help te wijzigen. De helpbestanden worden geladen en gesorteerd volgens de TITLE-tag. Wanneer men een helpbestand aanduidt, wordt het respectievelijke HTMLdocument geladen in het rechterscherm. Men dient er wel rekening mee te houden dat de standaard HTML parser die de helpfiles inlaadt, redelijk basisch is en waarschijnlijk niet goed overweg zal kunnen met JavaScript en andere client-side scriptingtalen. Wanneer men bijgevolg nieuwe helpbestanden ontwikkelt, dient men rekening te houden met het feit dat de HTML-documenten best geen van deze talen bevatten en ook W3C-compliant zijn.
22
Om een zo breed mogelijke functionaliteit aan de administrator te bieden, heeft de administratortool een aantal bestaande features geïmplementeerd: –
Substance - https://substance.dev.java.net/ - Substance is een open-source project onder de Berkeley Software Distribution (BSD) License. Dit project levert configureerbare look and feel bibliotheken voor Java applicaties. Zo kan de administrator, indien hij dat wenst, de look and feel van de tool wijzigen in het configuratiebestand admintool.properties. De parameter layoutTheme stelt daar in welk thema het programma moet gebruiken. In het programma zelf wordt het juiste thema vervolgens ingesteld in FrameHandler mbv de volgende regels code: try { LookAndFeel laf = config.getLayoutTheme(); UIManager.setLookAndFeel(laf) ; } catch (UnsupportedLookAndFeelException ulafe) { log.error("Substance failed to set: " + ulafe.getMessage()); } catch (Exception e) { log.error("An unknown error occurred: " + e.getMessage()); }
–
LOG4J - http://logging.apache.org/log4j/docs/ - log4j maakt het mogelijk om at runtime programma's te debuggen op verschillende niveau's. Het voordeel hiervan is dat de gebruiker via een configuratiebestand kan instellen wat voor foutmeldingen hij wil zien (all – debug – info – warn - ... ) en wat er met die foutmeldingen moet gebeuren. Zo kan men deze bijvoorbeeld wegschrijven naar een logbestand, een log4j server, een daemon, ... Een laatste belangijk voordeel is dat deze logging enorm snel gebeurt in vergelijking met andere logging-technologieën. In de administratortool kan men deze logging inschakelen in het configuratiebestand admintool.properties via de parameter logLevel. De logging wordt standaard weggeschreven in HTML-formaat naar een logbestand, en wordt dagelijks gecatalogiseerd in verscheidene logbestanden. Eventueel kan men de locatie van deze logbestanden wijzigen mbv de parameter logDir. De LoggerFactory regelt het beheer van de logbestanden en is zo ingesteld dat iedere klasse een eigen logging stack heeft. Wanneer een klasse voor het eerst aangeroepen wordt, zal deze aan LogFactory zijn logging stack aanvragen. Elke keer wanneer er vervolgens een fout optreedt in die klasse, zal de stack opgehoopt worden met een foutmelding. Vervolgens zal log4j deze foutmelding meteen wegschrijven naar het logbestand zodat de administrator steeds op de hoogte kan blijven van eventuele foutmeldingen. Op de volgende wijze kan een klasse zijn logger aanvragen: private Logger log = LoggerFactory.getInstance().getLog(getClass());
Wanneer er vervolgens iets moet gelogd worden, kan dit als volgt: log.info("dit is informatie log.error("dit is een foutmelding log.fatal("dit is fatale fout
- log type INFO"); – log type ERROR"); - log type FATAL");
23
–
Ekit - http://www.hexidec.com/ekit.php – Ekit is een gratis open-source Java HTML editor dat een WYSYWIG-omgeving opstelt voor het bewerken van HTML-bestanden. Bovendien kan men deze vervolgens niet alleen laden en opslaan, maar ook serializeren en converteren naar RTF. In de tool kan men ekit terugvinden onder com.hexidec.ekit. De administratortool maakt gebruik van Ekit bij de solutions, waar het noodzakelijk is dat men een degelijke opmaak kan opbouwen, zonder dat enige kennis van HTML noodzakelijk is. Om deze tool ook te kunnen implementeren, was het nodig enige aanpassingen te maken aan het bestaande pakket, dat oorspronkelijk als applet en applicatie op zich was geschreven. Wanneer een solution aangemaakt wordt, zal de tool steeds een HTML-bestand aanmaken in de tmp-folder. De inhoud van dat HTML-document zal vervolgens naar de SQL database overgebracht worden wanneer de administrator de solution opslaat. Het voordeel van deze aanpak is dat de administrator ook vooraf aangemaakte HTML documenten als solution kan laden, en allerlei stijlbladen lokaal toepassen op deze solution.
–
Jericho HTML parser - http://jerichohtml.sourceforge.net/ - Jericho HTML parser is een Java bibliotheek die manipulatie van HTML documenten toelaat. Deze parser is event driven noch tree based maar combineert eenvoudige zoekfuncties met efficiënte tagherkenning en tag positioneringscache. Het voordeel hiervan is dat de parser veel minder geheugen inneemt als een DOM-parser en dat ze meer mogelijkheden biedt dan een SAX-parser. Vooral het eerste argument was doorslaggevend voor de keuze van deze parser. De parser wordt immers gebruikt voor het laden van de helpbestanden, welke in HTML-formaat opgeslagen zijn. De belangrijkste bewerking die de parser op deze documenten moet uitvoeren, is het uitlezen van de TITLE-tag opdat het onderwerp van het helpbestand kan bepaald worden.
–
Connector/J - http://www.mysql.com/products/connector/j/ - Connector/J is een native Java driver (van type IV) dat Java Database Connectivity (JDBC) aanroepen vanuit een MySQL database vertaalt. Het resultaat is dat men vanuit een Java omgeving SQL commando's kan sturen naar een database, die zelfs niet op dezelfde computer aanwezig hoeft te zijn. Het aanmaken van de connectie met de databank gebeurt in Database als volgt: protected void connect (DatabaseConnection databaseConnection { try { // load database driver class Class.forName( JDBC_DRIVER ); //establish connection to database Connection conn = DriverManager.getConnection( databaseConnection.getUrl(), databaseConnection.getLogin(), databaseConnection.getPassword() ); // create Statement for querying database Statement stmt = conn.createStatement(); // notify the observers notifyObservers(); } catch (Exception e) { // handle the error } }
24
De database We hebben beslist MySQL als database te gebruiken, een open source relationele database. Het voordeel van deze database is dat ze snel werkt vermits ze gebruik maakt van de MyISAM opslagmotor. Een kort overzicht van het ERD: een vragenlijst bevat meerdere vragen, die op hun beurt uit 2 of meerdere antwoorden bestaan. Een antwoord kan vervolgens een nieuwe vraag bevatten of een solution.
Elke vragenlijst krijgt een eigen databank toegewezen in MySQL. Op die manier heeft elke vragenlijst een volledig afgescheiden omgeving en treden fouten minder gemakkelijk op. Elke database (vragenlijst) bestaat uit 4 tabellen: een question-tabel, een answer-tabel, een solutiontabel en een solutionpath-tabel. Op de volgende pagina vindt u een korte beschrijving van hun inhoud.
25
De question tabel: Deze tabel bevat 2 attributen en vertegenwoordigt de vragen. question_id stelt de primaire sleutel voor, en question_formule bevat de eigenlijke vraag. De answer tabel: Deze tabel bevat 4 attributen en vertegenwoordigt de antwoorden. Bovendien zorgt deze tabel er ook voor dat vragen en antwoorden aan elkaar gekoppeld worden. Daartoe maakt zij gebruik van question_parent_id en question_child_id, die beide verwijzen naar het ID van een bepaalde vraag. De primaire sleutel van deze tabel is answer_id. Tenslotte bevat answer_formule het antwoord op de vraag. De solutionpath tabel: Deze tabel bevat 3 attributen, en dient als link tussen de antwoorden en de oplossingen (solutions). De attributen zijn solutionpath_id, de primaire sleutel, solution_id, die verwijst naar een solution, en answer_id, die naar de vraag verwijst. De solution tabel: Deze tabel bevat 3 attributen en bevat de verschillende solutions. De attributen zijn solution_id, de primaire sleutel, solution_title, de titel van de solution, en solution_text, de inhoud van de solution (html).
De opbouw van de boom uit deze databank gebeurt op een heel eenvoudig wijze. Elk antwoord heeft een link naar de vraag die hem voorafging en volgt. Een vraag die bijgevolg geen antwoord boven hem staan (maw question_parent_id heeft dan als waarde 0) heeft, is automatisch de eerste vraag die gesteld wordt. Via restricties (constraint in mysql) wordt dit afgedwongen in de database, vermits er maar één vraag de eerste kan zijn. Naast de losse databanken per vragenlijst, is er ook een index databank die bijhoudt welke vragenlijsten er allemaal bestaan. Deze databank bevat één tabel, namelijk vragenlijsten. Deze bestaat uit 3 attributen: db_id, de primaire sleutel, db_name, de naam van de databank met de vragenlijst, en db_description, een omschrijving van de vragenlijst.
26
De front-end Inleiding De front-end van de tool werd gemaakt in ASP.NET, dezelfde taal als die waarin de website van Source gemaakt is. Het zou onverstandig geweest zijn om te kiezen voor een volledig nieuwe omgeving (zoals bijvoorbeeld Flash), omdat dit moeilijker integreerbaar zou zijn. Bovendien heeft Flash ook het nadeel dat ze enkel werkt indien de client ook Flash geïnstalleerd heeft staan, terwijl ASP.NET gedefinieerde HTML-paginas genereert die elke browser zo kan lezen. We hebben dan ook gekozen zoveel mogelijk de sterke punten van het .NET platform uit te buiten. Daarom maken we gebruik van webservices en user controls. User controls zijn componenten die je overal opnieuw kan gebruiken. Je maakt ze op een plaats aan en geeft ze daar alle nodige logica.
De user control
Nadat je de user control hebt aangemaakt moet je enkel nog maar op de plaatsen waar nodig deze control oproepen.
27
Men kan – indien nodig blijkt – een aantal parameters wijzigen van de user control. Zo initialiseert men in onderstaande Page_Load-methode de parameters van de vragenlijst (namelijk de server waarop de MySQL server draait, en de naam van de vragenlijst die geladen moet worden).
Het grote voordeel van deze manier van werken is dat men aanpassingen op slechts één plaats door dient te voeren. Het doorlopen van de tool : De gebruiker krijgt na het starten van de tool de eerste vraag van de aangeduide vragenlijst te zien:
28
De gebruiker dient een antwoord te selecteren en moet dan op next klikken. Daarna zal de gebruiker een nieuwe vraag te zien krijgen. Indien hij alle vragen beantwoord heeft, zal de site een solution tonen.
Een solution bestaat uit een titel en een beschrijving (opgesteld in HTML), die links, fotos of zelf een pdf-bestand kan bevatten. Indien de solution niet past in het scherm zal er een scrolbar verschijnen.
29
De template We hebben gekozen om een relatief neutrale template te maken voor de vragenlijst. De reden hiervoor is dat de template binnen de frames van source geplaatst zal worden, welke op zich al wat kleur bevatten. Bovendien leest zwart op wit (hier lichtgrijs) het beste, wat ook de gebruiksvriendelijkheid ten goede moet komen. Het voordeel van een template is ook dat de hele vragenlijst er hetzelfde uit blijft zien wanneer er een andere vraag getoond wordt. De vraag en de antwoorden zullen zich namelijk steeds centreren in het linkergedeelte. Wanneer de gebruiker een antwoord aanduidt, moet hij vervolgens steeds voor next kiezen om een volgende vraag te zien. Het nut hiervan is dat de gebruiker minder snel rap zal doorklikken om snel een antwoord te zien te krijgen. Het doel was immers dat de gebruiker steeds zou nadenken over het antwoord dat hij dient op te geven. Daarnaast kan de gebruiker ook steeds terugkeren naar de vorige vraag, of de vragenlijst opnieuw starten. We kunnen dus stellen dat het bewegen doorheen de boom event-driven is.
30
De template voor de website werd gemaakt met behulp van Photoshop en ImageReady, twee grafische programma's van Adobe die het bewerken van foto's en ander digitaal beeldmateriaal toelaten. Het voordeel van deze software is dat aanpassingen zeer eenvoudig blijven, vermits de template uit verschillende modules (layers) bestaat die elk vrij aangepast kunnen worden.
De implementatie met ImageReady laat vervolgens toe om snel imagemaps aan te maken, welke noodzakelijk zijn in HTML om de verscheidene gebieden van de template te kunnen afbakenen. Ook werd de volgende hulpbronnen gebruikt bij het maken van de template: – –
Small size layout - Tutorial #89 uit 100 Tutorial Marathon http://www.talk-mania.com/showthread.php?t=24372 Blend Forty-III http://www.deviantart.com/deviation/19800432/
31
DIAGRAMMEN Het framework Enkele belangrijke klassen uit het framework zijn: XmlLoader leest een XML-bestand waarin de plugins gedefinieerd zijn. Vervolgens zal deze klasse voor elke plugin een PluginLocation maken, die oa bijhoudt waar het jar-bestand met de plugin staat en welke klasse de mainklasse is. PluginLoader is het runtime onderdeel van het framework. De belangrijkste verantwoordelijkheid van de manager is het activeren van plug-ins (plug-in code laden en de plug-in initializer klasse laden) en het beheren van dependencies (nvt in ons eigen framework). Manager beheert de verschillende plugins die door XmlLoader gedefinieerd werden. De manager treedt bijgevolg op als een interface, waarbij men de verschillende plugins kan (de)activeren. Om een algemene in- en uitvoer van en naar het framework te kunnen organiseren, is het belangrijk dat er bepaalde standaarden gebruikt worden. Zo zijn we overeengekomen dat elke plug-in een of meerdere vragen naar de gebruiker zal sturen, die de gebruiker moet beantwoorden en vervolgens terugsturen. Ook stelden we vast dat een plug-in zich in drie statussen kan bevinden. De statussen De implementatie van deze statussen gebeurt met behulp van het state pattern: De verschillende mogelijke statussen zijn: – – –
de plug-in is het probleem aan het oplossen – solving de plug-in heeft het probleem opgelost – solved de plug-in heeft het probleem niet kunnen oplossen – unsolved
Zodra een vragenlijst opgestart wordt, bevindt zij zich in de status Solving. Elke plug-in kan nu een object bevatten van het type PluginStatus die aangeeft in welke status de geladen plug-in zich momenteel bevindt. De PluginManager zal steeds op de hoogte zijn welke plugin zich in welke status bevindt.
32
De objecten Vermits de tool steeds vragen aan de eindgebruiker zal stellen, waarop deze dan een antwoord moet geven, kan men het ontwerp van het framework vereenvoudigen tot de volgende objecten: – –
–
vragen (Question) antwoorden (Answer) – er bestaan hier twee mogelijkheden: * statement: het antwoord moet gekozen worden uit een bestaande lijst * questionnaire: het antwoord moet ingetypt worden (meestal bij een open vraag) oplossingen (Solution) – worden bijeengebracht in een report
Een vraag kan steeds 2 of meerdere antwoorden bevatten, welke op zijn beurt opnieuw een vraag bevat. Dit levert het volgende klassendiagram op voor de vragen en antwoorden:
33
De manager De manager bevindt zich in het framework en zorgt dat de plugins geladen kunnen worden. Het concept is gebaseerd op het JPF project. FrameworkFacade en PluginLoader zijn beide singletons, waardoor ze een uniek en eenduidig aanspreekpunt hebben. Men kan hun instantie opvragen door middel van getInstance(), die volgens het singletonpattern de instantie zal aanmaken wanneer deze nog niet bestaat. Daarnaast maken de klassen ook gebruik van logging, een functie die Apache geleverd heeft en slechts geïmplementeerd diende te worden.
34
De XML Loader De klasse PluginLoader zal een instantie van XMLLoader aanmaken om het configuratiebestand configuration.xml uit te lezen. In dat bestand staan immers de plugins gespecifieerd die het framework moet laden bij het opstarten. De plugins zelf worden standaard in de folder /plugins afzonderlijk in een JAR-bestand bijgehouden en erven allen van de framework-instantie. Om te garanderen dat het XML-bestand correct ingelezen kan worden, werd een XSD-schema opgesteld: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="plugins" type="pluginstype" /> <xs:element name="plugin" type="plugintype" /> <xs:element name="jarlocation" type="xs:string" /> <xs:element name="mainclass" type="xs:string" /> <xs:element name="title" type="xs:string" /> <xs:element name="description" type="xs:string" /> <xs:element name="version" type="xs:string" /> <xs:complexType name="pluginstype"> <xs:sequence> <xs:element name="plugin" minOccurs="1" maxOccurs="unbounded" /> <xs:complexType name="plugintype"> <xs:sequence> <xs:element name="jarlocation" minOccurs="1" maxOccurs="1" /> <xs:element name="mainclass" minOccurs="1" maxOccurs="1" /> <xs:element name="title" minOccurs="1" maxOccurs="1" /> <xs:element name="description" minOccurs="1" maxOccurs="1" /> <xs:element name="version" minOccurs="1" maxOccurs="1" />
Een voorbeeld van een XML-configuratie levert dan het volgende op:
<jarlocation>plugin2.jar <mainclass>BackupPlugin Storage/Backup sizing tool <description/> 1.0.0
35
De webservice Een webservice kan men beschrijven als een applicatiecomponent dat toegankelijk is via de standaard webprotocollen. Een webservice biedt de mogelijkheid om via een client een dienst op te vragen aan een remote server. Deze aanvragen gebeuren meestal via het Internet. Technisch gezien zijn webservices software componenten, die via een netwerk kunnen worden aangeroepen om daarmee de services (diensten) van een bedrijf aan te roepen. Voor het aanroepen van webservices wordt gebruik gemaakt van gestandaardiseerde protocollen, welke volledig open en vrij te gebruiken zijn. Daarbij gaat het om de WSDL standaard voor het beschrijven van een webservice en XML, HTTP en SOAP voor het communiceren met een webservice. De webserivice langs de java zijde bestaat uit 3 onderdelen: de sessionhandler, de webservice klasse en de webserver zelf. Aangezien een webservice langs de java kant ook stateless is, werken we opnieuw met een proxyklasse: de sessionhandler. De sessionhandler is een singeltonklasse. Dit wil zeggen dat iedereen die deze klasse aanspreekt altijd met hetzelfde object werkt. Op deze manier kunnen we ervoor zorgen dat elke aanvraag die via de webservice binnenkomt, door de zelfde instantie behandeld word. ⇒ Het aanmaken van een sessie private static int SESSIONCOUNT = 15; public String generateSession(String server,String database) { Random r = new Random(); curent = r.nextInt(); while(sessions.containsKey(String.valueOf(curent))) { curent = r.nextInt(); } String code = String.valueOf(curent); sessionkeys.add(code); sessions.put(code,StartUp.getInstance().getManager().getActivePlugins().get(0). start()); sessions.get(code).setSettings(server,database,"",""); System.out.println(sessions.get(code).getQuestion().getDescription()); System.out.println(server + " " + database); if(sessionkeys.size()>SESSIONCOUNT) sessionkeys.remove(0); return code; }
Deze methode beheert de sessies. In de statische variabele SESSIONCOUNT wordt ingesteld hoeveel simultane sessies er geladen kunnen worden in het geheugen. Vervolgens wordt er at random een getal gegenereerd en toegewezen aan de sessie. Deze zal de sessie uniek identificeren. Wanneer de sessie tenslotte aangemaakt wordt, wordt de gevraagde vragenlijst geladen.
36
⇒ Het herladen van de plugins public void reloadPlugins() { StartUp.getInstance().reload(); }
We hebben er voor gezorgd dat indien men de vragenlijst herlaadt, dat de huidige gebruikers daar geen last van zullen ondervinden. Wanneer de plugin herstart wordt, wordt de lijst met openstaande sessies namelijk niet aangetast. ⇒ Het communiceren met een plugin public String getSolutionTitle(String session) { if(sessions.get(session).getReport().getSolutions().get(0)==null) return ""; else return sessions.get(session).getReport().getSolutions().get(0).getTitle(); }
De session key maakt communicatie met de plugin mogelijk. Elke klasse die een interactie met de plugin wil uitvoeren geeft daartoe die key mee. Op deze wijze wordt de juiste plugin uit de lijst geladen en kan er interactie optreden. Alle acties werken op deze manier. ⇒ De Webservice klasse De webservice klasse bevat ook geen logica. Deze klasse krijgt requests door en geeft daar een antwoord op terug. Omdat deze methodes stateless werken, spreken we hier de sessionhandler aan. Wanneer we deze handler oproepen, vragen we (in onderstaand geval) de solution (oplossing voor de gevolgde vragenlijst) van de plugin. De plugin kan de juiste solution ophalen dankzij de meegegeven unieke session key.
public String getSolutionBody(String session) { return SessionHandler.getInstance().getSolution(session); }
Het ophalen van de huidige vraag en antwoorden gebeurt op een analoge wijze.
37
⇒ De webservice Als webservice hebben we gekozen voor Axis2 van Apache, aangezien deze ons de meeste mogelijkheden bood. Bovendien staat Apache bekend voor het leveren van degelijke software en hebben we reeds andere software van Apache in onze applicatie gebruikt (oa Log4J). Axis2 is volledig gebaseerd op open standaarden en is zeer flexibel in gebruik. Daarnaast ondersteunt het ook ten volle WSDL (Web Servoce defenition language). WSDL beschrijft alle acties en communicatie tussen web service en web client in XML (zie verder...) Een ander groot voordeel van Axis2 is dat er plugins voor in eclipse gemaakt zijn. Op deze manier is het heel eenvoudig om vanuit eclipse een java programma om te bouwen tot een web service. Om een service te maken van een java programma moeten we de axis2 service plugin 6 gebruiken. Deze gaat een JAR-bestand genereren van de Java-applicatie, en de klasses die voor de communicatie dienen beschrijven in een XML-bestand.
In Eclipse doet men dit als volgt: Eerst selecteert men welke applicatie men wil inpakken. Indien de Java-applicatie gebruik maakt van externe bestanden om gegevens uit te lezen, moet men de optie “include .class files only” uitvinken.
6 Zie http://ws.apache.org/axis2/tools/1_2/eclipse/servicearchiver-plugin.html
38
Vervolgens dient men aan te duiden welke methodes er gepubliceerd mogen worden. Het kan namelijk zijn dat niet alle (publieke) methodes zichtbaar mogen zijn voor de webservice.
Nadat alles ingegeven, dient men tenslotte de locatie van het archief aan te geven.
Nu is de webservice klaar. 39
Wanneer de webservice aangemaakt is, verschijnt er een XML-bestand genaamd service.xml :
Dit bestand beschrijft alle beschikbare methodes, en kan eventueel ook manueel aangepast worden door de ontwikkelaar.
40
Wanneer men de webservice raadpleegt via de browser, krijgt men het volgende:
We zien hier dat de verschillende methodes in WSDL beschreven worden. Op deze manier kan elke client die WSDL begrijpt, de methodes aanspreken.
41
Het laden van de plugins Tijdens het laden van de plugins zal de Manager eerst een lijst bekomen met de beschikbare plugins die voor handen zijn. Deze worden uitgelezen door XmlLoader uit het bestand configuration.xml. Vervolgens zal de Manager voor iedere bestaande plugin aan ObjectFactory de opdracht geven om deze in te laden. Deze stuurt vervolgens op zijn beurt de opracht door naar de JarClassLoader. De JarClassLoader zal het bijhorende JAR-archief van de plugin inladen en daar een instantie van maken indien de hoofdklasse erft van Plugin.
42
43
Het aanmaken van een sessie Wanneer we een sessie aanmaken, zal de SessionHandler de startuphandler oproepen. Deze klasse zorgt ervoor dat er slechts één instantie aangemaakt kan worden van de plugin manager. Op deze manier worden alle bruikbare plugins maar eenmaal geladen in het geheugen. Vervolgens vraagt de SessionHandler via de startup klasse (delegatie) aan de manager om een exacte kopie van de gekozen plugin. Deze zal hij dan bewaren en gebruiken indien wanneer er interacties met de plugin dienen uitgevoerd te worden.
44
45
Een actie uitvoeren via de webservice Wanneer een derde partij met de webservice wil communiceren, zal dit gebeuren via de SessionHandler. Aangezien deze klasse een singleton klasse is, zal de gebruiker via de sessionkey altijd op dezelfde plugin een actie uitvoeren.
46
De plugin De objecten De plugin wordt geïmplementeerd door het framework en bevat bijgevolg extenties van de vooropgestelde klasses daaruit. Zo erft BackupQuestion van Question, BackupAnswer van Answer en BackupReport van Report. Net zoals in de database, bevat een BackupQuestion steeds een BackupAnswer. Een BackupAnswer kan op haar beurt ofwel een BackupReport, ofwel een BackupQuestion bevatten. Deze wordt dan opgeslagen in een object ChildNode. Bovendien bevat elk object steeds een verwijzing naar zijn ouder, hetgeen de verbinding tussen BackupReport en BackupAnswer, en tussen BackupAnswer en BackupQuestion verklaart.
De database De databaseverbinding van de plugin wordt op een gelijkaardige manier tot stand gebracht als bij de administratortool (zie verder). We gaan daar hier dus niet verder op in.
47
De opstartklasse Daarnaast bevat de plugin ook een implementatie voor de gestelde Plugin, namelijk BackupPlugin. Deze klasse zal de plugin in orde stellen wanneer deze door het framework aangesproken wordt. Daartoe maakt zij verbinding met de database en roept zij de FlowChart klasse aan opdat die de verschillende objecten zou laden naar het geheugen. Deze objecten worden elk in een HashMap bewaard (questions, answers, solutions, solutionpaths) opdat ze snel aanspreekbaar zijn en om deze reden ook niet in een boomstructuur geplaatst dienen te worden, hetgeen redelijk veel resources in beslag zou nemen wanneer er meerdere clients geconnecteerd zijn met de webserver. Om ook snel te kunnen terugkeren naar vorige en volgende vraag, worden ook de child- en parentanswers in een hashmap bewaard. Bij elke stap zal de flowchart vervolgens controleren in welke toestand de vragenlijst zich bevindt. Wanneer hij een antwoord tegenkomt zonder nieuwe vraag of solution, zal hij zich als Unsolvable verklaren, terwijl hij in het andere geval (bij een solution) op Solved komt te staan. Standaard staat de status in Solving modus. Tenslotte kan men heel eenvoudig een doorlopen pad achterhalen mbv de lijst questionpath, hetgeen de plugin ook uitbreidbaar maakt. Wanneer men immers zou beslissen om de gevolgde paden te gaan loggen, dan kan men – mits enige aanpassing – deze lijst hiertoe gebruiken.
48
Men kan nu op zeer eenvoudige wijze gegevens ophalen uit de vragenlijst: – getQuestion zal de huidige vraag ophalen – undoLast keert terug naar de vorige vraag – getReport zal de solution ophalen voor de huidige vraag. Voor deze plugin is het enkel interessant deze methode aan te roepen wanneer de status van de plugin op Solved staat. In de andere gevallen zal er immers geen solution beschikbaar zijn – setResponse zal de volgende vraag laden aan de hand van een meegeleverd antwoord. Hieronder vindt u een voorbeeld waarin er een solution gevraagd wordt aan BackupPlugin:
49
De mapper De mapper uit de plugin gaat de relationele tabellen uit de databank lezen en omzetten naar objecten. Deze objecten gaat de mapper vervolgens niet in een tree plaatsen, maar per sleutel sorteren in een TreeMap. Vermits elk object uit deze mappen geselecteerd zal worden aan de hand van hun sleutel, staat deze methode garant voor een snelle afhandeling.
Het voordeel van deze aanpak is dat het heel wat kostbare processortijd (en dus ook toegangstijd) en bandbreedte uitspaart. Voor elke client die met de webserver communiceert, wordt er immers een kloon van de plugin aangemaakt, die elk het doorlopen van een vragenlijst door een client verzorgt. Vermits elk object die over het netwerk verstuurd wordt, heel dicht aanleunen bij de objecten uit de relationele databanken, houdt dit in dat de data die over het netwerk verstuurd wordt beperkt blijft. De webserver heeft ook geen idee welke vraag er volgt op een andere, en moet steeds een antwoord sturen naar de webservice vooraleer hij een nieuwe vraag kan krijgen.
50
51
De administratortool De actionlisteners De actionlisteners uit de administratortool vormen voorname klassen bij het verwerken van de verscheiden acties. Hieronder vindt u een kort overzicht van de verschillende actionlisteners en hun functies: De TreeMouseListener-klasse luistert naar muis events op de tree. Als de gebruiker klikt op een node, dan zal deze klasse aan de aangeklikte node vragen welke CRUD-acties er mogen uitgevoerd worden en deze vervolgens in een menu aan de gebruiker tonen.
Onderstaande SSD toont hoe TreeMouseListener een event opvangt, nadat een muisevent getriggerd werd. Indien het om een rechtermuisklik blijkt te gaan, zal de luisterklasse het menu opvragen aan de aangeklikte dropnode via getCrudmenu. Vervolgens zal hij het menu weergeven in een popup.
52
De PopupMenuActionListener-klasse luistert naar welke actie de gebruiker geselecteerd heeft nadat hij het popup menu te zien kreeg. Vervolgens zal deze listener bepalen welke acties er moeten ondernomen worden. De belangrijkste methodes zijn : Add_question(): deze methode zal de gebruiker een vraag laten invoegen, waarna hij deze zal controleren op basis van een aantal voorwaarden. Daarna zal hij de gebruiker vragen om een aantal mogelijke antwoorden in te geven (minimaal twee). Delete_question(): deze methode gaat een vraag verwijderen. Eerst zal nagekeken worden of de vraag in de boom of het orphanage zit. Indien de vraag uit het orphanage komt, zal deze vraag ook overal uit de boom verwijderd worden. Delete_answer(): deze methode gaat een antwoord verwijderen. Eerst wordt er gekeken of de vraag waar dit antwoord bijhoort minimaal 3 antwoorden bevat. Vervolgens wordt er nagegaan of de bijhorende vraag uit het Orphanage, dan wel uit de boom komt. Indien het antwoord uit het orphanage komt, zal dit antwoord ook overal uit de boom verwijderd worden (omgekeerd niet). Change_answer_formula() : deze methode gaat de beschrijving van het antwoord wijzigen. Er wordt eveneens gecontroleerd of het nieuwe antwoord al niet bij dezelfde vraag bestond. Change_question_formula(): deze methode gaat de beschrijving van de vraagstelling wijzigen. Er wordt eveneens gecontroleerd of de nieuwe vraagstelling niet dezelfde is als een bestaande. Remove_clones(): Deze methode zorgt ervoor dat een node niet meer gekend is bij zijn clones en dat hij zijn clones ook niet meer kent. De SolutionPopupActionListener-klasse werkt zoals de PopupMenuActionListener-klasse, maar is specifiek aangepast voor solutions.
De SolutionEditActionListener-klasse luistert naar de acties die de administrator uitvoert wanneer hij een solution wijzigt.
53
De database De database-verbinding bestaat uit een aantal klassen, die elk een eigen taak hebben. De belangrijkste hiervan zitten in /database , namelijk de klassen DatabaseInterface, Database, DatabaseFacade en TransactionManager. Database – die de inteface DatabaseInterface implementeert – communiceert rechtstreeks met de database via JDBC. Daartoe heeft zij een connectieobject van het type DatabaseConnection, die de details voor de verbinding met een database bijhoudt.
Opdat andere klasses eenvoudig zouden kunnen communiceren met Database, hebben we een facade gemaakt, namelijk DatabaseFacade. Deze bevat allerlei eenduidige methodes die bijvoorbeeld door de verschillende mappers gebruikt kunnen worden. Zo gebruikt elke mapper (zie verder) de methode loadObjects om een tabel uit te lezen. Wanneer eenduidige methodes niet mogelijk zijn, is het mogelijk om ook via de facade rechtstreeks SQL code in te voeren via de methodes executeActionQuery. De databaseFacade bevat een pool van twee databases: enerzijds is er de database die de vragenlijsten indexeert, anderzijds de database die een bepaalde vragenlijst bevat. Deze tweede database-object kan regelmatig veranderen, namelijk bijvoorbeeld wanneer men een nieuwe vragenlijst aanmaakt en daarin gaat werken. Elke wijziging in een vragenlijst zal bijgevolg enkel invloed hebben op de tweede (variabele) database, terwijl elke wijziging op een vragenlijst enkel gevolgen zal hebben in de eerste (statische) database. 54
Een andere belangrijke klasse, is de klasse TransactionManager. Deze klasse zal ervoor zorgen dat de vragenlijst uit het geheugen opgeslagen kan worden naar de database. Bij het opslaan zullen eerst alle tabellen geledigd worden met het flush commando. Vervolgens zal de manager achtereenvolgens de vragenlijst zelf, de orphan vragen en de orphan solutions wegschrijven naar de database. Het wegschrijven wordt gestopt zodra er een fout optreedt, wat als voordeel heeft dat men op die manier makkelijk kan achterhalen wanneer het opslaan juist faalde, zonder te veel data kwijt te zijn (de data die wel weggeschreven is, is steeds consistent vermits de boom als het ware doorbladerd wordt tijdens het wegscrhrijven. Een fout betekent dus dat een bepaald deel van de boom niet opgeslagen zal zijn). Hieronder vindt u een klassendiagram van beide klassen:
Tenslotte bevat de package /database nog twee innerpackages, namelijk mapper en tables. Deze laatste package bevat een klasse voor elke tabel die in de databank aanwezig is: Question, Answer, Solution, SolutionPath en Vragenlijst. De mappers zullen hieronder besproken worden.
55
De mappers De mappers bevinden zich in /database/mapper. Elke mapper die de objecten uit de databank zal lezen en naar objecten zal vertalen, implementeert de klasse Mapper. Bovendien is elke mapper ook een singletonklasse vermits ze een cache bevatten met de geladen objecten uit de database. Daarnaast is elke mapper ook een Observer vermits ze hun cache moeten vernieuwen wanneer er geconnecteerd wordt met een andere database. Elke mapper heeft methodes voor de gebruikelijke CRUD-operaties zoals insert, update en delete. Daarnaast zijn er een aantal andere methodes gedefinieerd die het laden van de objecten tewerkstelligen.
De methode createNewTableFor zal ervoor zorgen dat een nieuwe tabel aangemaakt wordt van het type dat de mapper verzorgt. Deze methode zal gebruik maken van de constante TABLECREATECMD om de tabel correct aan te maken. Wanneer een tabel geledigd moet worden, kan dit snel bereikt worden mbv. flush.
56
Het opbouwen van de tree Wanneer de mappers de objecten geladen hebben naar het geheugen, is het vervolgens de taak van TreeFactory om de objecten in een boomstructuur te gaan plaatsen. Naar buiten toe heeft deze klasse slechts één publieke methode, namelijk createTree. Wanneer men deze methode oproept, krijgt men de vragenlijst terug, waarin de vragen, antwoorden en solutions zitten. Deze methode gaat eerst een rootantwoord aanmaken (niet zichtbaar naar buiten deze methode toe) waaraan vervolgens rootvraag zal hangen. In de databank kan men dit rootantwoord herkennen aan de answerformule 'rootitem' en de question_parent_id met waarde 0. Vervolgens gaat het programma recursief de boom doorlopen (depth-first algoritme) om de vragen en antwoorden in de boom te plaatsen. Tenslotte zullen ook de solutions aan de boom gekoppeld worden met behulp van expandSolutions.
public static NodeQuestion createTree() { Answer answer = locateRootAnswer(); if (answer == null) return new NodeQuestion(); //recursieve methode uitvoeren voor het laden van de kinderen NodeAnswer rootanswernode = new NodeAnswer(answer); expandAnswers(rootanswernode); expandSolutions(rootanswernode.getChildQuestion()); return rootanswernode.getChildQuestion(); }
De klasse DomainCache bouwt met behulp van de mappers een cache van het orphanage op. Daartoe vraagt zij eerst aan de QuestionMapper met de methode getOrphans een lijst met vragen die los hangen. Vervolgens zal hij vraag per vraag overlopen en opzoeken welke antwoorden, die hij aan AnswerMapper gevraagd heeft, bij die respectievelijke vraag horen. Wanneer het laden van de orhpan vragen voltooid is, geeft de DomainCache deze terug in een lijst.
57
Het opbouwen van de gui De hele gui wordt beheerd via de FrameHandler klasse. Deze klasse maakt bij het opstarten van de applicatie een frame van het type MainFrame aan, en verzorgt ook de tray. De frame zelf is het venster dat op het scherm getoond zal worden, en bijgevolg alle componenten correct moet kunnen laden. Om deze componenten gemakkelijk te kunnen beheren, bevat MainFrame één panel, waarin elk afzonderlijk onderdeel vervolgens zijn inhoud kan in plaatsen. Wanneer de gebruiker dan kiest om een andere component te laden, kan het programma eenvoudig de inhoud van het huidige panel wissen, en de nieuwe inhoud opbouwen. Dit gebeurt dan door middel van de methode setMainPane.
Deze methode zal in feite zijn taak delegeren naar de panel zelf, die vervolgens de taak zal afhandelen: public void setMainPane(JSavePanel panel) { pnlMain.setPanel(panel); }
De panel zal niets anders doen dan zijn inhoud ledigen en opnieuw opbouwen. De inhoud bestaat steeds uit twee componenten, enerzijds de meegegeven panel, anderzijds een statusbalk die de gebruiker op de hoogte houdt van eventuele foutmeldingen. public void setPanel(JSavePanel panel) { this.panel = panel; this.removeAll(); this.add(panel); this.add(feedbackLabel); this.updateUI(); }
58
De nodes
Om in een tree componenten te kunnen verslepen en bepaalde afbeeldingen te kunnen geven, zijn er een aantal methodes nodig. Daarom hebben wij besloten om de klasse DropNode te maken, welke erft van de klasse DefaultMutableTreeNode. Elke node die dan nog in de boom zou worden geplaatst kan hier dan van erven. Op deze manier kunnen alle nodes op de zelfde manier behandeld worden. Een kort overzicht: RootDropnode: Rootnode is de eerste node van een boom, en wordt steeds gekoppeld aan een aantal nodes die onder deze rootnode zullen hangen. QuestionDropNode: Deze node stelt een vraag voor. Ze kan versleept worden en men kan er CRUID-operaties op uitvoeren. Een QuestionDropNode kan enkel hangen aan een RootDropNode of een AnswerDropNode. AnswerDropNode: Deze node stelt een antwoord voor. Op deze node kan je enkel CRUD-operaties uitvoeren. Een AnswerDropNode kan enkel geplaatst worden onder een RootDropNode. SolutionDropNode: Deze node stelt een solution voor. Deze node kan je verslepen en je kan er CRUD-operaties op uitvoeren. Een SolutionDropNode kan enkel geplaatst worden onder een AnswerDropNode. HelpDropNode: Deze node stelt een helpbestand voor in de helpfunctie. Er kunnen geen operaties op uitgevoerd worden. Een HelpDropNode kan enkel geplaatst worden onder een RootDropNode.
59
De taalmanager De taalmanager zorgt ervoor dat het programma vertaald wordt naar de op de computer ingestelde taal. Daartoe beschikt zij over een aantal tekstbestanden (in de folder /settings/language), waarin de verschillende taalobjecten gedefinieerd staan. Een voorbeeld van een dergelijk bestand is LanguageResources_nl_BE.properties, welke de nederlandstalige taalobjecten voor een Belgisch ingestelde computer omschrijft. Vermits het bestand een doodgewoon tekstbestand is, kan het makkelijk aangepast worden: errorAnswersNotLoaded=De antwoorden konden niet worden geladen! errorDbEmpty=Lege database! De default indextabel wordt nu aangemaakt! errorDbEmptyFailure=Aanmaken van de default indextabel mislukt! errorDbInvalid=Ongeldige database!
Vooraleer men de taalmanager kan gebruiken, moet men Translator eerst nog initialiseren. Dit gebeurt in de manager van het programma, namelijk FrameHandler: //set up language manager Translator.setBundleName("settings.language.LanguageResources"); Locale baseLocale = (Locale)null; Translator.setLocale(baseLocale);
Wanneer men in het programma nu een bepaalde term wenst te laten weergeven, hoeft men slechts één regel code in te geven: System.out.println(Translator.getTranslationString("errorDbEmpty"));
geeft als resultaat: Lege database! De default indextabel wordt nu aangemaakt!
60
De Front-end De web reference De ASP-zijde bevat geen logica. De enige twee aanwezige “intelligente” onderdelen zijn de web reference en de service handler.
De web reference maakt, zoals de naam het al zegt, een referentie naar de web service. Via deze referentie kunnen methodes worden uitgevoerd. Deze methodes zijn stateless wat inhoudt dat je een actie kan laten gebeuren, maar dat die daarna afgesloten is. Hierdoor is het onmogelijk om een instantie van een webservice object te maken. Om dit probleem op te lossen hebben we een de ServiceHandler gemaakt. Deze klasse gaat een session key opvragen aan de webservice en deze bewaren. Telkens wanneer er een methode opgeroepen wordt via de web service zal de session key meegegeven worden. Op deze manier hebben we een proxy klasse gemaakt waardoor het voor het asp programma lijkt alsof we met een lokaal object werken.
61
De verbinding maken public ServiceHandler(String server, String lijst) { //we maken een session aan //en aan de hand van deze session kunnen we communiceren a = new StorageTool.sourceagent(); StorageTool.getSessionKey key = new StorageTool.getSessionKey(); key.server = server; key.lijst = lijst; StorageTool.getSessionKeyResponse res = a.getSessionKey(key); sessionkey = res.@return; } public ServiceHandler() { this("192.168.237.128", "vragenlijst01"); }
We maken de initiële verbinding door een instantie aan te maken van de ServiceHandler-klasse. We weten dat de methode voor een session key te maken er als volgt uit ziet: getSessionKey ( server As string , lijst As string ) As string Om deze web methode uit te voeren moeten we 2 objecten maken, eentje om data te verzenden, en eentje om data te ontvangen. Het zendende object StorageTool.getSessionKey key = new StorageTool.getSessionKey(); key.server = server; key.lijst = lijst;
Het ontvangende object a = new StorageTool.sourceagent(); StorageTool.getSessionKeyResponse res = a.getSessionKey(key);<- key is het object dat we hierboven hebben aangemaakt sessionkey = res.@return;
Deze manier van werken toont aan dat een webservice werkt zoals een website, er zijn POST- en RESPONSE-gegevens.
62
Nu we een sessionkey hebben kunnen we effectief acties ondernemen op de webservice. public String getStatus() { //we vragen de status op van de plugin StorageTool.getStatus gs = new StorageTool.getStatus(); gs.session = sessionkey; StorageTool.getStatusResponse gsr = a.getStatus(gs); return gsr.@return; }
Elke interactie werkt zoals bovenstaand voorbeeld. We maken opnieuw een zendend object aan, welke de session key meegeeft aan de service. Het ontvangend object krijgt nu de status van de plugin terug. Naast de ServiceHandler is er nog een klasse die omwille van administratieve redenen connectie kan maken met de webservice, en dat is de ResetHandler. Wanneer een administrator de vragenlijst(en) heeft gewijzigd, dan moet de service opnieuw geladen worden zonder invloed te hebben op de openstaande sessies. Om verwarring te voorkomen hebben we dan ook gekozen om de connecties door een apparte klasse te laten verzorgen. public class ResetHandler { public ResetHandler() { //een instantie aanmaken van de source agent webservice klasse StorageTool.sourceagent a = new StorageTool.sourceagent(); //de methode reset triggeren StorageTool.ReloadPlugins r = new StorageTool.ReloadPlugins(); r.nothing = ""; StorageTool.ReloadPluginsResponse rp = a.ReloadPlugins(r); } }
We kunnen nu communiceren met de webservice alsof het een 'normaal' object is. Een applicatie bouwen is bijgevolg niet moeilijk meer:
63
In de webpagina plaatsen we de service handler in een sessie. Op die manier wordt de verbinding met de webservice bewaard per client. Indien de pagina met de vragenlijst voor de eerste maal geladen wordt, wordt de session cache geledigd. Op deze manier voorkomen we dat de gebruiker een oude in de cache opgeslagen lijst te zien krijgt wanneer hij de pagina opent. if (sh.getStatus() == "solved") Response.Redirect("~/Solution.aspx"); if (sh.getStatus() == "unsolvable") Response.Redirect("~/DefaultSolution.aspx");
Bij het laden van de pagina wordt er ook gekeken naar de huidige status. Indien de vragenlijst solved of unsolvable is, zal de gebruiker doorgestuurd worden naar een andere pagina. Een solution tonen: sh = (ServiceHandler)Session["tool"]; lbltitel.Text = sh.getSolutionTitle(); lbldescription.Text = sh.getSolutionBody();
Wanneer we op de solution pagina komen, gebruiken we dezelfde session om zo de aangeboden solution te kunnen weergeven.
64
Het resetten van de tool Wanneer een vragenlijst via de administratortool gewijzigd wordt, worden deze eerst naar de database weggeschreven. Naar de webserver toe worden de wijzigingen van de vragenlijst niet meteen doorgevoerd opdat er een scheiding zou zijn tussen test- en productieomgeving. Op deze manier kan men aanpassingen maken en opslaan om later verder te werken, zonder dat de webclients daar iets van merken.
Via de reset-pagina kan men de webserver forceren de vragenlijst te hernieuwen.
Door op de knop Reset te klikken, wordt de ResetHandler gestart. Deze klasse doet niets meer dan aan de webservice te melden dat er moet gereset worden.
65
TESTEN JUnit testen JUnit7 is een opensource framework dat geautomatiseerd unit testen mogelijk maakt. Aangezien de applicatie zich moeilijk leent tot unit tests, hebben we enkel het belangrijkste onderdeel, namelijk het framework, voorzien van JUnit testen. De verschillende tests kunnen opgeroepen worden met behulp van de suite FrameworkTestSuite. Deze klasse ziet er als volgt uit: public class FrameworkTestSuite { public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(FrameworkTest.class); // Add more tests here // ... }
}
return suite;
/** * Runs the test suite using the textual runner. */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); }
De belangrijkste tester die we ontworpen hebben is de FrameworkTest, die gaat testen of het aantal geladen plugins overeenkomt met het aantal gedefinieerde plugins in het configuratiebestand (testFoundPlugins). Vervolgens wordt er getest of de eerst geladen plugin ook overeenkomt met de eerste plugin uit het configuratiebestand (testGetPlugin). Tenslotte gaat de test de eerste plugin laden en en een antwoord geven op de eerste vraag (testPluginStatus). Indien dit antwoord tot een report leidt, faalt de test. Er wordt immers uitgegaan van het feit dat de vragenlijst meer dan een vraag zal bevatten. Op die manier kan men testen of de verschillende statussen Solving, Unsolvable en Solved degelijk werken.
7 http://www.junit.org/index.htm
66
Losse testen & debugging Een groot aantal zaken zijn los getest, in die zin dat er geen unit testen voor geschreven zijn. Het betreft zaken zoals de correcte werking van de gui, connecteren met de databank, opslaan,... Een belangrijk hulpmiddel hierbij was de logging feature log4j van Apache, waardoor het mogelijk werd de foutmeldingen, geformatteerd en gesorteerd naar ernstigheid, gestructureerd te overlopen tijdens het runnen van het programma. Soms was het echter interessanter het programma te debuggen, en zo regel per regel code na te kijken wanneer een fout precies optreedt. Monkey testen Een monkey test is een test die uitgevoerd wordt zonder iets specifieks te testen. Een monkey hoeft niet altijd uit een zoo te komen, en is meestal de ontwikkelaar zelf die nietszeggende data in het programma voert. Een voorbeeld is het intoetsen van willekeurige data in een tesktveld, en vervolgens nakijken of de eventuele fouten goed opgevangen worden. Deze testen waren heel belangrijk in de ontwikkeling van ons programma, vermits de voornaamste taak immers inhoudt dat er data ingevoerd moet worden. Het opzoeken van slechte foutafhandelingen was dus cruciaal in het verloop van de ontwikkeling. Ook op de website zelf was het belangrijk een aantal monkey tests uit te voeren om na te gaan of alles stabiel bleef draaien wanneer de gebruiker willekeurig vragenlijsten in alle richtingen gaat doorlopen. Eindgebruiker-testen
67
De laatste testen worden uitgevoerd door een testpubliek, gewoonlijk de eindgebruikers zelf. Zo hebben een aantal werknemers van Source de administratortool uitgetest en voorzien van commentaar. Daarnaast werd ook de IT-verantwoordelijke op de hoogte gesteld van de verscheidene aspecten van het programma. Tenslotte is de website op gebruiksvriendelijkheid getest door verscheidene mensen.
68
USE CASES Use case: doorlopen storage/backup sizing tool op de website Level: user goal Primary actor: webgebruiker Stakeholders and Interests List: – Webgebruiker: wil een idee krijgen van welke oplossingen er mogelijk zijn voor zijn storage/backup probleem – Source NV consultant: wil dat de klant al eens nadenkt over zijn huidige situatie en wat hij precies wil Preconditions: de webgebruiker heeft de storage/backup sizing tool module geactiveerd Postconditions: het rapport is verstuurd naar de webgebruiker Main Success Scenario: 1. Het systeem toont één vraag op het scherm met eventueel een aantal mogelijke bijhorende antwoorden 2. De webgebruiker kiest een antwoord 3. Het systeem controleert het antwoord en kijkt na welke vraag er volgt op het antwoord 4. Herhaal vanaf stap 1 totdat het systeem een solution (rapport) weergeeft Extensions: 3. a) De webgebruiker, indien hij dat wenst, kan terugkeren naar een vorige vraag. b) De webgebruiker, indien hij dat wenst, kan de vragensessie herbeginnen Special Requirements: – het systeem mag maar een beperkt aantal antwoorden per vraag weergeven zodat het geheel overzichtelijk blijft – de webgebruiker moet de vragen kunnen doorlopen op die manier dat hij zo weinig mogelijk moet scrollen, klikken en typen – om het geheel overzichtelijk te houden, de front-end eventueel in een flash plugin gieten – Indien de webgebruiker de vraag niet begrijpt, kan hij het systeem om meer informatie vragen. Standaard moet er een basis uitleg getoond worden per vraag.
69
Use case: Administratortool - Aanmaken van een vraag Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manier een vraag kunnen toevoegen Preconditions: – De administrator is ingelogd en heeft een bestaande vragenlijst geopend. – De administrator heeft kenbaar gemaakt dat hij een vraag wil toevoegen Postconditions: de vraag is succesvol aangemaakt en toegevoegd aan de vragenlijst Main Success Scenario: 1. Het systeem toont het formulier 2. De administrator typt een vraag en twee of meerdere mogelijke antwoorden op die vraag in 3. Het systeem voegt de vraag toe aan het Orphanage 4. Het systeem keert terug naar het beheer van vragen en antwoorden cfr use case Beheren van vragen en antwoorden Extensions: 2. a) De administrator geeft een lege vraag op I) Het systeem waarschuwt de administrator en annuleert het aanmaken van de vraag b) De adminstrator geeft een vraag op die reeds bestaat I) Het systeem waarschuwt de administrator en annuleert het aanmaken van de vraag c) De administrator geeft minder dan twee antwoorden op I) Het systeem annuleert het aanmaken van de vraag Special Requirements:
70
Use case: administratortool – Verwijderen van een vraag Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snel en efficiënte manier een vraag kunnen verwijderen uit het orphanage Preconditions: – de administrator is ingelogd – de gebruiker heeft in Beheren van het Orphanage aangegeven welke vraag hij wil verwijderen Postconditions: de vraag is succesvol verwijderd Main Success Scenario: 1. Het systeem verwijdert de vraag uit het Orphanage, alsook alle klonen die in de vragenlijst aanwezig zijn 2. Het systeem keert terug naar het beheer van vragen en antwoorden Extensions: Special Requirements:
71
Use case: Administratortool - Deactiveren van een vraag Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snel en efficiënte manier een vraag kunnen deactiveren (= vraag verwijderen uit de vragenlijst) Preconditions: – De administrator is ingelogd – Er is minstens één vraag aanwezig in de vragenlijst – De administrator heeft aangegeven welke vraag hij wil deactiveren Postconditions: de vraag is succesvol gedeactiveerd Main Success Scenario: 1. Het systeem verwijdert de vraag 2. Het systeem keert terug naar het beheer van vragen en antwoorden Extensions: 1. De vraag bevat onderliggende vragen en/of solutions a) Het systeem verwijdert de onderliggende vragen en solutions Special Requirements:
72
Use case: Administratortool – Vraagstelling wijzigen Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manierde vraagstelling kunnen wijzigen Preconditions: – De administrator is ingelogd. – De gebruiker heeft aangegeven welke vraag hij wil wijzigen Postconditions: de vraag is succesvol gewijzigd Main Success Scenario: 1. Het systeem toont de formule van de aangeduide vraag 2. De gebruiker wijzigt de vraagstelling 3. Het systeem voert de wijzigingen door op de vraag en alle klonen 4. Het systeem keert terug naar het beheer van vragen en antwoorden Extensions: 3. a) De formule van de vraag is dezelfde als een reeds bestaande vraag I) Het systeem waarschuwt de administrator en annuleert de wijziging Special Requirements:
73
Use case: Administratortool – Toevoegen van een antwoord Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manier een antwoord kunnen toevoegen Preconditions: – De administrator is ingelogd en heeft een bestaande vragenlijst geopend. – De administrator heeft kenbaar gemaakt aan welke vraag hij een antwoord wil toevoegen – De administrator heeft de vraag aangeduid waaraan hij de vraag wil toevoegen Postconditions: het antwoord is succesvol toegevoegd Main Success Scenario: 1. Het systeem toont het formulier 2. De administrator typt een antwoord in 3. Het systeem voegt het antwoord toe aan de vraag 4. Het systeem keert terug naar het beheer van vragen en antwoorden Extensions: 3. a) De administrator geeft een leeg antwoord op I) Het systeem waarschuwt de administrator en annuleert het toevoegen b) De adminstrator geeft een antwoord op dat reeds bestaat I) Het systeem waarschuwt de administrator en annuleert het toevoegen Special Requirements:
74
Use case: Administratortool – Antwoordstelling wijzigen Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manier de antwoordstelling kunnen wijzigen Preconditions: – De administrator is ingelogd. – De gebruiker heeft aangegeven welk antwoord hij wil wijzigen Postconditions: de vraag is succesvol gewijzigd Main Success Scenario: 1. Het systeem toont de formule van het aangeduide antwoord 2. De gebruiker wijzigt de antwoordstelling 3. Het systeem voert de wijzigingen door op het antwoord en alle klonen 4. Het systeem keert terug naar het beheer van vragen en antwoorden Extensions: 3. a) De formule van het antwoord is dezelfde als een reeds bestaand antwoord I) Het systeem waarschuwt de administrator en annuleert de wijziging Special Requirements:
75
Use case: Administratortool – Aanmaken van een solution Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een duidelijke en efficiënte manier een solution aanmaken Preconditions: – de administrator is ingelogd – de administrator heeft aangegeven dat hij een solution wil aanmaken Postconditions: de solution is succesvol toegevoegd Main Success Scenario: 1. Het systeem toont een formulier met invoervelden voor de solution: titel en omschrijving 2. De administrator voert de benodigde gegevens in 3. Het systeem slaat de solution op 4. Het systeem keert terug naar het beheer van solutions cfr use case Beheren van solutions Extensions: 3. a) De administrator annuleert de actie I) het systeem keert terug naar Beheer van solutions cfr use case Beheer van solutions b) de solution bestaat reeds (niet unieke titel) I) het systeem waarschuwt de administrator c) het systeem keert terug naar het beheer van solutions Special Requirements:
76
Use case: Administratortool – Wijzigen van een solution Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een duidelijke en efficiënte manier een solution wijzigen Preconditions: – de administrator is ingelogd – de administrator heeft in het beheer van solutions aangegeven welke solution hij wil wijzigen Postconditions: de solution is succesvol gewijzigd Main Success Scenario: 1. Het systeem laadt de gegevens op van de geselecteerde solution en geeft deze weer 2. De administrator voert de gewenste veranderingen door 3. Het systeem slaat de wijzigingen op Extensions: 2. a) De administrator annuleert (cancel) b) cfr use case Beheer van solutions 3. a) Een verplicht veld is niet ingevuld I) het systeem waarschuwt de administrator II) het systeem keert terug naar het beheer van solutions b) de solution bestaat reeds (niet unieke titel) I) het systeem waarschuwt de administrator II) het systeem keert terug naar het beheer van solutions Special Requirements:
77
Use case: Administratortool – Verwijderen van een solution Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een duidelijke en efficiënte manier een solution verwijderen Preconditions: – de administrator is ingelogd – de administrator heeft in het beheer van solutions aangegeven welke solution hij wil verwijderen Postconditions: de solution is succesvol verwijderd Main Success Scenario: 1. De gebruiker bevestigt de verwijdering 2. Het systeem verwijdert de solution uit het orphanage en alle klonen uit de vragenlijst 3. Het systeem keert terug naar het beheer van solutions cfr use case Beheer van solutions Extensions: 1. De gebruiker annuleert I) Het systeem keert terug naar het beheer van solutions cfr use case Beheer van solutions Special Requirements:
78
Use case: Administratortool - Deactiveren van een solution Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snel en efficiënte manier een solution kunnen deactiveren (= solution verwijderen uit de vragenlijst) Preconditions: – De administrator is ingelogd – Er is minstens één vraag aanwezig in de vragenlijst – De administrator heeft aangegeven welke solution hij wil deactiveren Postconditions: de solution is succesvol gedeactiveerd Main Success Scenario: 1. Het systeem verwijdert de solution 2. Het systeem keert terug naar het beheer van solutions Extensions: Special Requirements:
79
Use case: Administratortool – Activeren van een plugin Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manier een plugin kunnen activeren Preconditions: – de administrator is ingelogd Postconditions: De plugins zijn succesvol geactiveerd Main Success Scenario: 1. Het systeem laadt de gegevens van de plugins op 2. Het systeem toont een lijst van de beschikbare plugins 3. De gebruiker selecteert een plugin 4. De gebruiker geeft aan dat hij de aangeduide plugin wil activeren 5. Het systeem activeert de plugin 6. Het systeem keert terug naar stap 1 Extensions: 5. a) De plugin is reeds geactiveerd b) Het systeem waarschuwt de gebruiker c) Het systeem keert terug naar stap 1 Special Requirements:
80
Use case: Administratortool – Deactiveren van een plugin Level: user goal Primary actor: administrator Stakeholders and Interests List: – administrator: wil op een snelle en efficiënte manier een plugin kunnen deactiveren Preconditions: – de administrator is ingelogd Postconditions: De plugins zijn succesvol geactiveerd Main Success Scenario: 1. Het systeem laadt de gegevens van de plugins op 2. Het systeem toont een lijst van de beschikbare plugins 3. De gebruiker selecteert een plugin 4. De gebruiker geeft aan dat hij de aangeduide plugin wil deactiveren 5. Het systeem deactiveert de plugin 6. Het systeem keert terug naar stap 1 Extensions: 5. a) De plugin is reeds gedeactiveerd b) Het systeem waarschuwt de gebruiker c) Het systeem keert terug naar stap 1 Special Requirements:
81
SLOTWOORD Het nut van een stage zou maar weinig betekenen, als men er niets uit geleerd heeft en geen conclusies heeft kunnen trekken. Daarom kan een slotwoord met een aantal conclusies dit dossier niet ontbreken. Ten eerste kunnen we stellen dat we dit project succesvol hebben beëindigd vermits de gestelde eisen (gebruiksvriendelijkheid, uitbreidbaarheid, eenvoud) behaald werden en er steeds oog was voor de eindgebruiker. Daarom was het belangrijk dat er tijdens het verloop van de stage regelmatig meetings werden gehouden waarin ons werk bijgestuurd kon worden waar nodig. Deze meetings konden vaak doorgaan omdat ze vanuit de school uit verplicht waren en bijgevolg een agendapunt vormden bij onze stagebegeleiders (die vaak zelf al een drukke agenda hadden). Ten tweede hebben we het belang leren inzien van communicatie. Communicatie is zelfs zo belangrijk bij het ontwikkelen van applicaties dat het welslagen er voor een groot deel van afhangt. Een applicatie die uitvoerig en tot in de details uitgewerkt is, maar geen interesse vindt bij de eindgebruiker, heeft zijn doel uit het oog verloren en is tot mislukking gedoemd. Maar ook onderlinge communicatie is belangrijk. Het evenwicht vinden tussen een kritische houding en open staan voor nieuwe ideeën was niet altijd even evident. Bovendien was het leren omgaan met kritiek ook een belangrijke stap in het leerproces. Daarnaast kunnen een hele reeks misverstanden aan de basis liggen van de meest kritische fouten. Tenslotte hebben we meer inzicht gekregen in het doen en laten van een kmo bedrijf. Het is duidelijk dat de aandacht in een dergelijk bedrijf veel meer gaat naar het geleverde werk dan naar de letterlijk geleverde werkuren.
82
BIBLIOGRAFIE – – – – – – –
–
Applying UML and patterns – An Introduction to Object-Oriented Analysis and Design and Iterative Development – Third Edition – Craig Larman, Prentice Hall PTR, 2004 Creating a numeric-input JTextField - David Glasser http://www.devx.com/tips/Tip/14311 Display a Splash screen - Réal Gagnon, 1998-2005 http://www.rgagnon.com/javadetails/java-0267.html Display images using JEditorPane - Rob Kenworthy - 2001 http://www.javaworld.com/javaworld/javatips/jw-javatip109.html Set your timer for dynamic properties - Xiaodong Zhang, 2002 http://www.javaworld.com/javaworld/javatips/jw-javatip125.html Limit JTextField input to a maximum length - Réal Gagnon, 1998-2005 http://www.rgagnon.com/javadetails/java-0198.html Log4J - Ashley J.S Mills, 2005 http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/log4j/log4j.h tml Storage Area Networks – Designing and Implementing a Mass Storage System - Ralph H. Thornburgh & Bary J. Schoenborn, Hewlett-Packard Professional Books, 2001
83
BIJLAGEN Planning
84
week 1 datum
Thomas Debray gerealiseerde werk / uitgevoerde taken
dag maandag
voormiddag namiddag introductie bij de firma. Conceptuele beschrijving maken van het project studie basiskennis storage en backup namiddag omgevingen omgeving klaarzetten + voorbereiden vergadering voormiddag + opzoekingswerk vergadering project + zoeken naar bestaande namiddag tools voormiddag testen van tools + vergelijken ons project namiddag vergaderen over opbouw van ons framework uitwerken documentatie+schrijven plan van voormiddag aanpak + beschrijven opbouw plugin maken van projectplanning in concrete vorm + namiddag opzoeking jpf + verderschrijven plan van aanpak voormiddag
dinsdag
woensdag
donderdag
vrijdag
week 2 datum
dag maandag dinsdag woensdag donderdag vrijdag
week 3 datum
namiddag
dag maandag dinsdag woensdag donderdag vrijdag
week 4
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken proccess meeting use cases use cases ontwerpen en opbouwen framework xml in framework opzetten svn + propperties in framework opbouw en testen framework opbouw en testen framework refactoring + bouwen junit tests samen met paul en christophe naar flowchart kijken
Thomas Debray gerealiseerde werk / uitgevoerde taken aanpassen use cases aanpassen use cases cursus legato cursus legato cursus legato cursus legato cursus legato cursus legato cursus legato cursus legato
Thomas Debray
datum
dag maandag dinsdag woensdag donderdag vrijdag
week 5 datum
dinsdag woensdag donderdag vrijdag
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken refactoring refactoring admin tool admin tool Storage expo Storage expo inbouwen van logging opslaan toevoegen testen testen
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken proccess meeting Aanpassen database Aanpassen programma naar nieuwe database Aanpassen programma naar nieuwe database bouwen crud operations vragenlijsten bouwen crud operations vragenlijsten verfijnen gui verfijnen gui Help funtie bouwen Help funtie bouwen
dag maandag dinsdag woensdag donderdag vrijdag
week 6 datum
gerealiseerde werk / uitgevoerde taken proccess meeting meeting met source finaliseren use case finaliseren use case testjes bouwen voor databank Bouwen databank connectie Bouwen databank connectie samenvoegen databank naar gui opbouw gui opbouw gui / testen naar gebruiksvriendelijkheid
dag maandag
week 6 datum
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
dag maandag
dinsdag
Thomas Debray gerealiseerde werk / uitgevoerde taken uitbouwen admintool(bugtesting en kijken voor voormiddag details) uitbouwen admintool(bugtesting en kijken voor namiddag details) uitbouwen admintool(bugtesting en kijken voor voormiddag details)
dinsdag
uitbouwen admintool(bugtesting en kijken voor details) uitbouwen admintool(bugtesting en kijken voor voormiddag details) uitbouwen admintool(bugtesting en kijken voor namiddag details) uitbouwen admintool(bugtesting en kijken voor voormiddag details) uitbouwen admintool(bugtesting en kijken voor namiddag details) uitbouwen admintool(bugtesting en kijken voor voormiddag details) uitbouwen admintool(bugtesting en kijken voor namiddag details) namiddag
woensdag
donderdag
vrijdag
week 7 datum
maandag dinsdag woensdag donderdag vrijdag
week 8 datum
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
testen admintool presentatie presentatie bijwerken use cases uitbouwen pluggin uitbouwen pluggin uitbouwen pluggin uitbouwen pluggin
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken bouwen layout website bouwen layout website bouwen layout website bouwen layout website bouwen layout website bouwen layout website bouwen layout website bouwen layout website html templade editor html templade editor
dag maandag dinsdag woensdag donderdag vrijdag
week 9 datum
Thomas Debray gerealiseerde werk / uitgevoerde taken
dag
dag maandag dinsdag
Thomas Debray gerealiseerde werk / uitgevoerde taken voormiddag testen html editor namiddag testen en debugging voormiddag testen en debugging namiddag testen en debugging
woensdag donderdag vrijdag week 10 datum dag maandag dinsdag woensdag donderdag vrijdag
voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken voormiddag bijwerken use cases namiddag bijwerken use cases voormiddag Vrije dag namiddag voormiddag bijwerken use cases namiddag werken aan het stageverslag voormiddag werken aan het stageverslag namiddag werken aan het stageverslag voormiddag procces meeting namiddag werken aan het stageverslag
week 11 datum dag maandag dinsdag woensdag donderdag vrijdag
testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging
voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag voormiddag namiddag
Thomas Debray gerealiseerde werk / uitgevoerde taken testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging testen en debugging werken aan het stageverslag werken aan het stageverslag