Tim Diels Feed Additive Report Publishing

advertisement
Handelswetenschappen en Bedrijfskunde
Bachelor in de toegepaste informatica
Applicatieontwikkeling
Feed Additive Report Publishing
CAMPUS
Geel
Tim Diels
Academiejaar 2010-2011
3
VOORWOORD
Mijn stage en eindwerk zouden nooit zo vlot zijn gegaan zonder de hulp die ik gekregen
heb.
Allereerst wil ik het IRMM bedanken voor de stageplaats en –opdracht. Bedankt aan
San Pauwels, mijn stagebeleider die mij gedurende de stage begeleid heeft. En bedankt
aan Peter Lambert wie mij op weg heeft geholpen met de ontwikkelomgeving. Ook
bedankt aan alle andere mensen die ik heb leren kennen op het IRMM, om mijn stage
nog leuker te maken.
Bedankt aan mijn medestudenten van de KHK, Jasper Van Mensel en Sen Verleysen;
aan Tomas Van Mechelen, oud-student van de KHK die vorig jaar ook bij het IRMM
stage heeft gedaan, aan wie ik altijd vragen kon stellen.
Graag wil ik ook mijn begeleidende docent bedanken, Johan Smeuninx, voor al het
advies over het eindwerk en de stage zelf.
En als laatste dank aan mijn ouders en vrienden voor de steun doorheen de hele
stageperiode.
4
SAMENVATTING
Dit eindwerk gaat over mijn stage bij het Institute for Reference Materials and
Measurements (IRMM), een onderdeel van het Joint Research Centre (JRC).
Tijdens mijn stage heb ik voor de European Union Reference Laboratories (EURL) een
probleem geanalyseerd en de oplossing geïmplementeerd. De Food Safety and Quality
(FSQ) unit van het EURL publiceren maandelijks Feed Additive Authorisation (FAA)
rapporten en zouden dit graag automatiseren.
In de analysefase heb ik onder andere het doel en de scope van het project vastgelegd
en de uren geraamd met een vision document. Vervolgens heb ik de use cases
beschreven en een datamodel gemaakt van de nodige wijzigingen aan de bestaande
database. Elk document wordt opgestuurd naar de opdrachtgever en goedgekeurd.
In de ontwikkelfase heb ik:

De nodige wijzigingen gedaan in de bestaande database.

De interne administratie web applicatie van de FSQ unit aangepast zodat
meerdere additieven aan een product toegevoegd kunnen worden en er een
rapport kan gekoppeld worden aan een dossier.

Twee andere EURL web applicaties aangepast zodat deze werken met de nieuwe
database.

Een nieuwe web applicatie gemaakt die een lijst van rapporten kan genereren.
Deze zal weergegeven worden op de website van het IRMM in plaats van de
huidige statische lijst.
Op het einde van mijn stage heb ik de nieuwe functies kunnen afleveren, demonstreren
en heb ik hier positieve feedback op gekregen.
5
INHOUDSTAFEL
VOORWOORD ..................................................................................................... 2
SAMENVATTING ................................................................................................. 4
INHOUDSTAFEL .................................................................................................. 5
INLEIDING ......................................................................................................... 7
1
STAGEPLAATS ...................................................................................... 8
1.1
1.2
1.3
Joint Research Center .......................................................................... 8
Institute for Reference Materials and Measurements........................... 8
Informatics Unit................................................................................... 9
2
STAGEOPDRACHT ............................................................................... 10
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
Aanleiding en achtergrond van het project ........................................ 10
Verwacht resultaat............................................................................. 10
Business Case .................................................................................... 10
Fasering ............................................................................................. 11
Projectafbakening.............................................................................. 11
Omschrijving van de primaire doelgroep............................................ 11
Andere stakeholders .......................................................................... 11
Informatie en rapportering ................................................................ 11
3
ANALYSE ............................................................................................ 12
3.1
3.1.1
3.1.2
3.1.3
3.1.4
3.1.5
3.1.6
3.1.7
3.1.8
3.2
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
3.2.6
3.3
Vision document ................................................................................ 12
Introduction ..........................................................................................12
Positioning ............................................................................................12
Proposed approach.................................................................................13
Stakeholder and user descriptions............................................................14
Information system overview ..................................................................14
Features ...............................................................................................14
Planned resources..................................................................................14
Constraints ...........................................................................................15
Use case specifications ...................................................................... 15
Use case description...............................................................................16
Flow of events .......................................................................................16
Preconditions.........................................................................................17
Postconditions .......................................................................................17
Screenshots ..........................................................................................17
Datamodel ............................................................................................17
Datamodel ......................................................................................... 17
4
ONTWIKKELOMGEVING...................................................................... 20
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.7.1
Oracle SQL Developer ........................................................................ 20
Java en Java EE.................................................................................. 20
Spring ................................................................................................ 21
Eclipse ............................................................................................... 21
Subversion ......................................................................................... 22
JIRA ................................................................................................... 23
RefApp ............................................................................................... 24
RefApp 1.2 ............................................................................................24
4.7.1.1
4.7.1.2
4.7.1.3
4.7.1.4
Hibernate.......................................................................................................................... 25
Spring configuraties ........................................................................................................... 25
Ant................................................................................................................................... 28
Tomcat ............................................................................................................................. 28
6
4.7.1.5
Hoe uitvoeren.................................................................................................................... 29
4.7.2
RefApp 3.2 ............................................................................................29
4.7.2.1
4.7.2.2
4.7.2.3
4.7.2.4
JPA .................................................................................................................................. 29
Maven .............................................................................................................................. 29
WebLogic .......................................................................................................................... 29
Hoe uitvoeren.................................................................................................................... 29
5
IMPLEMENTATIE VAN DE APPLICATIE................................................ 30
5.1
5.2
5.2.1
5.2.2
5.3
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6
5.3.7
Migratiescript..................................................................................... 31
crlfaacatadmin ................................................................................... 31
Meerdere additives.................................................................................32
Published report.....................................................................................33
eurlreportlist...................................................................................... 33
RefApp 3.2 structuur genereren ...............................................................34
Report en Product data classes ................................................................35
ReportDao interface ...............................................................................37
ReportDaoImpl ......................................................................................38
ReportService........................................................................................41
ReportServiceImpl .................................................................................41
MVC Front-End ......................................................................................42
5.3.7.1
5.3.7.2
Controller (+model) ........................................................................................................... 42
JSP pagina (het view)......................................................................................................... 43
5.3.8
5.4
5.5
Deployment documentatie.......................................................................45
crlForms............................................................................................. 46
crlApplication..................................................................................... 47
BESLUIT 49
LITERATUURLIJST ............................................................................................ 50
7
INLEIDING
Dit eindwerk is het resultaat van dertien weken stage bij het Institute for Reference
Materials and Measurements (IRMM), een onderdeel van het Joint Research Centre
(JRC).
Mijn opdracht was het publiceren van rapporten te automatiseren voor de Food Safety
and Quality (FSQ) unit van de European Union Reference Laboratories (EURL). Hiermee
zal de FSQ unit sneller rapporten kunnen publiceren en zo meer tijd kunnen besteden
aan andere taken die meer business value opleveren.
In het eerste hoofdstuk stel ik mijn stageplaats voor. In hoofdstuk twee beschrijf ik
mijn opdracht. In het derde hoofdstuk leg ik de analyse van mijn project uit.
Vervolgens overloop ik de ontwikkelomgeving waarin ik gewerkt heb. In het laatste
hoofdstuk vertel ik hoe ik de implementatie zelf aangepakt heb.
8
1
STAGEPLAATS
In dit deel stel ik de plaats voor waar ik de voorbije dertien weken gewerkt heb.
1.1
Joint Research Center
Het Joint Research Center (JRC) is een Directoraatgeneraal van de Europese commissie. Het voorziet de
Europese Unie (EU) van wetenschappelijk en technisch
advies.
Figure 1-1 Logo JRC
Het JRC bestaat uit zeven instituten verspreid over vijf locaties in Europa:







1.2
Institute
Institute
Institute
Institute
Institute
Institute
Institute
for
for
for
for
for
for
for
Reference Materials and Measurements (IRMM) – Geel (BE)
Energy (IE) – Petten (NL) en Ispra (IT)
the Protection and Security of the Citizen (IPSC) – Ispra (IT)
Transuranium Elements (ITU) – Karlsruhe (DE)
Environment and Sustainability (IES) – Ispra (IT)
Health and Consumer Protection (IHCP) – Ispra (IT)
Prospective Technological Studies (IPTS) – Seville (ES)
Institute for Reference Materials and Measurements
Ik heb mijn stage gedaan bij het IRMM. Het IRMM is een van de
zeven instellingen van het JRC.
Figure 1-1 Logo IRMM
Het IRMM startte zijn werkzaamheden in 1960 en in Geel. De
oorspronkelijke naam van het IRMM was het Central Bureau for
Nuclear Measurements (CBNM). In de loop der tijd begon het
CBNM zowel nucleair als niet-nucleair onderzoek te doen. In
1993 werd de naam veranderd van CBNM naar IRMM om dit te
weerspiegelen.
De hoofdcompetenties van het IRMM zijn uitgegroeid tot:






Referentiematerialen produceren
Voedselanalyse
Bioanalyse
Chemische referentiemetingen
Radionuclidemetrologie
Neutronenfysica
Het IRMM bestaat uit 7 units:







Food Safety and Quality (FSQ)
Infrastructure and Site Management (ISM)
Isotope Measurements (IM)
Management Support (MSU)
Nuclear Physics (NP)
Reference Materials (RM)
Safety, Health, Environment & Security (SHES)
9
1.3
Informatics Unit
De unit waar ik werk, heet de Informatics Unit. Deze unit maakt deel uit van de
Resource Management Directorate. De Informatics unit is verspreid over Geel, Ispra en
Petten. Het hoofd van Informatics is de heer Bartel Meersman. De Informatics Unit op
het IRMM zorgt voor development en hosting van applicaties gebruikt door het IRMM.
Binnen deze unit werk ik in het IS Development team, dat geleid wordt door mevrouw
San Pauwels. Zij is ook mijn stagebegeleider.
Elke week vergaderen alle developers met elkaar. In deze vergadering vertellen we
elkaar wat we hebben gedaan, waar we nu mee bezig zijn en waar we op het moment
problemen of moeite mee hebben. Zo blijft iedereen op de hoogte van alle projecten
zodat we elkaar kunnen helpen als iemand ergens mee vast zit.
10
2
STAGEOPDRACHT
In dit hoofdstuk beschrijf ik de nood en verdere details van mijn project
2.1
Aanleiding en achtergrond van het project
De Food Safety and Quality (FSQ) unit van het IRMM heeft onder andere de taak om
aanvragen van feed additives goed te keuren. Wanneer een aanvraag binnenkomt,
wordt een dossier geopend. Een dossier kan meerdere producten bevatten om te
onderzoeken en elk product kan meerdere actieve bestandsdelen bevatten. Na
aanvraag, wordt onderzocht of de producten veilig zijn. Eens dit onderzoek voltooid is
wordt een rapport goedgekeurd en dan gepubliceerd.
Het publiceren van de rapporten gebeurt momenteel manueel. De rapporten worden na
goedkeuring deels toegevoegd aan Ares. Ares is een document management systeem
dat bij het IRMM gebruikt wordt om alle officiële definitieve documenten te registreren,
publiceren en bewaren. Op het einde van elke maand publiceert een FSQ medewerker
al de rapporten van de afgelopen maand. Hiervoor moet de user in een Excel document
pseudo-HTML code schrijven van de table rows van de rapporten die toegevoegd
moeten worden aan de pagina. Die lijst wordt dan doorgegeven aan iemand met
toegang tot de SharePoint server van de IRMM website, en die voegt dan de <tr>'s aan
de <table> toe. Dit is een heel karwei en de FSQ zou dit graag geautomatiseerd zien.
Er bestaat al een webapplicatie voor de administratie van de dossiers. Deze zou
uitgebreid kunnen worden om een automatisch gegenereerde pagina van rapporten
mogelijk te maken.
2.2
Verwacht resultaat
Het European Union Reference Laboratories (EURL) Feed Additives Authorisation (FAA)
Reports project heeft als einddoel het publiceren en omgaan met rapporten binnen de
FSQ unit te verbeteren en te automatiseren.
FSQ users zullen in staat zijn om via de bestaande webapplicatie meerdere actieve
substanties op te geven per product, en geuploade rapporten te koppelen aan dossiers.
Normaal wordt de tekst weergegeven op de pagina automatisch gegenereerd met de
namen van de producten en actieve substanties. De user kan ook zelf een alternatieve
tekst opgeven voor de product en actieve substanties, per rapport.
Op basis van de data van de webapplicatie zal een pagina met een lijst van rapporten
gegenereerd worden.
2.3
Business Case
De voordelen van dit project voor de business zijn:

De automatisering bespaart de FSQ unit werk, zo hebben ze meer tijd voor hun
hoofdtaken.

Doordat de webapplicatie alle input valideert, is het moeilijker om fouten te
hebben in de lijst van rapporten.
11

2.4
Rapporten publiceren wordt momenteel uitgesteld tot het einde van de maand
omdat dit zo veel werk is. Eens dit geautomatiseerd is zullen de rapporten
onmiddellijk na goedkeuring gepubliceerd worden omdat het makkelijker zal zijn
om dit meteen te doen dan het uit te stellen tot later.
Fasering
In de analysefase wordt er een vision document opgesteld en de use case specifications
gemaakt. Eens deze goedgekeurd zijn door de opdrachtgever (FSQ unit), wordt er
begonnen aan de ontwikkeling.
In de ontwikkelingsfase wordt eerst een development environment in orde gemaakt,
daarna worden functies toegevoegd om rapporten te associëren met dossiers,
meerdere actieve substanties per product op te geven, en uiteindelijk een pagina te
maken die met de gegevens een lijst van gepubliceerde rapporten genereert. Nadat
deze functies zijn geïmplementeerd, wordt het project getest en wordt een demo
gegeven aan de opdrachtgever.
Als laatste fase wordt het project gedeployed op de productieserver. Hierbij worden
bestaande rapporten geassocieerd met dossiers en actieve substanties toegevoegd
waar nodig.
2.5
Projectafbakening
Het project moet uitgewerkt worden volgens de RUP methodologie. Het uiteindelijke
resultaat is een pagina om makkelijk rapporten te koppelen aan een dossier en een
pagina op de website van het IRMM die een lijst van gepubliceerde rapporten toont op
basis van de data uit de database.
2.6
Omschrijving van de primaire doelgroep
De FSQ unit hebben het meeste baat bij dit project. Het bespaart hun werk bij het
publiceren van rapporten. Verder kunnen ze minder fouten maken bij het publiceren.
2.7
Andere stakeholders
Het general public, de IRMM website bezoeker, krijgt meer up to date informatie te
zien. Waar nu de rapporten pas op het einde van de maand geüpload worden, zal met
deze applicatie het rapport beschikbaar zijn kort nadat het rapport goedgekeurd is.
2.8
Informatie en rapportering
Ik zal de voortgang van het project aan mijn stagebegeleider meedelen in elke
Developers Meeting. Ik zal elke week een stageverslag sturen naar mijn begeleidende
docent.
12
3
ANALYSE
Om een goed beeld te krijgen van de opdracht, ben ik begonnen met een analyse van
het project.
Door regelmatig samen te zitten met de opdrachtgever, ben ik tot een vision document,
use case specifications en een datamodel gekomen. Deze documenten vormen een
leiddraad voor de latere ontwikkeling en geven de opdrachtgever een idee van wat
gemaakt zal worden.
Ook tijdens de ontwikkelingsfase worden de analysedocumenten terug aangepast
omdat deze ook dienen als documentatie voor later.
3.1
Vision document
Om de noden van de gebruiker te achterhalen, te begrijpen waar deze vandaan komen,
en het algemeen doel van het project te beschrijven, wordt een vision document
opgesteld. Het vision document beschrijft de noden op een hoog niveau, de use case
specifications (zie verder) gaan in op de details van deze noden.
Eens het document af is, wordt het aan de opdrachtgever getoond ter goedkeuring.
Daarna worden de use cases verder uitgediept.
Een vision document bestaat uit volgende delen:

Introduction

Positioning

Proposed approach

Stakeholder and user descriptions

Information system overview

Features

Planned resources

Constraints
In de volgende onderdelen ga ik dieper in op de delen van het vision document.
3.1.1
Introduction
In de introductie wordt de scope bepaald en vindt men een lijst van termen en nuttige
links. De scope geeft aan wat bij dit project kan horen en wat niet. Zo was de scope
van dit project het publiceren van rapporten van feed additives.
3.1.2
Positioning
Het 'Positioning' onderdeel beschrijft wat het probleem is, wie hier last van heeft en wat
de gevolgen hiervan zijn. Hierbij wordt duidelijk gemaakt wat het doel is van het
project, namelijk het publiceren van rapporten makkelijker maken. Er wordt ook
13
DOCUMENT
MANAGEMENT
DOCUMENT
MANAGEMENT
1
Approve report
1.1
Mark approved
Mark report approved in EURL FA
administration webapp
DOCUMENT
MANAGEMENT
1.2
Print and paraph
report
Report is printed and paraphed
DOCUMENT
MANAGEMENT
DOCUMENT
MANAGEMENT
2
Publish report
2.1
Scan printed
report
Scan approved report.
DOCUMENT
MANAGEMENT
2.2
Upload report
Upload the scanned report
DOCUMENT
MANAGEMENT
2.3
Set report url
Copy the url to the report into the
dossier's report field in the EURL FA
administration webapp and save the
updated dossier.
Description (FR)
Description (EN)
Name
ID
Domain
beschreven wat een mogelijke oplossing is voor dit probleem. Als laatste wordt het
business proces beschreven zoals het zal zijn eens de oplossing geïmplementeerd is.
Hiervoor wordt volgende tabel gebruikt:
Table 3-1 Business process
Nadat het rapport opgesteld is, moet het eerst goedgekeurd worden. Na goedkeuring
wordt het gepubliceerd door het geparafeerde rapport in te scannen, te uploaden naar
een publieke locatie en in de administratie webapplicatie de link naar dit rapport in te
stellen.
3.1.3
Proposed approach
In de 'Proposed approach' wordt dieper ingegaan op hoe de oplossing geïmplementeerd
zal worden. Dit beschrijft de verschillende stappen die ondernomen moeten worden.
14
3.1.4
Stakeholder and user descriptions
Hierna worden de stakeholders en users van het project beschreven. De stakeholders
zijn de personen die baat hebben bij dit project, de users zijn de eindgebruikers. Merk
op dat users zeker ook stakeholders zijn.
Van elke stakeholder wordt beschreven wat hun verantwoordelijkheden zijn en wanneer
ze het project als succesvol beschouwen.
Verder wordt beschreven hoe lang de users momenteel nodig hebben om rapporten te
publiceren, met welk informatica systeem ze momenteel werken en hoe de nieuwe
functionaliteit in hun huidige werkomgeving zal geïntegreerd worden.
Dan volgt een opsomming van hoe aan elke nood van elke stakeholder voldaan zal
worden in de nieuwe applicatie. Als allerlaatste volgt nog een lijst van alternatieve
oplossingen waaruit de stakeholders kunnen kiezen mochten ze de voorgestelde
oplossing minder goed vinden.
3.1.5
Information system overview
In het volgende onderdeel wordt het informatiesysteem verder beschreven. Dit houdt in
dat de veronderstellingen die gemaakt zijn bij de ontwikkeling uitgeschreven worden.
Verder wordt ook een raming gemaakt van het aantal dagen werk voor elke taak:
Description
Analysis
Development
Integration &
Deployment
Total
Add report fields (link, date,
alternative product text,
alternative additives text)
10
4
5
19
Allow multiple active
substances per product in
EURL FA webapp
10
3
2
15
Show generated list of
reports on IRMM website
6
4
5
15
49
Table 3-2 Planning
Als laatste worden non-functional requirements, de license en te volgen standaarden
van het systeem vermeld.
3.1.6
Features
In het 'Features' onderdeel beschrijft men de deadline en de prioriteit van elke functie.
3.1.7
Planned resources
In dit onderdeel wordt kort beschreven hoeveel mensen hieraan zullen werken en wat
er mogelijk nog extra nodig is aan apparatuur en software dat normaal niet aanwezig
is.
15
3.1.8
Constraints
In de 'Constraints' staan beperkingen over wie toegang heeft tot de applicatie en wie
niet, welke data mag getoond worden en welke niet. De lijst van rapporten mag aan
iedereen getoond worden. De interface om rapport urls in te stellen mag enkel
toegankelijk zijn voor FSQ users.
3.2
Use case specifications
Na het vision document wordt eerst een use case diagram opgesteld om een overzicht
te geven:
Figure 3-1 Use case diagram
Hierna wordt elke use case in detail beschreven met een use case specification
document. Hierin komt te staan hoe het systeem gebruikt moet worden en hoe het
systeem reageert op de acties van de actor.
Eens de use case specifications geschreven zijn, worden ze aan de opdrachtgever
getoond ter goedkeuring.
Een use case specification document bestaat uit volgende delen:

Use case description
16

Flow of events

Preconditions

Postconditions

Screenshots

Datamodel
3.2.1
Use case description
In het eerste deel staat over welke use case het gaat, welk de actoren zijn en wat alle
gebruikte termen betekenen.
3.2.2
Flow of events
In de 'Flow of events' staan lijsten van acties en responses welke de wisselwerking
tussen actor en het systeem duidelijk maakt. Elke lijst duidt een flow aan. Men maakt
onderscheid tussen een basic flow en enkele alternative flows. De basic flow beschrijft
het meest voor de hand liggende successcenario, de alternative flows beschrijven de
andere scenario’s.
De 'Manage active substances' use case bijvoorbeeld, heeft deze flows:

Publisher adds an active substance to product

Publisher removes an active substance from product

Publisher removes last active substance from product

Publisher edits active substance

Publisher nearly edits active substance (user klikt cancel tijdens edit)
De ' Publisher adds an active substance to product' flow heeft volgende lijst van acties
en responses:
a) Publisher surfs to system homepage
b) System shows log in form
c) Publisher logs in
d) System shows system home page
e) Publisher clicks "Dossier Administration"
f) System shows search form
g) Publisher enters search data
h) System shows list of dossier results
i)
Publisher clicks update of desired dossier
j)
System shows dossier edit form
k) Publisher clicks update of desired product
l)
System shows product edit form
17
m) Publisher clicks Additives > Add
n) System shows Additive add form with text field for name, Update and Cancel button
o) Publisher fills in name
p) Publisher clicks "Update"
q) System saves changes and returns to the "Update dossier" page
r) Publisher clicks "Update" or "Reject"
s) System returns to the search page, additive was already added
De structuur van elke regel is telkens 'Actor/System doet iets'.
3.2.3
Preconditions
In de preconditions staan de condities waaraan voldaan moet zijn opdat bovenstaande
flows zich kunnen gedragen zoals hierboven beschreven staat. Een voorbeeld is dat het
single sign-on ECAS systeem moet werken, anders kan men niet inloggen en daar is in
bovenstaande flows geen rekening mee gehouden.
3.2.4
Postconditions
In de postconditions staat hoe het systeem eruit zou moeten zien na uitvoering van een
van de mogelijke flows. Als we er in de precondities van uitgingen dat de user al
ingelogd is, dan is het logisch dat we na uitvoering nog steeds ingelogd zijn; dit is dan
een postconditie.
3.2.5
Screenshots
Omdat de flows in praktijk te technisch blijken om aan users te tonen, worden er mockups toegevoegd aan de use case specificatie die de user een onmiddellijk beeld geven
van hoe het ongeveer zal werken.
3.2.6
Datamodel
In dit deel wordt uitgelegd welke wijzigingen gemaakt moeten worden aan het datamodel om aan deze use case te kunnen voldoen.
3.3
Datamodel
Het datamodel toont de gewenste structuur van de database.
Volgend model toont het nieuwe model van de database. In het geval van dit project,
bestond er al een database, de aangepaste tabellen hebben een gele achtergrond.
18
Figure 3-2 Datamodel
Een dossier (FAA_DOSSIER) heeft een FAD nummer (DSR_FAD_NUMBER) en een CRL
nummer (DSR_NUMBER_CRL_DECL). Het FAD nummer wordt toegekend door een
externe organisatie, het CRL nummer is een intern nummer van de FSQ unit.
Om urls van rapporten naar Ares of SharePoint bij te houden, heb ik het
DSR_REPORT_LINK veld toegevoegd aan FAA_DOSSIER.
19
DSR_REPORT_DATE houdt bij wanneer het rapport gepubliceerd is.
DSR_REPORT_PRODUCT en DSR_REPORT_ADDITIVES bevatten een alternatieve tekst
om te tonen als product en additives op de lijst pagina. Als deze NULL zijn wordt er een
standaard tekst gegenereerd op basis van de product trade name en de additive
names.
Een dossier heeft meerdere products (FAA_PRODUCT), een product heeft exact 1
dossier. Een product heeft mogelijk een trade name (FAA_TRADE_NAMES).
Oorspronkelijk had een product een additive, en een additive kon meerdere products
hebben, maar een additive werd altijd maar aan 1 product gekoppeld. Om meerdere
additives per product toe te staan heb ik het ADD_ID veld van FAA_PRODUCT
verwijderd en de FAA_PRD_ADDITIVES tabel toegevoegd. De oude waarden in het
ADD_ID veld worden gemigreerd naar de FAA_PRD_ADDITIVES tabel. Dit staat een
meer op meer koppeling toe in de toekomst, momenteel wordt het nog gebruikt als een
1 op meer koppeling waarbij 1 product meerdere additives kan hebben.
20
4
ONTWIKKELOMGEVING
Tijdens mijn stage heb ik in verschillende projecten gewerkt, met verschillende
technologieën en structuren. In dit onderdeel bespreek ik de belangrijkste onderdelen
van de ontwikkelomgevingen die ik heb aangetroffen.
4.1
Oracle SQL Developer
Oracle SQL Developer is een grafische tool gemaakt in Java om databases mee te
beheren. Je kan er queries en scripts in runnen, of gebruik maken van de grafische
menu's en knoppen. Oracle SQL Developer ondersteunt niet alleen connecties naar
Oracle databases, maar ook ODBC connecties, …
Figure 4-1 Oracle SQL Developer
4.2
Java en Java EE
De applicaties zijn geschreven in Java Enterprise Edition.
Java is een imperatieve programmeertaal ontwikkeld door James Gosling van Sun
Microsystems. Java laat makkelijk object georiënteerd programmeren toe. De syntax is
gebaseerd op die van C en C++ zodat men makkelijker kan overstappen van C en C++
door geen volledig nieuwe syntax te hoeven leren. Java code wordt gecompileerd tot
bytecode welke uitgevoerd kan worden door implementaties van de Java Virtual
21
Machine (JVM). Er zijn implementaties te vinden van de JVM voor Windows, Linux, Mac,
… Java is dus cross-platform.
Er zijn verschillende Java platforms te verkrijgen:




Java Card: Java applicaties voor smart cards.
Java Micro Edition: Een meer light weight versie van het Java platform, bedoelt
voor devices met beperkt geheugen.
Java Standard Edition: Java applicaties voor general-purpose gebruik op
desktops en servers.
Java Enterprise Edition: Java SE plus verschillende API's voor client-server
applicaties.
Het IRMM gebruikt Java EE om web applicaties te maken.
4.3
Spring
Spring is een software platform dat bovenop Java EE kan gebruikt worden. Het biedt
support classes voor Model View Controller (MVC), dependency injection via Spring
bindings via xml bean configurations en Java annotations, …
Dependency injection kan gebruikt worden om via xml configuraties en/of Java
annotations instances in als waarden van attributen van een andere instance te
'injecten' via getters en setters. Voor meer uitleg hierover, zie verder onder RefApp.
4.4
Eclipse
Eclipse is een integrated development environment (IDE), voornamelijk geschreven in
Java. Eclipse is crossplatform, vrije software. Met Eclipse kan men software schrijven in
Java, Ada, C, C++, COBOL, Perl, PHP, Python, Ruby, … Eclipse bevat tools om te helpen
refactoren en vele andere functies die helpen bij het coderen. Op het IRMM wordt Java
code geschreven in Eclipse.
22
Figure 4-2 Eclipse
4.5
Subversion
Apache Subversion (svn) is een code versioning systeem. Met Subversion kunnen
verschillende versies bijgehouden worden van de code van een project die later terug
opgevraagd kunnen worden. Subversion staat ook toe om met meerdere mensen aan
eenzelfde project te werken zonder te riskeren elkaars wijzigingen te verliezen, doordat
Subversion deze conflicten detecteert en de ontwikkelaar vraagt om deze op te lossen.
Subversion wordt in veel open-source projecten gebruikt. Subversion is bedoeld als
opvolger van Concurrent Versions System (CVS).
Alle projecten waar ik mee gewerkt heb, stonden op een centrale Subversion
repository. Na elke nieuwe toevoeging heb ik mijn wijzigingen naar de trunk gecommit.
Aan het begin van het project heb ik een tag genomen van de huidige versie als die nog
niet bestond. Zo kan men makkelijk oudere releases terugvinden.
23
Figure 4-3 Subversion
4.6
JIRA
JIRA is een issue tracker gemaakt door Atlassian. Deze project management tool
ondersteunt bug tracking, feature en enhancements request tracking.
Op de stageplaats vormde een lijst van issues van de afgelopen week de basis voor de
agenda van de wekelijkse developer meeting. Al het werk dat wordt gedaan, wordt
ingegeven in JIRA en de Subversion commits worden via een keyword in de commit
comments gekoppeld aan de juiste issues.
24
Figure 4-4 JIRA
4.7
RefApp
Binnen het IRMM wordt de RefApp structuur gebruikt als basis voor web applicaties. Er
zijn verschillende versies van de RefApp structuur. Ik heb gewerkt in projecten in een
oude versie van de RefApp (versie 1.2) en heb een nieuw project aangemaakt in de
huidige versie (versie 3.2). In de komende delen bespreek ik beide versies die ik
gebruikt heb.
De RefApp structuur wordt gegenereerd door een script, men kan instellen van welke
functies men code gegenereerd wil hebben. Men kan kiezen voor support voor Spring,
Selenium tests, een persistence API of JDBC, …
Men is vrijwel verplicht om de RefApp structuur te gebruiken in projecten omdat deze
voorziet in de ergonomics library welke ervoor zorgt dat alles dezelfde look and feel
heeft. RefApp heeft ook ondersteuning voor Ecas authenticatie. Men kan hier echter
van afwijken als men wil, maar dan moet de alternatieve structuur zeer goed
gedocumenteerd zijn. Het grootste voordeel van RefApp is dat het alle features heeft
die meestal nodig zijn in web applicaties binnen het JRC. Een ander voordeel van een
project met de RefApp structuur te schrijven, is dat de andere developers deze
structuur al kennen. Een nadeel van de RefApp structuur is dat deze vrij complex is.
4.7.1
RefApp 1.2
RefApp 1.2 maakt gebruik van Hibernate voor persistence, Tomcat als application
server en Ant als build tool. Er wordt een MVC architectuur gebruikt met behulp van
Spring. De meeste configuratie gebeurt met XML files.
25
4.7.1.1
Hibernate
Hibernate is een open-source persistence API voor Java. Hiermee kunnen Java POJO's
persistable gemaakt worden door ze te koppelen aan een relationele database via
Object/Relational mappings en ze zo op te slaan in de database.
In RefApp 1.2 worden OR mappings uit Hibernate xml files gehaald, een voorbeeld van
zo'n file is:
Code 4-1 Hibernate OR mapping
Hierin wordt de GeneralMethod bean gekoppeld aan de CRL_GENERAL_METHOD tabel.
4.7.1.2
Spring configuraties
Dit deel beschrijft de belangrijkste spring en web-app configuraties en hoe deze aan
elkaar gerelateerd zijn.
26
In de hoofdconfiguratie van de web-app wordt opgesomd waar Spring zijn bean
configuration files kan vinden. De hoofdconfiguratie bevindt zich in web/WEBINF/web.xml. De XML voor de Spring configuratie ziet er als volgt uit:
Code 4-2 Controller xml configuratie
De dataAccessContext.xml file beschrijft waar de Hibernate files gevonden moeten
worden. De servicesContext.xml file beschrijft waar service classes gevonden kunnen
worden.
De xml files in WEB-INF/controllers definiëren beans van Controller classes uit het MVC
patroon. Een voorbeeld van hoe een controller bean gemaakt wordt:
27
Code 4-3 Controller Spring bean configuratie
De properties duiden aan wat waarin geinject moet worden bij het maken van deze
bean. De values van de view variabelen zijn de namen van Views welke in src/views
bijgehouden worden in properties files. Een view definitie ziet er als volgt uit:
Code 4-4 View configuratie
De parent templateView geeft aan dat de jsp pagina uit contentUrl in het body van de
template pagina weergegeven moet worden.
Om te weten welke view uiteindelijk getoond moet worden, wordt gekeken naar de
return van de handleRequest method van de Controller. Deze geeft een ModelAndView
instance terug waarin de naam van het view als string gegeven wordt samen met een
model met daarin data om te tonen op het view (dus op de jsp pagina), bijvoorbeeld:
Code 4-5 Controller handleRequest
RefApp 1.2 biedt 3 soorten controllers die als base class gebruikt kunnen worden om
controllers te maken:


ViewController: een controller met een view attribuut dat een waarde gegeven
kan worden vanuit de bean configuratie.
FormController: een controller van een pagina met een form voor CRUD
operaties op
28

ListController: een controller van een lijst van items
Wanneer naar een url gesurft wordt, bijvoorbeeld '/feedacamAdmin.do', wordt in WEBINF/feedacam-servlet.xml deze url vertaald naar de controller bean die deze request zal
afhandelen met handleRequest. Deze mapping ziet er als volgt uit:
Code 4-6 URL mapping configuratie
4.7.1.3
Ant
Apache Ant is een build tool geschreven in Java om vaak gebruikte operaties op een
project te automatiseren. Zo kan men er build, deploy, clean, test tasks mee schrijven.
Ant hoeft niet enkel voor Java projecten gebruikt te worden; elk proces dat kan
uitgeschreven worden als targets en tasks om tot het target te komen, kan met Ant
geautomatiseerd worden. Deze targets en tasks worden beschreven in de build.xml van
het project.
Zo is er in RefApp 1.2 projecten een script om het project te cleanen waarbij onder
andere alle build files verwijderd worden, en er is een script om een war file te generen
die later kan gedeployed worden op Tomcat. Een war file bevat alle bytecode en
resources die nodig zijn om de web applicatie te runnen op een Java application server,
zoals Tomcat.
4.7.1.4
Tomcat
Apache Tomcat is een open-source implementatie van de Java Servlet en JavaServer
Pages technologieën. Op de Tomcat server wordt de web applicatie uitgevoerd.
29
4.7.1.5
Hoe uitvoeren
Om een RefApp 1.2 applicatie uit te voeren moet men eerst Ant clean uitvoeren en
daarna Ant distWar. Dit compileert de source en packaget ze tot een war file. Daarna
moet Tomcat gestart worden, en moet de war file gedeployed worden op de Tomcat
server via de Tomcat manager webinterface. Van zodra de war gedeployed is, kan men
naar de juiste locatie op de Tomcat server surfen en de web applicatie gebruiken.
4.7.2
RefApp 3.2
RefApp 3.2 is de nieuwste versie van RefApp. Deze gebruikt JPA voor persistence met
Hibernate als backend, WebLogic als application server en Maven als build tool. Er
wordt een MVC structuur gebruikt met Spring op de achtergrond. De meeste
configuratie wordt gedaan met annotations in plaats van xml configuraties.
4.7.2.1
JPA
De Java Persistence API is een abstraction layer bovenop de verschillende persistence
libraries. Door deze abstractie kan code onafhankelijk van de gebruikte persistence API
implementatie geschreven worden waardoor men later makkelijk van implementatie
kan wisselen.
JPA gebruikt annotations voor OR mappings in plaats van een xml configuratie.
4.7.2.2
Maven
Apache Maven is een tool om project management en build te ondersteunen en te
automatiseren. Het heeft een gelijkaardig doel aan dat van Ant, met het verschil dat
Maven gebruik maakt van een project object model (POM) in plaats van een build.xml
file. De POM bevat al de configuratie van het project waaronder dependencies als jar
files.
4.7.2.3
WebLogic
Oracle WebLogic is een cross-platform Java application server zoals Tomcat, waarop de
RefApp web applicatie uitgevoerd kan worden.
4.7.2.4
Hoe uitvoeren
Om het project te cleanen, compileren en lokaal te deployen, kan men dankzij Maven
een Maven script uitvoeren dat al deze taken uitvoert.
30
5
IMPLEMENTATIE VAN DE APPLICATIE
Na de analyse is het tijd om het plan in werking te zetten en ben ik begonnen met de
implementatie van de applicatie(s). In dit deel beschrijf ik hoe ik de requirements
geïmplementeerd heb, welke stappen ik hiervoor gevolgd heb en wat het uiteindelijke
resultaat is.
In de loop van het project heb ik JIRA issues gemaakt naarmate ik meer te weten
kwam over de tasks en subtasks die nodig waren om het project tot een goed eind te
brengen. Dit heeft mij geholpen om bij te houden welke taken afhankelijk zijn van
elkaar, en de rest van het team kan zo ook goed zien waar ik op dat moment mee
bezig ben.
Mijn project maakt deel uit van het overkoepelende EURL project. Dat project heeft als
doel de ondersteuning van de business van de European Union Reference Laboratories
te verbeteren. De Feed Additive Authorisation maakt daar deel van uit.
Om op de hoogte te blijven van het overkoepelende EURL project, heb ik gedurende
enkele weken wekelijks deelgenomen aan vergaderingen hierover, bovenop de gewone
wekelijkse developer meetings. In die vergaderingen konden de FSQ users feedback
geven over de EURL applicaties.
Omdat alle EURL projecten gebruik maken van dezelfde database, heb ik goed rekening
gehouden met die projecten om zeker te zijn dat de andere applicaties blijven werken
met mijn wijzigingen. Daarom geef ik eerst een korte opsomming van deze projecten
met een korte beschrijving:

crlfaacatadmin: Interne interface van EURL FAA, kan enkel gebruikt worden door
FSQ werknemers.

crlForms: Publieke interface waarlangs men nieuwe authorisation requests kan
maken voor feed additives.

crlApplication: Wordt gebruikt om externe dossiers met interne CRL dossiers te
vergelijken.

eurlreportlist: De lijst met rapporten, getoond op de IRMM website. Dit is een
nieuw project dat ik heb aangemaakt. Dit project gebruikt RefApp 3.2, de
andere projecten gebruiken RefApp 1.2.
Om tot een goed eindresultaat te komen, heb ik er eerst voor gezorgd dat men
meerdere additives aan 1 product kan koppelen in crlfaacatadmin. Dit was
oorspronkelijk een 1 op 1 koppeling. Dit vereiste aanpassingen in de database
waardoor ik ook code in crlForms en crlApplication moest aanpassen.
Hierna heb ik het mogelijk gemaakt om een rapport te koppelen aan een dossier in
crlfaacatadmin met een URL.
Eens men meerdere additives aan een product kon koppelen en rapporten kon
instellen, kon ik beginnen aan een lijst van rapporten en heb ik het eurlreportlist
project gemaakt.
Als laatste stap heb ik de deployment documentatie geschreven van eurlreportlist en
heb ik een demo gegeven aan de user van mijn werk zodat ik feedback kon krijgen en
nog aanpassingen kon aanbrengen met behulp van de feedback.
In de volgende onderdelen bespreek ik de stappen die ik ondernomen heb tijdens de
ontwikkeling en de resultaten daarvan.
31
5.1
Migratiescript
Ik heb een migratiescript geschreven om de huidige database structuur en data te
wijzigen naar de nieuwe vereiste structuur.
Code 5-1 Migratiescript
Eerst maak ik de FAA_PRD_ADDITIVES tabel met de nodige foreign keys voor de 1 op
meer koppeling. Oracle DB ondersteunt geen auto numbering op primary keys, in de
plaats daarvan moeten we een sequence aanmaken die we vervolgens in onze inserts
kunnen gebruiken voor nieuwe ids door SEQ_FAA_PRD_ADDITIVES.nextval te
gebruiken, zoals ook te zien is in de daaropvolgende INSERT.
Vervolgens zet ik oude koppelingen over door alle niet NULL ADD_ID's uit
FAA_PRODUCT toe te voegen aan FAA_PRD_ADDITIVES.
Nu dat alles van ADD_ID overgezet is naar FAA_PRD_ADDITIVES, kan deze kolom
verwijderd worden.
Als laatste voeg ik nieuwe velden toe aan de dossier tabel om de url naar het rapport,
… in bij te houden.
5.2
crlfaacatadmin
In het crlfaacatadmin project heb ik functies toegevoegd om meerdere additives te
koppelen aan een product en de URL van een report in te stellen op een dossier. In de
komende delen ga ik dieper in op wat ik in de bestaande crlfaacatadmin interface
aangepast heb.
32
5.2.1
Meerdere additives
De gebruiker kon al een enkel additive opgeven voor een product. Dit kon bij het
aanmaken van een nieuw product en bij het wijzigen van een bestaand product.
Ik heb de 'Update Product' en 'Insert Product' pagina gewijzigd zodat de gebruiker
additieven aan het product toevoegen, verwijderen en wijzigen met de voorziene
icoontjes op de 'Additives' tabel.
Figure 5-1 Additive management
Als de gebruiker klikt op het vuilbak icoontje, wordt eerst gevraagd of de gebruiker
zeker is. Hierbij wordt getoond wat er zal gebeuren. Pas na confirmatie wordt het
additief verwijderd.
Figure 5-2 Additive delete
Als de gebruiker klikt op het 'update' icoon of het 'insert' icoon (links boven in de
tabel), krijgt hij/zij volgend formulier te zien.
Figure 5-3 Additive update
Deze functionaliteiten zien er hetzelfde uit op zowel de 'Insert product' als de 'Update
product' pagina
33
5.2.2
Published report
Na men meerdere additives kon toevoegen, ben ik begonnen aan een url van een
rapport te kunnen koppelen aan een dossier. Dit gebeurt enkel op de 'Update dossier'
pagina; nieuwe dossiers hebben nooit een rapport.
De gebruiker kan op de 'Update Dossier' pagina in het 'Published report' gedeelte, de
URL naar het rapport ingeven met het 'Report link' veld (links onderaan op de
afbeelding). Als de gebruiker later een lege waarde in het veld ingeeft, wordt het
rapport ontkoppeld en heeft het dossier geen rapport meer. De gebruiker moet ook de
'Date of publishing' invullen, welke de datum is waarop het rapport gepubliceerd werd.
Optioneel, kan de gebruiker een alternatieve tekst opgeven voor de 'Product' en
'Additives' kolom op de report list pagina.
Figure 5-4 Published report fields
5.3
eurlreportlist
Met het eurlreportlist project wordt de lijst van rapporten getoond op de IRMM website.
Een product heeft niet altijd een naam, in dat geval wordt er een leeg veld getoond. De
'Active substances' die te zien zijn, zijn de additives van het product. De tabel is
gesorteerd op 'Date of report' en de FAD links linken naar de url die eerder als 'Report
link' was ingegeven in de crlfaacatadmin applicatie.
34
Figure 5-5 Report list
In de volgende onderdelen leg ik uit hoe ik dit project gemaakt heb en hoe de code
werkt.
5.3.1
RefApp 3.2 structuur genereren
Omdat eurlreportlist een nieuw project was, heb ik eerst een RefApp structuur moeten
genereren. Om de structuur te genereren heb ik eerst de laatste versie van refapp
lokaal uitgepakt. Daarna moeten de preferences ingesteld worden met een properties
file:
Code 5-2 RefApp configuratie
Hierin heb ik geconfigureerd om JDBC te gebruiken in plaats van Hibernate of JPA,
Maven in plaats van Ant, …
35
Nu dat de preferences ingesteld zijn, kan ik met een Ant script mijn nieuw project laten
aanmaken. Het gegenereerde project bevat code voor de MVC structuur, bevat Spring
bean configuraties, een template voor jsp pagina's, …
De volgende stap is om een Data Access Object (DAO) te schrijven met queries om de
data op te halen. Daarna heb ik een Service klasse geschreven welke DAO's gebruikt
om zaken in de business layer te wijzigen. De Service classes bevatten de business
logic. De Controller bevat de UI logica. Met UI logica bedoel ik datgene wat moet
gebeuren als de user op een bepaalde knop klikt (het domain wijzigen door een
bepaalde service methode aan te roepen), en welke view daarna getoond moet worden
(de jsp pagina), en met welke data (het model). De bedoeling hiervan is om data
access, business logic en presentation logic te scheiden in 3 lagen. De volgende delen
gaan in op de details hiervan.
5.3.2
Report en Product data classes
Voor we beginnen aan de DAO, moeten er eerst data classes geschreven worden om de
data in op te slaan. Dit zijn simpele beans met getters, setters en wat velden en geen
behaviour. De DAO vult instances hiervan op met data uit de database, service classes
voegen hier mogelijk nog wat aan toe en in de front-end worden ze gebruikt om de
data weer te geven aan de gebruiker.
36
37
Code 5-3 Report domain class
Code 5-4 Product domain class
5.3.3
ReportDao interface
Om de implementatie volledig te scheiden van de interface van de DAO klasse, maken
we een interface. Als we dit niet deden zouden nieuwe implementaties van deze DAO
verplicht zijn om over te erven van ReportDaoImpl (zie verder) of ReportDaoImpl zelf
aan te passen. In het geval van DAO klassen is het meestal voldoende om
ReportDaoImpl zelf aan te passen.
De ReportDao heeft 1 methode om de rapporten mee op te halen en geeft de rapporten
terug als Report objecten.
38
Code 5-5 ReportDAO
5.3.4
ReportDaoImpl
Na de interface gemaakt te hebben, maak ik een implementatie ervan. De DAO
methodes zijn de enige die sql, Hibernate sql, … mogen bevatten, aangezien dat data
access is.
Op lijn 23 wordt een annotation gebruikt om een Spring bean te maken van
ReportDaoImpl. Deze wordt later in services gebruikt om aan de methodes van de DAO
te kunnen. De naam van de bean is 'reportDao'. Deze annotation markeert de class ook
als een Repository. Deze markeringen worden gebruikt in de achterliggende Spring xml
configuraties van RefApp.
Omdat ik rechtsreeks met JDBC en JNDI werk, moet ik een DataSource object hebben
om een connectie te openen met de database. RefApp heeft al een Spring bean van een
DataSource met de juiste JNDI gemaakt. De naam van die bean is 'dataSource'. Op
regel 28 geef ik aan dat Spring de 'dataSource' bean moet injecten in mijn
ReportDaoImpl instance door setDataSource erop aan te roepen met het juiste
argument. Spring leidt 'dataSource' als naam af door te kijken naar de naam van de
setter (of getter).
Met getPublishedReports worden alle geldige rapporten opgehaald, welke we later
zullen tonen in een lijst.
Op regel 39 maken we met de connection verkregen met de DataSource een
PreparedStatement. De query haalt volgende gegevens op:

het id van het dossier

de FAD nummer van het dossier

de URL naar het report

een optionele alternatieve tekst voor het product veld

een optionele alternatieve tekst voor het additives veld

de datum van het rapport

het ID van het product van het dossier,

de trade name van het product

de additive name van het product
Er wordt gesorteerd op (in die volgorde):

datum
39

dossier id

product id

additive name
Enkel dossiers met volgende criteria worden opgehaald:

geldige report link

geldig FAD nummer

geldig date of publishing

dossier heeft 'completed' state heeft
Op regel 53 wordt de query uitgevoerd, het resultaat hiervan is een ResultSet.
Op regels 54-83 wordt de ResultSet omgezet tot een List<Report>. Dankzij de
sortering op dossier id en dan product id kunnen we door de ResultSet loopen en een
nieuw Report beginnen bij een nieuw dossier id, een nieuw Product beginnen bij een
nieuw product id, en verder gewoon products aan het huidige report toevoegen en
additives aan het huidige product.
De hele query staat in een try Block omdat er fouten kunnen zijn bij het uitlezen van de
data uit de database. Dit wordt opgevangen door een trace van de exception te geven
en te returnen.
Door het finally block zal de connectie altijd gesloten worden, anders loopt men het
risico om onnodig connecties open te laten staan en zo de pool van vrije connecties van
de database uit te putten.
40
41
Code 5-6 ReportDaoImpl
5.3.5
ReportService
Net als bij de DAO wordt bij de service klassen de implementatie gescheiden van de
interface. Omdat er weinig business logic te vinden is in het ophalen van rapporten
krijgt de ReportService ook gewoon een getPublishedReports methode.
Code 5-7 ReportService
5.3.6
ReportServiceImpl
Op regel 13 wordt een Spring bean gemaakt van deze service implementatie, met als
naam 'reportService'. Controllers kunnen dan van deze bean gebruik maken.
Op regels 16-21 wordt via Spring de 'reportDAO' bean (zie boven) geinject in
ReportServiceImpl.
Er is geen extra business logic toe te voegen aan getPublishedReports, op regel 24
wordt dan gewoon de getPublishedReports van de DAO aangeroepen.
42
Code 5-8 ReportServiceImpl
5.3.7
MVC Front-End
5.3.7.1
Controller (+model)
Op regel 17 markeren we ReportListController als een Controller. De achterliggende
Spring configuraties maken hier gebruik van om jsp pages en urls te koppelen aan de
classes gemarkeerd als Controller.
Op regels 20-25 wordt via Spring de 'reportService' bean (zie boven) geinject in de
ReportListController.
Op regel 27 wordt een RequestMapping gebruikt om te markeren dat http GET requests
afgehandeld moeten worden met de showList methode.
In regels 29 en 30 worden de rapporten opgehaald met de ReportService en daarna in
het model gestopt. Het model van RefApp is een manier om data door te geven aan de
jsp pagina (het view).
43
Code 5-9 ReportListController
5.3.7.2
JSP pagina (het view)
In de JSP pagina kunnen we waarden uit het model (zie boven) gebruiken door ${key}
te schrijven. Al wat tussen ${} wordt een EL expression genoemd. EL is de afkorting
van Expression Language. We kunnen met EL expressions makkelijk beans gebruiken,
zoals in onderstaande code duidelijk zal worden.
Op regel 21 wordt een forEach loop gestart van alle rapporten. Binnen deze loop
kunnen we naar het huidig rapport verwijzen met EL expressions als ${report}. De 'c'
prefix van de forEach tag slaagt terug op de taglib import op regel 5. Een tag library is
een verzameling van custom jsp tags en EL functions (zie bv fn verderop).
De choose-when-otherwise op regels 22-76 zorgt voor een keuze tussen een rapport
met alternatieve tekst (regels 24-39) en een rapport met standaard gegenereerde
product en additives tekst (regels 42-74).
Op regel 42 wordt een forEach loop gestart over alle producten van het huidige rapport.
${report.products} wordt ruwweg vertaald naar report.getProducts().
Regels 44-50 en 68-72 worden enkel getoond als ${report.products[0] == product}
waar is, dus enkel bij het eerste product.
Op regel 45 wordt de rowspan op het aantal producten van het huidige report gezet.
Merk op dat deze pagina geen head, body of html tags bevat. Dit komt doordat de
pagina naam eindigt op Body.jsp. Hierdoor wordt de inhoud van de pagina geïntegreerd
in het body van de jsp template gegenereerd door RefApp.
44
45
Code 5-10 reportListBody.jsp
5.3.8
Deployment documentatie
Nadat de code uitgeschreven is en lokaal getest, wordt de deployment documentatie
geschreven. Deze documentatie beschrijft hoe de applicatie in productie gebracht moet
worden. Dit document beschrijft wat gedaan moet worden op de server en de clients
om de applicatie werkende te krijgen.
46
5.4
crlForms
crlForms wordt gebruikt door externe aanvragers om nieuwe aanvragen voor feed
additive authorisations te maken. Hieronder is een formulier te zien van zo een
aanvraag.
47
Figure 5-6 crlForms submit form
De aanvrager/applicant moet na het invullen van het formulier eerst op 'Preview'
drukken en daarna op 'Submit'. Eens een aanvraag gesubmit wordt, kan de aanvraag
niet meer gewijzigd worden via de applicatie.
Door gebruik te maken van de refactoring methodes van eclipse, en de 'Find
references' functies heb ik de code van deze applicatie kunnen aanpassen aan de
wijzigingen in de database. De interface zelf is ongewijzigd gebleven, enkel de backend code moest aangepast worden.
5.5
crlApplication
crlApplication wordt gebruikt om een intern/CRL dossier, een dossier van de FSQ unit,
te vergelijken met het overeenkomstige extern/SANCO dossier. Dit zijn dezelfde
dossiers, maar ze worden op twee plaatsen bijgehouden en beheerd.
Op het beginscherm wordt gevraagd naar het 'submission number' van het extern
dossier en het CRL nummer van het intern dossier.
Figure 5-7 submission selection form
Op de volgende pagina kan men de eigenschappen van de dossiers vergelijken en de
eigenschappen afzonderlijk markeren als geaccepteerd.
48
Figure 5-8 Comparison form
Na alles geaccepteerd te hebben en op update te klikken, krijgen we volgend scherm te
zien:
Figure 5-9 Success message
Door gebruik te maken van de refactoring methodes van eclipse, en de 'Find
references' functies heb ik de code van deze applicatie kunnen aanpassen aan de
wijzigingen in de database. De interface zelf is ongewijzigd gebleven, enkel de backend code moest aangepast worden.
49
BESLUIT
In de afgelopen weken heb ik in vele projecten gewerkt en heb ik geleerd hoe ik snel
mijn weg kan vinden in bestaande code en er aanpassingen in kan maken zonder voor
regressie te zorgen. Het was soms lastig om de RefApp structuur te begrijpen en te
ontleden, dit ook omdat er niet veel centrale documentatie te vinden is over de huidige
versie en in zekere mate ook over oudere versies. Maar de RefApp structuur zorgt voor
een scheiding van database en front-end code, dus ik zie het nut er wel van in.
Ik heb ook RUP in werking kunnen zien van analyse tot ontwikkeling. Verder heb ik
leren werken met een aantal tools die ik voordien nog niet gebruikt had zoals Eclipse,
JIRA en SQL Developer.
Graag zou ik ook nog enkele suggesties meegeven om het development proces te
verbeteren.
Er wordt veel tijd besteed aan analyse, hoewel analyse belangrijk is kan deze tijd
teruggedreven worden door gebruik te maken van de Agile methodologie. Zo wordt
nieuwe functionaliteit sneller afgeleverd en worden fouten sneller ontdekt. Bijvoorbeeld,
incremental design zou kunnen helpen om code simpel te houden waar het kan en
complex te maken waar het nodig is. Hierdoor wordt het makkelijker en sneller om
nieuwe features te implementeren. Incremental design houdt in dat er geen design van
het hele project gemaakt wordt voor men begint te programmeren. Men implementeert
feature per feature en voegt zo dingen toe naargelang nodig is. Als de code moeilijk
leesbaar dreigt te worden, wordt er aan refactoring gedaan. Refactoren houdt in dat
code geherstructureerd wordt, om dit goed te kunnen doen zonder voor regressie te
zorgen moeten er geautomatiseerde tests zijn van de applicatie.
Met de huidige RefApp structuur zou data access code in de DAO classes moeten
komen, business logic code in de Service classes en code die te maken heeft met hoe
gereageerd moet worden op input in de Controller classes. In de praktijk echter, blijven
de Service classes vaak leeg en komt alle business logic bij in de Controller's terecht.
Dit zorgt voor extra clutter, complexiteit, decentralisatie en verminderde leesbaarheid
in de Controller's.
Verder heeft de huidige business layer (de Service classes) een vrij proceduraal
karakter. Wat ik bedoel met een proceduraal karakter is dat de business layer een
verzameling van functies is in plaats van een verzameling van slimme domain objects
die samenwerken, messages sturen naar elkaar, hun data en implementation details
verbergen, en behaviour hebben. Merk op dat de DAO classes ook een proceduraal
karakter hebben, maar dit is normaal aangezien DAO classes werken met een niet-OO
database. Als een voorbeeld van zo'n soort business layer verwijs ik naar een project
van mij, geschreven in PHP:
http://limyreth.sin.khk.be/files/eindwerk/sincontrol2domain.html
Ik raad ook aan om te kijken naar het volgende document waarin ik een nieuwe manier
bespreek om web applicaties te maken en structureren. Deze manier maakt
development veel makkelijker, maar het vereist andere technologieën dan die nu
gebruikt zijn (zoals bijvoorbeeld Java Swing of SWT in plaats van de Java web
technologieën). Het document is te vinden op deze web locatie:
http://limyreth.sin.khk.be/files/eindwerk/webapp2.html.
Ik vond het een geslaagde stage. Ik heb veel bijgeleerd en heb een resultaat kunnen
afleveren aan de FSQ unit waar de users zeer tevreden over waren. Het publiceren van
rapporten gaat nu sneller en makkelijker, en het general public krijgt sneller de nieuwe
rapporten te zien. Het doet me een groot plezier om te zien dat ik mijn project tot een
goed einde heb kunnen brengen en zo heb kunnen bijdragen tot de business.
50
LITERATUURLIJST
Apache Ant. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Apache_Ant
Apache Maven. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Apache_Maven
Apache Tomcat. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Apache_Tomcat
Eclipse (Software). (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Eclipse_%28software%29
European Commision. (2010). Structure. Opgeroepen op 25 mei 2011, op het internet:
http://ec.europa.eu/dgs/jrc/index.cfm?id=1440
Hibernate (Software). (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Hibernate_%28software%29
Institute for Reference Materials and Measurements. (2008). Key competences.
Opgeroepen op 25 mei 2011, op het internet:
https://irmm.jrc.ec.europa.eu/about_IRMM/key_competences/Pages/index.aspx
Institute for Reference Materials and Measurements. (2010). European Union Reference
Laboratories. Opgeroepen op 25 mei 2011, op het internet:
https://irmm.jrc.ec.europa.eu/EURLs/Pages/index.aspx
Institute for Reference Materials and Measurements. (2010). European Union Reference
Laboratory for Feed Additives, EURL-FA. Opgeroepen op 25 mei 2011, op het internet:
https://irmm.jrc.ec.europa.eu/EURLs/EURL_feed_additives/Pages/index.aspx
Java Persistence API. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Java_Persistence_API
Java (programming language). (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Java_%28programming_language%29
Java (software platform). (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Java_%28software_platform%29
JIRA. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/JIRA
Oracle. (s.a.). Oracle SQL Developer. Opgeroepen op 25 mei 2011, op het internet:
http://www.oracle.com/technetwork/developer-tools/sqldeveloper/overview/index.html
Oracle WebLogic Server. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Weblogic
Red Hat, Inc. (2004). Hibernate Reference Documentation. Opgeroepen op 25 mei
2011, op het internet:
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/
RefApp Wiki. (s.a.). Opgeroepen op 25 mei 2011, op het internet:
https://webgate.ec.europa.eu/CITnet/confluence/display/RefApp/Home
51
Spring Framework. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Spring_Framework
SpringSource. (s.a.). Spring API. Opgeroepen op 25 mei 2011, op het internet:
http://static.springsource.org/spring/docs/3.1.0.M1/javadoc-api/
Subversion. (s.a.). Gevonden op 25 mei 2009 op Wikipedia:
http://en.wikipedia.org/wiki/Subversion
Download