1 Centralisatie van applicatie-instellingen instellingen met de BRail Configuration Application Student Yoeri Deschrijver Stagementors Gert Servranckx...
Centralisatie van applicatie-instellingen instellingen met de
BRail Configuration Application
Student
Yoeri Deschrijver
Stagementors
Gert Servranckx Dominique Quévy
Stagebegeleider
Corneel Theben Tervile
Stageplaats
H-ICT B-Holding Brussel
Academiejaar
2007-2008
Woord vooraf Net zoals alle laatstejaarsstudenten van de richting Toegepaste Informatica aan de hogeschool WestVlaanderen, heb ik in het laatste semester van de opleiding al eens kunnen proeven van het bedrijfsleven tijdens een stage. Ik heb mijn stage gelopen bij de dienst H-ICT van B-Holding (de overkoepelende holdingmaatschappij van de NMBS) te Brussel. Als softwareontwikkelaar/analist werd ik er ingezet in het .NET Competence Center. Dit is de dienst waar applicaties ontworpen worden met behulp van de .NET Technologie. Tijdens deze stageperiode heb ik meer bijgeleerd dan ik ooit kon dromen en dit niet enkel op vlak van informatica. Ik heb veel raad en advies meegekregen die ik de rest van mijn carrière zal kunnen blijven gebruiken. Ook werd mijn talenkennis, dankzij de vele Franstalige en Engelstalige collega’s, aardig bijgeschaafd en werd mijn idee over het ontwikkelen van software in de professionele wereld behoorlijk aangepast. Dit dossier is mijn eindwerk in het kader van de opleiding toegepaste informatica. De nadruk in dit eindwerk ligt vooral op de applicatie die ik tijdens mijn stage ontwikkeld heb: de BRail Configuration Application. Ik zal proberen om op een zo interessant mogelijke manier voor te stellen hoe dit project gegroeid is van nul tot een volwaardige applicatie, welke trouwens ook na mijn stageperiode zal gebruikt worden door de verschillende afdelingen van H-ICT. Verder wil ik in dit voorwoord ook graag nog een aantal mensen bedanken. Om te beginnen wil ik mijn ouders bedanken, die mij de kans gaven om te studeren, mij altijd gesteund hebben en altijd in mij geloofd hebben. Liefste ouders, dank u wel. Vervolgens wil ik alle docenten die lesgeven in de richting toegepaste informatica bedanken voor de kennis die zij mij meegegeven hebben. In het bijzonder Mevr. Roels en Dhr. Theben Tervile. Zonder Mevr. Roels had ik geen weet gehad van informaticastages bij B-Holding en zou ik dus nooit zo’n interessante en leerrijke stage gehad hebben. Dhr. Theben Tervile was mijn stagebegeleider en zonder hem had ik nooit zo’n interessant eindwerk kunnen afleveren als dit. Hij was namelijk altijd bereikbaar voor vragen of problemen in verband met mijn stage. Een betere begeleider voor mijn stage kan ik me niet voorstellen. Dhr. Theben Tervile, Mevr. Roels en alle andere docenten: dank u wel. Als laatste wil ik mijn twee stagementors Dhr. Gert Servranckx en Dhr. Dominique Quèvy bedanken, voor de interne begeleiding van mijn stage. Ook zou ik alle collega’s van het .NET Competence Center willen bedanken voor de onvergetelijke werkervaring. In het bijzonder zou ik Dhr. Gert Servranckx nog eens extra willen bedanken, omdat hij de persoon was waar ik het meeste contact mee had tijdens mijn stage en omdat hij zonder twijfel de persoon is waarvan ik het meest bijgeleerd heb. Ik ken veel personen die denken dat ze altijd gelijk hebben, maar Gert is werkelijk een persoon die altijd gelijk heeft. Zonder hem was mijn stage niet hetzelfde geweest. Dhr. Dominique Quèvy, Dhr. Gert Servranckx en alle andere collega’s: dank u wel.
Samenvatting In een grote bedrijfsomgeving worden vaak verschillende technologieën gebruikt. Dit houdt in dat van heel wat zaken configuratie-instellingen moeten bijgehouden worden. Denk maar aan instellingen van webservers (Apache, IIS...) en applicatie afhankelijke instellingen (web.config, app.config, propertyfiles…). Van al deze configuratie-instellingen circuleren er vaak verschillende versies binnen het bedrijf. Bijvoorbeeld wanneer een ontwikkelaar aanpassingen doet aan een configuratiebestand en deze wijzigingen niet meedeelt aan andere ontwikkelaars. Of wanneer een project van de ene status naar een andere evolueert, bijvoorbeeld van ontwikkeling naar acceptatie, dan kunnen ook meerdere versies van configuratiebestanden ontstaan. Het is moeilijk om complete en up-to-date configuratie informatie te verkrijgen in een dergelijke bedrijfsomgeving. Het doel van mijn stageopdracht, de BRail Configuration Application, is dan ook het beheren van alle applicatie instellingen voor alle projecten in één centrale configuratie database. Op basis van de informatie in deze centrale database, is het dan mogelijk om de gewenste documenten te genereren. Sleutelwoorden: Stage, Informaticaproject, BRail Configuration Application, NMBS, .NET Technologie, Oracle, Functionele analyse, Technische analyse.
Abstract Imagine you are working as a software developer in a large environment where various technologies are used. This means that you have to keep track of a large number of configuration settings, like web server settings (Apache, IIS …) and application dependent settings (web.config, app.config, property files…). On top of that, there are probably circulating several versions of those configuration settings at your company. For instance when a developer changes a configuration file and doesn’t notify the other developers. Or when a project evolves from one status to another, let’s say from development to acceptation, multiple versions of configuration files can be created. You probably realize that it is hard to get complete and up-to-date configuration information in such an environment. This is what also happened in the company where I did my internship: the unit information and communication technology (Short: H-ICT) of the Belgian railways. Therefore the goal of my project, the BRail Configuration Application, is to centralize the configuration information for all projects in one database. Based on the information in this database, it is possible to generate the desired output. Key Words: Internship, IT project, BRail Configuration Application, NMBS/SNCB, .NET Technology, Oracle, Functional analyses, Technical analyses.
Verklarende woordenlijst ADO.NET
ActiveX Data Objects for .NET, afgekort naar ADO.NET, is de opvolger van de eerdere uitgave van Microsoft ADO. ADO.NET is verbonden aan het .NET Framework en biedt, net als zijn voorganger, een programmeerinterface om (web-)applicaties met een willekeurige database te laten communiceren.
AIM
AIM staat voor Application Infrastructure Modification en is een intern document van H-ICT. Dit document bevat alle noodzakelijke informatie (te contacteren personen, connectiestring…) om een bepaalde opstelling voor een applicatie op te zetten of te veranderen in een bepaalde omgeving.
AJAX
AJAX (Asynchronous Javascript & XML) is een term voor het ontwerp van interactieve webpagina's waarin asynchroon gevraagde gegevens worden opgehaald van de webserver. Daardoor hoeven dergelijke pagina's niet in hun geheel herladen te worden. Zo'n pagina is te vergelijken met een applicatie die in de browser draait. De term is op 18 februari 2005 door Jesse James Garrett gelanceerd en werd door grote spelers als Google en Amazon geadopteerd.
Apache
Apache is een opensource webserver en wordt gebruikt in combinatie met verschillende databases, template-talen, scripttalen en programmeertalen ten behoeve van webapplicaties.
App.config
Een app.config bestand is hetzelfde als een web.config bestand (zie verder), maar dan voor een Windows applicatie in plaats van een web applicatie.
CVS
CVS is kort voor Concurrent Versions System. Dit is een versioning systeem voor softwareontwikkeling. Tijdens mijn opleiding werd dit gebruikt in de lessen Java.
Drupal
Drupal is een opensource contentmanagementsysteem (CMS), ontwikkeld in de programmeertaal PHP en uitgebracht onder de GNU General Public Licentie (GPL). Een CMS is webserversoftware die het eenvoudig maakt webpagina's aan te maken en - al dan niet toegespitst op de individuele bezoeker - te tonen.
DSL
DSL, wat staat voor Domain Specific Language, is het tegenovergestelde van general purpose languages zoals C#, Java of UML. DSL wordt de laatste jaren steeds populairder. Het is een programmeer- of specificatietaal die enkel toegepast wordt op één domein van problemen. Een voorbeeld van een DSL zijn regulaire expressies.
Haskell
Haskell is een zuivere functionele programmeertaal vernoemd naar de wiskundige Haskell Brooks Curry.
Holdingmaatschappij
Een holding is een vennootschap die zelf geen activiteiten heeft, maar aandelen houdt in één of meerdere andere vennootschappen.
IDE
Een integrated development environment of IDE is computersoftware die een softwareontwikkelaar ondersteunt bij het ontwikkelen van computersoftware.
IIS
IIS (Microsoft Internet Information Services) is een verzameling serverdiensten voor het Internet bedoeld voor Windows-machines. Een dergelijke machine wordt hierdoor een zogenaamde webserver.
Microsoft Visio
Microsoft Visio is een applicatie voor het maken van technische en logische schema's. Het programma is bedoeld voor technici en stelt deze in staat om relatief eenvoudig stroomschema's, (kantoor)plattegronden, databasemodellen en andere technische documenten te maken. De versie die ik gebruikt heb tijdens mijn stage, Microsoft Visio For Enterprise Architects, is een speciale uitgave die bedoeld is voor enterprise ontwikkelaars.
ML
ML is een functionele programmeertaal, ontwikkeld door Robin Milner en anderen aan de Universiteit van Edinburgh. ML was oorspronkelijk een afkorting voor Meta Language. ML is, in tegenstelling tot Haskell, een "onzuivere" functionele taal, dit wil zeggen dat ook imperatief programmeren mogelijk is in ML. F#, de functionele programmeertaal van Microsoft, is eigenlijk een ML-dialect.
NDCC
NDCC staat voor .NET Competence Center. Dit is de afdeling op mijn stageplaats die instaat voor de ontwikkeling van software met behulp van de Microsoft .NET technologie. Dit is de afdeling waar ik gewerkt heb tijdens mijn stage.
OTAP
De afkorting OTAP staat voor Ontwikkeling Test Acceptatie en Productie. Het is een veelgebruikte afkorting in de ICT en geeft een pad aan dat wordt doorlopen tijdens o.a. softwareontwikkeling. Het pad dat wordt doorlopen is als volgt: Een programma of component wordt eerst ontwikkeld in de ontwikkelomgeving. Als de programmeur denkt klaar te zijn, wordt het gekopieerd naar de Testomgeving. Daar kan gecontroleerd worden of het programma naar behoren werkt en of het goed kan communiceren met zijn omgeving. Als het goed is bevonden wordt het gekopieerd naar de acceptatieomgeving. Dit is een omgeving waar een klant in kan kijken maar waar normaal gesproken geen gebruikers bij kunnen. De klant kan dan beoordelen of aan zijn eisen en specificaties is voldaan. Indien de klant het programma goedkeurt wordt het gekopieerd naar de productieomgeving waar het gebruikt kan worden door alle gebruikers van het systeem.
OTCC
OTCC staat voor Oracle Technology Competence Center. Dit is de afdeling op mijn stageplaats die instaat voor de ontwikkeling van software met behulp van Oracle technologieën.
Properties Files
Properties files (extensie .properties) zijn bestanden die gebruikt worden in projecten op basis van een Java technologie. Deze bestanden worden gebruikt om de configureerbare parameters van een applicatie op te slaan. Ze worden ook vaak gebruikt om strings op te slaan voor lokalisatie. Bestanden met de extensie .properties worden ook vaak Property Resource Bundels genoemd.
Regular Expression
Een reguliere expressie (afgekort tot “regexp”, “regex” of RE) is een manier om patronen te beschrijven waarmee een computer tekst kan herkennen. Reguliere expressies worden in veel editors en hulpprogramma’s gebruikt om stukken tekst te doorzoeken en te manipuleren op basis van bepaalde patronen. Veel programmeertalen ondersteunen reguliere expressies voor tekstmanipulatie.
RFI
RFI staat voor Request For Intervention en is een intern document op mijn stageplaats. Dit document waarschuwt alle betrokken personen voor de uitvoering van een bepaalde AIM (zie eerder).
Ruby
Ruby is een programmeertaal, die ontworpen is om snel en gemakkelijk objectgeoriënteerd te programmeren.
Ruby On Rails
Ruby On Rails, ook vaak ROR of eenvoudigweg Rails genoemd, is een opensource webapplicatie raamwerk, geschreven in Ruby. Het volgt heel nauwgezet het MVC-model. Het streeft naar eenvoud en staat het toe praktische applicaties te ontwikkelen met minder code en minder configuratie dan andere frameworks.
SourceForge
SourceForge.net is een website voor opensourcesoftware. Het is 's werelds grootste verzamelplaats voor open software. De ontwikkeling van de software, de homepage en het downloaden van de software worden beheerd door de site.
Stored Procedure
Een stored procedure is een programma dat bewaard wordt binnen een databank. Opgeslagen procedures worden gewoonlijk geschreven in een daarvoor geschikte databanktaal, in mijn geval was dit PL/SQL voor Oracle.
TFS
Team Foundation Server (afgekort als TFS) is een Microsoft tool voor source control, data collection, reporting en project tracking. Het is bedoeld om meerdere programmeurs aan één software development project te laten werken. Het is beschikbaar als stand-alone software, of als server-side backend voor Visual Studio Team System. (Zoals op mijn stage het geval was)
VSTS
VSTS is kort voor Visual Studio Team System. Deze editie van Visual studio is vooral gericht op het vereenvoudigen en vergemakkelijken van de samenwerking tussen de verschillende rollen in een softwareontwikkelingcyclus.
Web.config
Een web.config bestand is het configuratiebestand van een ASP.NET web applicatie. Dit bestand is een XML document dat de configuratie-informatie van de webapplicatie bevat. Het bevat informatie over security instellingen, de geladen modules, sessie status configuratie, lokalisatie en instellingen in verband met compileren. Web.config bestanden kunnen ook applicatie specifieke instellingen bevatten zoals een database connectiestring.
WMI
WMI is kort voor Windows Management Instrumentation. WMI is een API in het Windows besturingssysteem dat het toelaat om toestellen en systemen in een (enterprise) netwerk te beheren en controleren. WMI biedt de mogelijkheid om informatie op te slaan op en op te halen van computers, netwerken en applicaties.
Inhoudsopgave 1 Het bedrijf .................................................................................................................................. 10 1.1
De eenheid information & communication technology (kortweg H-ICT), waar ik mijn stage gelopen heb, is een afdeling binnen het moederbedrijf van de Belgische spoorwegen NMBS B-Holding. Deze holdingmaatschappij heeft twee dochterbedrijven: De exploitant, die de naam NMBS behouden heeft na de herstructurering van de Belgische spoorwegen in 2005, zorgt voor alles wat de uitbating van reizigers- en goederenvervoer betreft. De infrastructuurbeheerder, Infrabel, is verantwoordelijk voor alles wat te maken heeft met spoorinfrastructuur en veiligheidssystemen.
Op 1 januari heeft de NMBS haar structuren gewijzigd aan de Europese wetgeving in verband met de liberalisering van het spoorvervoer. De NMBS B-Holding heeft het statuut van naamloze vennootschap van het publieke recht (NV) en is de juridische erfgenaam van de toenmalige NMBS. De NMBS B-Holding is de werkgever van het voltallige spoorwegpersoneel van de NMBS-Groep. Dat telt circa 38 000 personeelsleden. De Holding is eigenaar van de stationsgebouwen, parkings, fietsenstallingen en ruimtes voor fietsenverhuur in de stationsomgeving. Verder staat zij in voor de veiligheid op en de beveiliging van het spoorwegdomein. Daarenboven beheert zij de ICT-netwerken voor de volledige groep. Ze zet zich in voor het behoud van het historisch patrimonium van de spoorwegactiviteit en heeft de promotie van het vervoer op het Belgische spoorwegnet, een van ’s werelds dichtste, tot doel.
H-ICT, de eenheid information & communication technology, maakt deel uit van de afdeling Directie, Strategie & Coördinatie van de NMBS B-Holding. Binnen H-ICT onderscheiden we vier diensten: Netwerken (H-ICT 1), Softwareoplossingen en informatica (H-ICT 2), Operations (H-ICT 3) en Strategie (H-ICT 4). Binnen H-ICT 2: Softwareoplossingen & informatica bevindt zich binnen de afdeling H-ICT 2.3 Software Competence Center. Nogmaals daarin bevindt zich de dienst H-ICT 237 .NET Competence Center (NDCC), onder leiding van Dominique Quévy, waar ik tijdens mijn stage gewerkt heb.
H-ICT ICT legt zich toe op de domeinen van informatica en telecommunicatie. Haar opdracht is advies verstrekken, oplossingen uitwerken die aan de behoeften en eisen van haar klanten tegemoetkomen, en deze exploiteren zonder ooit uit het oog te verliezen dat de belangrijkste doelstelling erin bestaat, een werkelijke toegevoegde waarde te creëren voor de diverse klanteenheden. De missie van H-ICT ICT kan in 4 richtlijnen worden samengevat: 1. De continuïteit van de bedrijfsvoering garanderen. Dit betekent: • Erover waken dat alles wat operationeel is, het ook blijft. Daartoe moet de exploitatie van de systemen en toepassingen verzekerd zijn. • Ervoor zorgen dat cruciale gegevens van de onderneming veilig zijn. NMBS proactief te 2. Een meerwaarde te creëren door de processen en activiteiten van de NMBS-groep ondersteunen, in overeenstemming met de operationele en strategische behoeften van elke onderneming. Het betreft: • Alle interactie met de klanteenheden van de NMBS-groep. NMBS • De activiteiten waarbij de informatica en/of de telecommunicatie een kostenvermindering kunnen bewerkstelligen of onmisbaar zijn voor de veiligheid van het vervoer. • Het verbeteren van de financiële en niet-financiële niet beheersinformatie. 3. Alles in het werk erk stellen om het financiële evenwicht van de eenheid te garanderen. 4. Partnerships ontwikkelen. 1.1.4
Geografische ligging
Geografisch is H-ICT ICT opgesplitst in 4 delen: • • • •
Centrale Administratie Zone Centrum Zone Noord Zone Zuid
Ik was tewerk gesteld in de Zone Zuid, namelijk op de tweede verdieping van het NMBS Atrium gebouw (zie foto). Dit gebouw ligt op vijf minuten wandelen van het station Brussel-Zuid, Brussel wat ideaal was aangezien ik elke dag met de trein kwam. Het adres van mijn stageplaats vindt u hieronder: Adres: Atrium B-Holding Hallepoortlaan 40 1060 Brussel
Mijn stageopdracht omvat hoofdzakelijk de functionele analyse, de technische analyse en de ontwikkeling van de BRail Configuration Application. Het doel van deze applicatie is het beheren van alle applicatie-instellingen voor alle projecten binnen de verschillende competence centers van H-ICT in één centrale configuratiedatabase.
2.2
Situering
Naast het .NET Competence Center zijn er nog een aantal Software Competence Centers binnen H-ICT die zich op andere technologieën focussen. Van alle projecten die in deze verschillende Competence Centers ontwikkeld worden, moeten verschillende configuratie-instellingen bijgehouden. Deze worden bijgehouden in verschillende configuratiebestanden per applicatie (web.config, app.config, properties files…) en in configuration files van verschillende servers (apache, IIS…). Dit leidt tot een aantal problemen. Ten eerste kan iedereen gevoelige informatie, zoals wachtwoorden van mailboxen en connectiestrings rechtstreeks in de configuratiebestanden bekijken. Een tweede probleem is dat het verkrijgen van volledige en up-to-date configuratie informatie nog steeds manueel moet gebeuren, wat vaak niet gemakkelijk is. Omdat H-ICT een zeer groot bedrijf is, moeten vele zaken ook worden aangevraagd via officiële documenten. Deze officiële documenten bevatten eigenlijk ook configuratie-instellingen. Zo moet een repository op een Team Foundation Server voor .NET projecten aangevraagd worden via een dergelijk officieel document. Het probleem met deze officiële documenten is dat ze enkel nuttig zijn, als ze correct worden ingevuld. Dit is jammer genoeg niet altijd het geval. Het doel van mijn applicatie is een oplossing bieden voor al deze problemen. De BRail Configuration Application moet dus eigenlijk alle configuratie-instellingen voor alle technologieën en omgevingen centraliseren in één configuratiedatabase. Op basis van de informatie in deze centrale database moet het ook mogelijk zijn om verschillende documenten te genereren. Dit kunnen zowel officiële aanvragen (meestal worddocumenten) als gewone (vaak XML bestanden) configuratiebestanden zijn.
2.3
Functionele analyse
Het eerste deel van mijn opdracht was de functionele analyse. Dit is eigenlijk een beschrijving van alle functies die men in het programma wou hebben. Het opstellen van deze functionele analyse hield in dat ik met de klant ging praten en op basis van die gesprekken een idee kreeg van wat de applicatie moest worden. Op de eerste dag van mijn stage kreeg ik het verslag van een brainstormsessie over het doel van de applicatie. Dit waren niet meer dan een aantal handgeschreven notities, maar het was wel een startpunt voor de functionele analyse.
Vanaf dag twee ben ik begonnen aan de eigenlijke functionele analyse. Dit was het luisteren naar de klant, interpreteren en mijn bevindingen in een document beschrijven. Hiervoor was er een template beschikbaar die ik moest gebruiken. De functionele analyse (en alle andere documenten) moest in het Engels gebeuren. Het functionele analysedossier bestond voor een groot deel uit gebruikersinterfaces voor de toekomstige applicatie, die ik ontworpen heb met Microsoft Visio For Enterprise Architects. Bij iedere volgende meeting met de klant, moest ik dan deze interfaces voorleggen om na te gaan of mijn visie van de applicatie overeenstemt met die van de klant. Dit was niet altijd het geval, waardoor ik vaak mijn analysedossier moest aanpassen. De functionele analyse was bijgevolg een proces van voortdurend aanpassen tot ik perfect wist wat de klant wou en hoe de gebruikersinterfaces er moesten uitzien. In de rest van dit hoofdstuk ga ik de inhoud van het functionele analysedossier dat ik opgesteld heb voor de BRail Configuration Application proberen toe te lichten. Een kopie van het originele functioneel analysedossier vindt u terug in de bijlagen. 2.3.1
Tijdslijn Voor het opstellen van het functioneel analysedossier worden normaal ongeveer tien werkdagen gerekend op mijn stageplaats. Maar omdat de klant (mijn stagementor) nogal moeilijk bereikbaar was en omdat het project een behoorlijk grote omvang had, heeft het toch iets langer geduurd. Hiernaast ziet u het schema van het verloop van functionele analyse binnen het NDCC. Ik heb hetzelfde schema doorlopen met het enige verschil dat er meer tijd tussen de verschillende meetings zat. Dit had als gevolg dat ik pas na zo’n zeventien werkdagen klaar was met de functionele analyse van de BRail Configuration Application.
Het eerste deel van de functionele analyse was uiteraard de functionele beschrijving van de applicatie op punt stellen. Het et hoofddoel van de applicatie is het centraliseren centraliseren van alle applicatie-instellingen applicatie voor alle omgevingen in één configuratiedatabase. configuratie De configuratiedatabase database wordt opgevuld via een wizard met vragen per applicatie. Eens er genoeg applicatie-instellingen ingevoerd zijn via de wizard, is het mogelijk om bepaalde output te genereren op basis van een vooraf gedefinieerd sjabloon. De gegenereerde output kan an een configuratie bestand zijn, maar kan ook een gewoon oon tekstdocument zijn.
2.3.3
Verschillende soorten gebruikers
Om te kunnen inloggen in de applicatie, moeten de gebruikers één van de volgende drie gebruikersrollen hebben: 1. Full Control Administrator: Administrator Deze gebruikersrol srol heeft toegang tot alle features van de applicatie. 2. Competence Center Administrator: Administrator Deze gebruikersrol heeft enkel toegang tot features van zijn eigen technologie. 3. Users: Deze gebruikersrol heeft enkel toegang tot de applicaties waarvoor hij/zij in het projectteam van die applicatie zit. Deze rollen werden tijdens de ontwikkeling van de applicatie geïmplementeerd met behulp van de ASP.NET Authentication componenten. componenten. Later, wanneer de applicatie officieel in productie producti gaat, zullen deze rollen gedefinieerd worden in het BRail Application Portaal. Dit is een portaal waarin alle applicaties die ontwikkeld worden binnen H-ICT H geplaatst worden, zodat men niet afzonderlijk voor elke applicatie moet inloggen. In de BRail Configuration figuration Application zelf, wordt er per applicatie ook een projectteam bijgehouden. De gegevens van de leden van deze projectteams worden, bij het toevoegen van een lid aan een applicatie, opgehaald uit de Active A Directory irectory en in de Oracle database van de BRail Configuration Application opgeslagen als een bepaalde rol. rol Voorbeelden van interne rollen zijn: Projectleider, Projectmanager, .NET Ontwikkelaar, Java Ontwikkelaar… Deze rollen rollen worden responder-types responder genoemd en worden gedefinieerd edefinieerd door een Full Control Cont Administrator.
Er zijn twee niveaus van gebruikersrollen. Enerzijds extern in het BRail Application Portaal en anderzijds intern in de BRail Configuration Application per applicatie. Om in te loggen in de BRail Application Configuration moet men dus beschikken over één van de externe rollen. Indien u Full Control Administrator bent, dan zal u alle applicaties kunnen zien in het application-overview (zie verder). Indien u Competence Center Administrator bent, dan zal u enkel de applicaties van jouw technologie kunnen zien. Maar indien u User bent, zal u enkel de applicaties kunnen zien waarvoor u een lid bent van het projectteam (een interne rol dus) van die applicaties.
2.3.4
Functionaliteiten
Een volgend onderdeel in de functionele analyse was het definiëren van de functionaliteit die de BRail Configuration Application moest bieden. Deze heb ik onderverdeeld per gebruikersrol. Merk op dat de Full Control Administrator ook toegang heeft tot de functionaliteiten van de Competence Center Administrator en dat de Competence Center Administrator ook toegang heeft tot de functionaliteiten van de User. 2.3.4.1
Full Control Administrator
De Full Control Administrator heeft toegang tot volgende functionaliteiten: • Category Management Het beheren van de categorieën (van de vragen). Dit houdt in: een lijst tonen van alle categorieën, de volgorde van de categorieën aanpassen, een nieuwe categorie aanmaken, een categorie bewerken en een categorie markeren als verwijderd (= logische delete). • Technology Management Het beheren van de technologieën. Dit houdt in: een alfabetische lijst tonen van alle technologieën, een nieuwe technologie aanmaken, een technologie bewerken en een technologie markeren als verwijderd (= logische delete). • Environment Management Het beheren van de omgevingen. Dit houdt in: een alfabetische lijst tonen van alle omgevingen, een nieuwe omgeving aanmaken, een omgeving bewerken en een omgeving markeren als verwijderd (= logische delete). • Responder Management Het beheren van de responder-types voor de vragen, dit zijn ook de functies die men in een projectteam van een applicatie kan hebben. Dit beheren houdt in: een alfabetische lijst tonen van alle responder-types van een bepaalde technologie, een nieuw responder-type aanmaken, een responder-type bewerken en een responder-type markeren als verwijderd (= logische delete). • Application Management Het beheren van de applicaties. Dit houdt in: het creëren van een nieuwe applicatie (met minimaal één lid in het projectteam), een alfabetische lijst tonen van alle applicaties per technologie, een bestaande applicatie bewerken en een applicatie markeren als verwijderd (=logische delete).
• Management Of Deleted Items Het beheren van de verwijderde items. Bijna alle objecten in deze applicatie worden bij het verwijderen enkel logisch verwijderd m.a.w. er wordt enkel een flag in de record op true gezeten, in plaats van de record te wissen. Met deze functionaliteit is het mogelijk om de logische gewiste records in de database ook echt te wissen of terug te herstellen (restore). • Synchronization with the Active Directory Synchronisatie met de active directory. Bij het toevoegen van een persoon als teammember van een applicatie, wordt zijn/haar gebruikersinformatie opgezocht in de active directory en gekopieerd naar een tabel in de BRail Configuration Application database. Dit is nodig om functies per applicatie aan de personen te kunnen koppelen. Na een tijdje is het mogelijk dat de informatie in deze interne tabel met gebruikersinformatie out of date geraakt. Met deze functionaliteit is het dus mogelijk om opnieuw met de Active Directory te synchroniseren.
2.3.4.2
Competence Center Administrator
De Competence Center Administrator heeft toegang tot volgende functionaliteiten: • Question Management Het beheren van de vragen. Dit houdt in: het creëren van een nieuwe vraag, een lijst tonen van alle vragen in een boomstructuur (vragen/sub vragen/sub sub vragen…) per technologie en per categorie, de vraag/sub vraag relaties van de vragen kunnen aanpassen, een bestaande vraag bewerken, een vraag markeren als verwijderd (=logische delete) en een follow-up koppelen aan een vraag. • Output Document Management Het beheren van de sjablonen/templates voor de generatie van output documenten. Dit houdt in: een alfabetische lijst tonen van alle document sjablonen, een nieuw document sjabloon ontwerpen, een document sjabloon bewerken en document sjabloon markeren als verwijderd (=logisch delete). Een belangrijk onderdeel hiervan is het mappen van de antwoorden (op de vragen) naar velden in de inhoud van het output document.
De User heeft toegang tot volgende functionaliteiten: • Running the wizard Het doorlopen van de wizard voor zijn/haar applicaties met vragen. Dit houdt dus in: het antwoorden op een vraag, het antwoord op een vraag aanpassen (overschrijven) en een lijst krijgen met alle vragen die door hem/haar moeten beantwoord worden (in wizard vorm). • Generating Output Het genereren en downloaden van output documenten op basis van de (door de Competence Center Administrator) gedefinieerde templates voor zijn/haar applicaties. • Reporting Het bekijken van een rapport over zijn/haar applicaties en de vragen die gelden voor deze applicaties. Dit houdt in: een overzicht bekijken van alle vragen die al beantwoord zijn en die nog moeten beantwoord worden per applicatie, een overzicht van alle vragen die nog op een externe actie wachten (follow-up) bekijken en het bekijken van een rapport per vraag per applicatie (door wie geantwoord, aantal items…) • Follow-up Het wijzigen van de status van een follow-up voor een bepaalde vraag, die door hem/haar moest opgevolgd worden. 2.3.5
Uitleg bepaalde termen
Een belangrijk onderdeel van het interne functionele analysedossier dat ik opgesteld heb tijdens mijn stageperiode, waren de “Reference Terms”. Dit is een overzicht van alle termen die ik gebruikt heb in de analyse met hun betekenis. Ik heb ervoor gekozen om deze niet in de verklarende woordenlijst van dit dossier te plaatsen, omdat hun betekenis enkel van toepassing is voor mijn applicatie. In een andere context kunnen alle termen die ik hieronder beschrijf, een volledig andere betekenis hebben: Applicatie (Application)
Een applicatie verwijst naar een softwareontwikkelingsproject binnen H-ICT. Het is een groepering van alle algemene informatie en alle technische instellingen voor een bepaald project.
Technologie (Technology)
Een technologie verwijst naar een programmeertaal waarin een applicatie kan ontworpen worden. In praktijk is een technologie vaak gekoppeld aan een Software Competence Center (.NET technologie .NDCC, Oracle technologie OTCC…).
Categorie (Category)
Een categorie is een groepering van vragen. Categorieën kunnen gesorteerd worden. Deze sortering bepaald de volgorde van de vragen in de wizard (eerst de vragen van de eerste categorie, dan de vragen van de tweede categorie…).
Vraag (Question)
Een vraag is een manier om data te op te vragen. Het antwoord op een vraag is eigenlijk een instelling voor de betreffende applicatie.
De software projecten in de verschillende Software Competence Centers van H-ICT worden op verschillende omgevingen uitgerold. Er is sprake van een soort van OTAP-straat. Elk antwoord op een vraag is afhankelijk van een bepaalde omgeving. Er wordt dus een soort van geschiedenis bijgehouden van de antwoorden op basis van de omgeving.
Document (Document)
Op basis van de antwoorden op de vragen zullen er verschillende soorten documenten kunnen gegenereerd worden. Deze generatie gebeurd op basis van templates die vooraf moeten gedefinieerd worden. De documenten die kunnen gegenereerd worden voor een bepaald project zijn afhankelijk van de technologie van het project. Documenten kunnen zowel gewone tekstdocumenten zijn als configuratiebestanden. Voorbeelden van documenten zijn: • • • • • •
Follow-up (Follow-up)
AIM: Application Infrastructure Modification (tekstbestand, voor alle technologieën) RFI: Request For Intervention (tekstbestand, voor alle technologieën) TFS Request: Team Foundation Server Request (tekstbestand, voor .NET technologie) Web.config (configuratiebestand, voor .NET technologie) Properties files (configuratiebestand, voor Java technologie) New Environment Request (configuratiebestand, voor PHP technologie)
Een vraag kan een Follow-up hebben. Een follow-up is een aanduiding voor een bepaalde vraag aan een bepaalde persoon met een bepaalde functie. Dit kan gebruikt worden als een externe actie moet gebeuren vooraleer de vraag kan beantwoord worden. Een follow-up heeft een status (requested, in progress of done), een datum en een functie (responder-type). Bijvoorbeeld als het antwoord op de vraag “Gebruikt deze applicatie een Oracle database?” ja is, dan zal de sub vraag “Wat is de connectiestring?” een follow-up hebben door een Oracle Ontwikkelaar, want er moet eerst een database gecreëerd worden voor de betreffende applicatie in de juiste omgeving (=externe actie).
Functie (Responder-type)
Een responder-type is de functie waarover een persoon moet beschikken om iets te doen. Dit kan bijvoorbeeld zijn: een follow-up beheren of een vraag beantwoorden.
Eens de functionaliteiten waren vastgelegd ben ik gestart met het opstellen met use-cases. Maar omdat deze zo simpel waren en omdat ik er eigenlijk niet al te veel tijd aan besteedt heb, heb ik besloten om deze niet op te nemen in dit eindwerk. Hetgeen waar ik wel veel tijd aan besteed heb, is het ontwerpen van gebruikersinterfaces voor de applicatie met behulp van Microsoft Visio For Enterprise Architects 2003. Hiervoor ben ik ook per gebruikersrol te werk gegaan. Opmerking: alle namen in de formulieren op de schermen met de aanduiding “*” zijn verplichte velden. Zonder het veld in te vullen dat bij deze naam hoort, is het niet mogelijk om verder te gaan in de applicatie.
2.3.6.1
Full Control Administrator
2.3.6.1.1 Environment Management Het environment management gedeelte van de BRail Configuration Application bestaat uit overzicht van alle omgevingen met de mogelijkheid om ze te bewerken, (logisch) te verwijderen en een nieuwe omgeving toe te voegen.
Door op “New Environment” of “Edit” te klikken wordt het volgende scherm getoond, eventueel ingevuld met de naam van de bestaande omgeving (indien op “Edit” geklikt werd).
Door op “Delete” te klikken in het overzicht, wordt het volgende scherm getoond. Indien in dit scherm dan gekozen wordt voor “Delete”, dan wordt deze enkel logisch verwijderd.
2.3.6.1.2 Technology Management Het technology management gedeelte van de BRail Configuration Application bestaat uit een overzicht van alle technologieën met de mogelijkheid om ze te bewerken, (logisch) te verwijderen en een nieuwe technologie toe te voegen.
Door op “Edit”, “New Technology” en “Delete” te klikken worden gelijkaardige “Technology Detail” en “Technology Delete” schermen getoond zoals in het environment management gedeelte van de BRail Configuration Application.
2.3.6.1.3 Category Management Het category management gedeelte van de BRail Configuration Application bestaat uit een overzicht van alle categorieën met de mogelijkheid om hun volgorde aan te passen, om ze te bewerken, om ze (logisch) te verwijderen en om een nieuwe categorie toe te voegen.
Door op “Edit”, “New Category” en “Delete” te klikken, worden gelijkaardige “Category Detail” en “Category Delete” schermen getoond zoals in het environment management en het technology management gedeelte van de BRail Configuration Application. Met behulp van de “Up” en “Down” knoppen kan de volgorde van de categorieën bepaald worden.
2.3.6.1.4 Responder-type Management Het responder-type management gedeelte van de BRail Configuration Application bestaat uit een alfabetisch overzicht van alle responder-types per technologie met de mogelijkheid om ze te bewerken, te markeren als verwijderd (=logische delete) en om een nieuw responder-type toe te voegen.
Door het klikken op de “Edit” knoppen of op de “New Type” knop, wordt volgend scherm getoond. Dit scherm is eventueel reeds ingevuld met gegevens van een bestaand responder-type (wanneer voor bewerken werd gekozen).
Door het klikken op één van de “Delete” knoppen in het responder-type management scherm, krijgt u een gelijkaardig scherm zoals bij het deleten van een environment, categorie of technologie.
2.3.6.1.5 Application Management Het Application management gedeelte van de BRail Configuration Application is iets meer uitgebreid dan de tot nu toe besproken schermen. Dit scherm bestaat, zoals de meeste andere schermen, uit een alfabetisch overzicht van alle applicaties (applicatiecode en naam worden getoond) met een mogelijkheid om ze te bewerken, te markeren als verwijderd (=logische delete) en om een nieuwe applicatie toe te voegen.
Daarnaast komt er nog een extra knop “show views” bij en wordt er per applicatie een “external actions” flag en een “wizard status” flag getoond. Deze kleuren van deze flags hebben volgende betekenis: External Actions Flag Groen Alle follow-ups voor deze applicatie zijn gemarkeerd als “done”. Oranje Alle follow-ups voor deze applicatie zijn op zijn minst gemarkeerd als “In Progress”. Rood Eén of meer follow-ups voor deze applicatie zijn gemarkeerd als “requested”. Wizard Status Flag Groen Alle follow-ups voor deze applicatie zijn gemarkeerd als “done”. Oranje Alle follow-ups voor deze applicatie zijn op zijn minst gemarkeerd als “In Progress”. Rood Eén of meer follow-ups voor deze applicatie zijn gemarkeerd als “requested”. Bij het klikken op een knop “show views” van een applicatie in het applicatie management scherm wordt het volgende scherm getoond:
Voordat u iets concreets kan doen vanaf dit scherm, moet u eerst een omgeving kiezen. Daarna kunt u één van de verschillende views uit de dropdown lijst selecteren. Deze onderdelen worden verder in dit verslag uitgebreid besproken: • • • •
Report Follow-ups Output Wizard
Toont een rapport over de applicatie (en de beantwoorde vragen ervoor). Toont een lijst van alle vragen met een follow-up voor de applicatie. Toont een scherm dat toelaat om output documenten te genereren. Toont de wizard met vragen voor deze applicatie.
Bij het klikken op een “Delete” knop van een applicatie in het applicatie management scherm, dan wordt het volgende scherm getoond.
Zoals u ziet is dit scherm gelijkaardig aan de meeste “delete” schermen in andere gedeeltes van de BRail Configuration Application. Het verwijderen van een applicatie is hier uiteraard ook enkel een logische delete. Het “Application Detail” scherm verschilt wel met andere detailschermen uit de applicatie. Bij het klikken op een “Edit” knop van een applicatie of op de “New Application” knop in het applicatie management scherm wordt namelijk het volgende scherm getoond. Dit scherm is eventueel reeds ingevuld met gegevens van een bestaande applicatie, wanneer voor bewerken werd gekozen.
Op dit “Application Detail” scherm moeten een aantal zaken ingevuld worden: de applicatie code die als herkenningspunt gebruikt wordt binnen H-ICT, de applicatie naam, een beschrijving en de gebruikte technologieën. Verder moet ook het project team ingevuld worden met mensen uit de active directory. Er moet minstens één persoon als groepslid toegevoegd zijn om de applicatie te kunnen opslaan. Een persoon toevoegen doet u via de “Add Team Member” knop, waardoor volgend scherm getoond wordt.
De bedoeling van dit scherm is dus mensen zoeken in de active directory, er een functie (dit is dus een zogenaamd responder-type) aan koppelen en als teammember toevoegen aan de applicatie. Eén persoon kan meerdere malen aan één applicatie gekoppeld worden, maar dan uiteraard wel met verschillende functies (responder-types). 2.3.6.1.6 Management of deleted items Dit gedeelte van de BRail Configuration Application maakt het mogelijk om alle records in de database die als verwijderd gemarkeerd zijn (de logische verwijderde items dus), ook echt te verwijderen of terug te herstellen. Het scherm ziet er als volgt uit. U kiest in een dropdown lijst bovenaan eerst welke soort items, die als verwijderd gemarkeerd zijn, u wilt tonen.
Eens dit gebeurd is, krijgt u een overzicht van alle verwijderde items van de soort die geselecteerd is in de dropdown lijst bovenaan. Hieronder ziet u een voorbeeld van alle categorieën die als verwijderd gemarkeerd zijn. Per categorie krijgt u dus de opties om een echte delete te doen of met de categorie te herstellen.
Na het klikken op “Restore” in het vorige scherm, wordt volgend scherm getoond. Indien in dit scherm “Restore” wordt gekozen dan wordt de verwijdering van de categorie ongedaan gemaakt. Dit gebeurt eigenlijk gewoon door de flag die aangeeft of de record logisch verwijderd is, terug op false te zetten.
Maar zoals gezegd wordt hier niet enkel een herstelfunctie voorzien, er is ook een mogelijkheid om een record echt te verwijderen. Dit doet u met de “delete” knop van een item (bijvoorbeeld een categorie) in het overzicht van de verwijderde items. Als u bijvoorbeeld op de “delete” knop van een categorie klikt, dan wordt een scherm zoals dit getoond.
Dit scherm toont een overzicht van alle referenties die deze categorie heeft. Hier krijgt de gebruiker nu twee opties (via de dropdown lijst onderaan). De gebruiker kan kiezen om de record van de categorie gewoon te verwijderen en daarbij ook alle referenties mee te verwijderen (en de referenties van deze referenties). Dit is een zeer risicovolle actie, omdat hierbij zeer veel data kan verwijderd worden. Een andere optie is: de categorie te verwijderen, maar alle referenties ernaar vervangen door een andere categorie. Dit wordt geïllustreerd in onderstaand scherm:
Merk op dat eens op “Execute” geklikt wordt, de actie onomkeerbaar is. Er dient dus goed nagedacht te worden vooraleer dergelijke acties ondernomen worden.
2.3.6.1.7 Synchronization with the active directory Het laatste gedeelte dat enkel toegankelijk is voor de Full Control Administrator is de synchronisatie tussen de interne personen tabel van de BRail Configuration Application en de Active Directory. Dit gedeelte ziet er als volgt uit:
Het zoekgedeelte zoekt hier in de interne personen tabel van de applicatie. Daarna krijgt u de mogelijkheid om zoekresultaten te selecteren en ze te synchroniseren met de Active Directory. De zoekresultaten worden in pagina’s getoond, omdat de interne persoonstabel na verloop van tijd erg groot kan worden.
2.3.6.2.1 Question Management Dit gedeelte van de BRail Configuration Application is zoals gezegd toegankelijk voor zowel de Full Control Administrators als de Competence Center Administrators. Het scherm ziet er als volgt uit, wanneer het door een full control administrator bekeken wordt.
Questions Management Technology .NET
Category: Architecture
Which version of the .NET Framework will be used? Which parts of the .NET Framework 3.0 will be used? Which parts of the .NET Framework 3.5 will be used?
Edit
Delete
Edit
Delete
Edit
Delete
New Question
Wanneer dit door een Competence Center Administrator bekeken wordt, dan zal zijn/haar technologie in de dropdown lijst geselecteerd zijn en zal deze dropdown lijst uitgeschakeld (disabled) zijn. In de treeview worden enkel de vragen getoond van de geselecteerde technologie en de geselecteerde categorie. De relaties tussen de vragen (vraag/sub vraag) moeten kunnen gewijzigd door de vragen te verslepen in de treeview. Deze treeview moet dus over een zekere drag-and-drop functionaliteit beschikken. Opmerking: het is hier enkel mogelijk om de relaties tussen de vragen te bewerken, u moet dan wel nog steeds de parent vraag aanpassen om aan te geven wanneer de sub vraag moet worden getoond in de wizard (zie verder in deze functionele analyse). Door het klikken op de “Delete” knop van een vraag in de treeview in het question management gedeelte van de applicatie wordt volgend scherm weergeven.
Als u in dit scherm op delete klikt, dan worden de betreffende vraag en de sub vragen die erbij horen als verwijderd gemarkeerd (=logische delete).
Door het klikken op de “New Question” knop in het question management gedeelte wordt volgend scherm getoond. Ook het bewerken van een vraag via een “Edit” knop van een vraag zal resulteren in dit scherm, maar dan uiteraard wel ingevuld met de reeds bestaande informatie over die vraag.
Zoals u ziet, moet er per vraag heel wat informatie ingevuld worden. Eerst en vooral moet de tekst van de vraag ingevuld worden, dit is de eigenlijke vraag. Ten tweede moet een type (fieldtype) gekozen worden. Op dit moment zijn er zes types vragen, maar dit kan later gemakkelijk uitgebreid worden: 1. Single Line Open Value 2. 3.
4.
5.
6.
Het antwoord op de vraag moet ingevuld worden in een gewone tekstbox. Multi Line Open Value Het antwoord op de vraag moet ingevuld worden in een tekstbox waarin scrollen mogelijk is. Dropdown Lijst Het antwoord op de vraag moet geselecteerd worden uit een dropdown lijst. Hier kan dus maar één antwoord voor de vraag geselecteerd worden. Radiobutton Lijst Het antwoord op de vraag moet geselecteerd worden in een RadioButton List. Hier kan dus ook maar één antwoord voor de vraag gekozen worden. Checkbox Lijst Het antwoord op de vraag moet gekozen in een checkbox lijst. Hier kunnen dus meer antwoorden per vraag gekozen worden. Deze meerdere antwoorden worden dan met komma’s gescheiden van elkaar en opgeslagen als één antwoord Herhalende Subvragen Het antwoord op de vraag moet een nummer zijn dat aangeeft (Repetitive Sub Question) hoeveel maal een sub vraag voor deze vraag moet gesteld worden. Deze vraag moet dus een sub vraag hebben. Dit type vraag is handig voor delen van configuratiebestanden die meerdere malen gevraagd worden, bijvoorbeeld een error verwijzing in een web.config file.
Verder moet ook aangegeven worden of de vraag verplicht (required) is of niet. Als een vraag niet verplicht is, dan kan ze overgeslagen worden in de wizard. Standaard is een vraag altijd verplicht. Ook de tag kan worden ingevuld, maar dit is niet verplicht. Een tag maakt het makkelijker voor externe applicaties om (het antwoord van) de vraag op te halen via een web service interface. Wat wel verplicht in te geven is, is het “More Info” veld van de vraag. Dit zal namelijk de tooltip informatie voor de vraag worden in de wizard. De categorie en de parent vraag zijn niet te kiezen. Deze worden namelijk reeds bepaald in het vorige scherm: de treeview van de vragen. Verder moeten ook items voor de vraag gespecificeerd worden. Items zijn eigenlijk potentiële antwoorden op de vraag. Het aantal items is afhankelijk van het veld type van de vraag. Als het om een vraag met veldtype radio button lijst gaat, dan moet de vraag minimum 2 items bevatten. Bij een vraag met als veldtype checkbox lijst is het minimum één. En bij de andere veld types (open value velden en herhalende sub vragen) altijd exact één item is. Dit item wordt automatisch gegenereerd bij het kiezen van het veld type en stelt altijd het standaardantwoord van de vraag voor.
Question Detail Question Text*
Which version of .NET will be used?
Field Type*
CheckBox
Tag Parent
Required* Category* Architecture
None
More Info* In your application you can detect which version of .NET will be used with the following code: Response.Write(".NET framework version: " & System.Environment.Version); (For Websites) Console.Write(".NET framework version: " & System.Environment.Version); (For Windows Applications)
De “New Item” knop wordt dus enkel getoond als het veld type een checkbox lijst of een radiobutton lijst is. Met deze knop is het mogelijk om een item toe te voegen. Dit gebeurt via volgend scherm:
Per item moet u dus een tekst voor het item ingeven, een actie kiezen en aangeven of er een follow-up van een andere vraag veranderd wordt door dit item te kiezen als antwoord voor de vraag. Er zijn twee acties mogelijk: naar de volgende vraag gaan (dus gewoon verdergaan met de wizard) of naar een subvraag gaan (die dan geselecteerd moet worden). Voor de laatste actie moeten er uiteraard wel sub vragen zijn. Indien een vraag een sub vraag heeft en er is geen enkel item van die vraag dat naar de sub vraag verwijst, dan zal die sub vraag nooit getoond worden in de wizard. Het volstaat dus niet om enkel de relaties tussen vraag en sub vraag te leggen met behulp van de treeview in het question management gedeelte.
Wanneer een item een follow-up van een andere vraag verandert, dan moet de checkbox bij “Changes a follow-up” aangevinkt worden. Hierna verschijnen twee nieuwe dropdown lijsten. De eerste bevat alle vragen die een follow-up hebben, hieruit moet de vraag waarvan de follow-up veranderd gekozen worden. In de twee dropdown lijst moet de nieuwe status van de follow-up gekozen worden. Indien er geen vragen met een follow-up zijn, dan zal de checkbox bij “Changes a follow-up” ook niet kunnen geselecteerd worden.
Eens de items voor de vraag gecreëerd zijn, moeten we aangeven over welke functie (responder-type) de gebruiker moet beschikken om te kunnen antwoorden op de vraag. Er wordt een lijst getoond met alle responder-types van alle technologieën die bij de applicatie horen en ook alle algemene responder-types (zoals projectleider, projectmanager…) die technologie onafhankelijk zijn. Alle responder-types die geselecteerd worden in deze lijst, zullen op deze vraag kunnen antwoorden. Dit houdt in dat meerdere verschillende functies op één dezelfde vraag kunnen antwoorden. In theorie lijkt dit misschien niet echt ideaal, maar in de praktijk worden veel verantwoordelijkheden doorgegeven waardoor dit wel handig is.
Question Detail Question Text*
Who is the functional analyst?
Field Type*
Open Value Field
Tag
FunctionalAnalyst
Parent
None
Required* Category* Team Members
More Info* The functional analyst is the person who creates the FA document.
Items
Responders
Follow-Ups
Project Managers Project Leaders Functional Analysts NDCC Members for technical project follow-up .NET Developers Other Developers Technical Coordinators WCC Testers Others
Als laatste kunnen we ook nog een follow-up specificeren voor een vraag. Er wordt een lijst getoond met alle responder-types voor de technologie van deze vraag en de algemene responder-types. Hier kan dan één responder-type gekozen worden die deze vraag moet opvolgen. Het kiezen van een follow-up voor een vraag is niet verplicht en er kan maar één follow-up per vraag gekozen worden.
Question Detail Question Text*
Which version of .NET will be used?
Field Type*
CheckBox
Tag
DotNetVersion
Parent
None
Required* Category* Architecture
More Info* In your application you can detect which version of .NET will be used with the following code: Response.Write(".NET framework version: " & System.Environment.Version); (For Websites) Console.Write(".NET framework version: " & System.Environment.Version); (For Windows Applications)
2.3.6.2.2 Output Document Management Dit gedeelte van de BRail Configuration Application is toegankelijk voor zowel de Full Control Administrators en de Competence Center Administrators (gelimiteerd tot de document templates van hun eigen technologie). Het heeft als doel de templates voor de output documenten te beheren en de antwoorden op de vragen te mappen naar inhoud van deze output documenten. Als u ingelogd bent als Competence Center Administrator, dan ziet het scherm er zo uit:
Wanneer u als Full Control Administrator ingelogd bent, dan bent u niet gelimiteerd tot een bepaalde technologie en zal u dus ook een technologie kunnen selecteren in de dropdown lijst bovenaan.
Om een document template te verwijderen, klikt u op de bijhorende “Delete” knop. Deze knop zorgt er voor dat er een scherm verschijnt waarmee verwijderen mogelijk is. Dit scherm is gelijkaardig aan de “Delete” schermen van technologie, environment, categorie en responder-type. Bij het bewerken van een document template (via de bijhorende “Edit” knop) en bij het creëren van een nieuw document template(via de “New Document” knop) wordt volgend scherm getoond. Dit scherm is uiteraard leeg bij het creëren van een nieuw document en reeds ingevuld bij het bewerken van een bestaand document.
In dit “Output Document Detail” scherm, moet u een naam voor het document ingeven en de inhoud van het document opbouwen via tekstblokken. Een tekstblok is een deel van een tekst, dit kan een alinea zijn, maar kan ook één regel tekst zijn. Het opslaan van het document templates gebeurt met de “Save” Button. Het is de bedoeling om een document op te bouwen uit tekstblokken. Net zoals bij vragen en subvragen, kunt u ook een document als een treeview van tekstblokken opbouwen. U kunt dus een tekstblok hebben die in zijn inhoud een verwijzing naar een andere tekstblok heeft. Voor het verwijderen van een tekstblok uit de applicatie, moet u eerst een tekstblok selecteren in de lijst met tekstblokken en vervolgens op de “Delete Block” knop klikken. Hierdoor verschijnt een “Delete” scherm dat gelijkaardig is aan alle andere “Delete” schermen uit de applicatie (bijvoorbeeld: technologie, environment…). Merk op dat bij het (logisch) verwijderen van een tekstblok, ook alle onderliggende tekstblokken (logisch) verwijderd worden.
Voor het bewerken van een tekstblok, moet de betreffende tekstblok geselecteerd worden in het overzicht en moet er op de “Edit Block” knop geklikt worden. Hierdoor verschijnt het volgende “Text Block Detail” scherm. Dit scherm wordt ook opgeroepen bij het klikken op de “New Block” knop. Via deze “New Block” knop wordt trouwens altijd een tekstblok op het root niveau toegevoegd.
Dit scherm is opgedeeld in twee verschillende delen. In het eerste gedeelte (Visibility) kan worden bepaald wanneer dit tekstblok moet getoond worden in het document. Wanneer er een antwoord is op de geselecteerde vragen, dan mag het tekstblok worden weergegeven in het document. Tekstblokken waarvan de parent niet de root is, erven deze weergave instellingen automatisch over van hun parent, maar kunnen uiteraard nog uitgebreid worden. In het tweede gedeelte moet de inhoud van de tekstblok ingegeven worden. Hierin kan gewone tekst worden ingegeven, maar er kunnen ook verwijzingen naar andere delen van de BRail Configuration Application ingevoegd worden. Dit kan met behulp van de knoppen aan de linkerkant van het “Contents” gedeelte. De “Insert Field” knop biedt de mogelijkheid om een veld in te geven dat verwijst naar verschillende zaken. In de inhoud van de tekstblok worden deze velden aangegeven met speciale tekens: • •
{{{ID VAN DE VRAAG}}} ///KOLOMNAAM///
•
(((ID VAN DE VRAAG)))
verwijst naar het antwoord van een bepaalde vraag. verwijst naar een fixed field van de applicatie (bijvoorbeeld de applicatiecode, de naam van de applicatie…) verwijst naar het antwoord van een bepaalde vraag van het type “Repetitive Sub Question”.
De “Insert Block” knop biedt de mogelijkheid om een veld in te geven dat verwijst naar een andere tekstblok. Ook dit wordt in de inhoud van het tekstblok aangegeven met een speciaal teken: •
Door het klikken op de “Insert Field” knop wordt volgend scherm weergegeven, waarmee het mogelijk is om de verwijzingen in te voegen in de inhoud van een tekstblok.
Insert Field This Field represents the answer of the question: Which version of the .NET Framework will be used?
This Field represents the answers of the sub questions of the question: How many configSections are there?
This Field represents fixed data of the application: Application code Save
This drop down list only contains the questions with field type “repetitive sub question”.
Cancel
In dit scherm moet u dus kiezen welk soort verwijzing u wilt invoegen. De eerste optie is het antwoord van een vraag. Deze eerste dropdown lijst bevat dus een lijst van alle vragen van de technologie van het document die niet het veldtype “Repetitive Sub Question” hebben. De tweede optie is het antwoord van een vraag van het veldtype “Repetitive Sub Question”. Deze twee dropdown lijst bevat dus een lijst van alle vragen van de technologie van het document van dit veldtype. De derde optie is fixed data van de applicatie waarvoor het document zal gegenereerd worden. Deze derde dropdown lijst bevat dus een overzicht van alle velden van deze applicatie. In praktijk zullen dit alle kolomnamen van de tabel applicatie in de databank zijn. De verwijzing wordt echt ingevoegd door op de “Save” button te klikken. Door in het “TextBlock Detail” scherm te klikken op de “Insert Block” knop wordt volgend scherm weergegeven, waarmee het mogelijk is om een verwijzing naar een andere tekstblok in te voegen in de inhoud van een tekstblok.
Insert Block Select the text block you want to insert: Save
Cancel
De dropdown lijst op dit scherm bevat een lijst van alle andere bestaande tekstblokken voor dit document en een optie “New TextBlock”. Wanneer voor een bestaande tekstblok wordt gekozen, dan wordt de geselecteerde tekstblok een child van de tekstblok dat we aan het bewerken zijn. Wanneer we voor een nieuw tekstblok kiezen, dan verschijnt er onder de dropdown lijst een tekstveld waarin we de inhoud van de nieuwe tekstblok kunnen ingeven.
2.3.6.3.1 Start Window Wanneer er ingelogd wordt als een Full Control Administrator, dan is de startpagina het “Application Management” scherm dat reeds besproken is (zie pagina 23). Maar wanneer een User of een Competence Center Administrator inlogt, dan zal de startpagina een compactere versie van het “Application Management” scherm zijn. Dit scherm ziet er als volgt uit:
Net zoals in de versie van de Full Control Administrators, verwijst het “External Actions” veld naar de status van de follow-ups en verwijst het “Question Status” veld naar de vragen die moeten beantwoord worden. Per applicatie zijn een viertal acties mogelijk: 1. Launch Wizard Start de wizard, biedt de mogelijkheid om de vragen te beantwoorden. 2. View Report Toont een rapport over de geselecteerde applicatie. 3. View Follow-ups Toont een overzicht van de follow-ups voor de geselecteerde applicatie. 4. Generate Output Documents Biedt de mogelijkheid om documenten te genereren voor de geselecteerde applicatie.
2.3.6.3.2 The Wizard Door te kiezen voor “Launch Wizard” in de compacte versie van het Application management of via de “Show Views” (zie pagina 23) van de uitgebreide versie, wordt de wizard gestart. Deze wizard bevat alle vragen voor een bepaalde applicatie waartoe de ingelogde gebruiker toegang tot heeft, en biedt de mogelijkheid om deze vragen te beantwoorden. Het start scherm van de wizard ziet er als volgt uit:
Bij het klikken op de “Next” knop, wordt de wizard gestart. Deze wizard bestaat eigenlijk uit twee soorten vragen: statische en dynamische. Eerst worden de statische vragen gesteld. Hiervan zijn er twee. De eerste statische vraag is: “What is the environment?”. Hier moet gespecificeerd worden voor welke omgeving we de antwoorden (wat dus de configuratie instellingen zijn) ingeven. Er kan ervoor gekozen worden om alle antwoorden reeds in te laden door ze te kopiëren van een andere omgeving.
De tweede statische vraag is “Who are the team members of this application/project?”. Dit is dus het bepalen van het projectteam van de applicatie. Het is enkel mogelijk om technologie afhankelijke leden toe te voegen, tenzij u de wizard bekijkt als een Full Control Administrator. Dit houdt in dat een .NET ontwikkelaar (=technologie afhankelijk) bijvoorbeeld geen nieuwe projectleider (=technologie onafhankelijk) kan toevoegen (wat ook logisch is).
Om een team lid te verwijderen moet u er eerst één selecteren en daarna op de “Remove” knop klikken. U kunt uiteraard niet uzelf verwijderen. Een team lid toevoegen doet u met behulp van de “Add” knop. Hierdoor wordt een gelijkaardig scherm getoond als het scherm om team leden toe te voegen aan de applicatie bij de creatie van de applicatie. Dit scherm ziet er als volgt uit:
Nu de twee statische vragen achter de rug zijn, zijn we aan de dynamische vragen toegekomen. Het is de bedoeling dat u de vraag beantwoord en gewoon verder gaat met de wizard door op “Next” te klikken. Bij het klikken op “Next” wordt ofwel naar de volgende vraag gegaan of wordt er doorverwezen naar een sub vraag van de zojuist beantwoorde vraag. Deze doorverwijzing is afhankelijk van het antwoord dat zojuist gekozen werd. Wanneer de laatste vraag van de wizard bereikt wordt, dan wordt de “Next” knop vervangen door een “Finish” knop. Bij het klikken op deze knop wordt de wizard afgesloten en teruggekeerd naar het startscherm (het overzicht van applicaties). Een voorbeeld: De vraag “Which version of .NET will be used?” verwijst naar een sub vraag wanneer voor het item .NET 3.0 wordt gekozen. Indien voor iets anders wordt gekozen, dan wordt er gewoon naar de volgende vraag gegaan.
Er werd dus gekozen voor .NET 3.0, waardoor de volgende vraag nu een sub vraag is, in plaats van de volgende vraag:
2.3.6.3.3 Reporting Door te kiezen voor “View Report” in de compacte versie van het Application management of via de “Show Views” (zie pagina 23) van de uitgebreide versie, wordt volgend scherm getoond:
Dit “Reporting: Application View” scherm toont informatie over de applicatie zelf, over de documenten en over de vragen die bij deze applicatie horen. In de lijst met documenten zijn degene die al gegenereerd kunnen worden geselecteerd. Dit houdt in dat alle vragen die moeten beantwoord zijn om het document te kunnen genereren reeds beantwoord zijn. Per vraag wordt het status en het type weergegeven. Er zijn drie verschillende statussen: 1. Answered 2. Not Answered 3. No Need For Answer
De vraag is beantwoord De vraag is niet beantwoord De vraag is niet beantwoord, maar er is ook geen antwoord nodig.
Door op een vraag te klikken wordt een ander scherm weergegeven. Dit scherm toont een rapport over die bepaalde vraag voor die bepaalde applicatie:
Reporting: Question View Question: Which version of .NET will be used? General info
Status info
Field Type: CheckBoxList
Status: Answered
Category: Architecture
Answer: .NET 3.0
Required: Yes
Responder: EXT653 – Gert Servranckx
Parent: /
Time: 14-02-2008 9:38
Items
.NET 1.x .NET 2.0 .NET 3.0 .NET 3.5
Action: Go to next question Action: Go to next question Action: Go to sub question 2 Action: Go to sub question 1
Responders
Project Leader Username
EXT653
First Name
Last Name
Domain
Gert
Servranckx
MSNET
Project Manager Username
First Name
Last Name
Domain
RLD6500
Dominique
Quevy
MSNET
Functional Analyst Username
First Name
Last Name
Domain
EXA165
Angelo
Mancuso
MSNET
Sub Questions Nr
Question
1
Which parts of the .NET 3.5 Framework will be used?
No need for answer
Status
2
Which parts of the .NET 3.0 Framework will be used?
Answered
OK
Door op een sub vraag te klikken op dit scherm wordt hetzelfde “Reporting: Question View” opnieuw getoond, maar dan met de gegevens van de geselecteerde vraag. Merk op dat op deze rapporten geen informatie kan gewijzigd worden.
2.3.6.3.4 Follow-ups Door te kiezen voor “View Follow-ups” in de compacte versie van het Application management of via de “Show Views” (zie pagina 23) van de uitgebreide versie, wordt volgend scherm getoond:
In dit scherm kunt u een lijst bekijken van alle vragen die een follow-up hebben met hun status. Deze status kan volgende waarden hebben: Groen (follow-up done), Oranje (follow-up being processed) en Rood (follow-up requested). Door op een “Details” knop te klikken, wordt volgend scherm getoond voor de gekozen vraag:
In dit scherm kan dus de follow-up aangepast worden, tenminste als u over de correcte rechten beschikt. Als u bijvoorbeeld een Oracle ontwikkelaar bent, dan zal u de follow-up voor de vraag “What is the connectionstring for the database?” kunnen bewerken en zal het scherm om de followup te bewerken getoond worden zoals hierboven.
Indien u geen Oracle ontwikkelaar bent en indien deze follow-up dus niet voor u bedoelt is, dan zal u volgend scherm te zien krijgen:
2.3.6.3.5 Generating Output Documents Door te kiezen voor “Generate Output Documents” in de compacte versie van het Application management of via de “Show Views” (zie pagina 23) van de uitgebreide versie, wordt volgend scherm getoond:
Dit scherm maakt het mogelijk om output te genereren voor de geselecteerde applicatie. De dropdown lijst op dit scherm bevat dan ook alle output documenten die reeds gegenereerd kunnen worden. Na een document te hebben geselecteerd in deze lijst en op de “Generate Document” knop te hebben geklikt, wordt het document gegenereerd en onmiddellijk geopend.
Na de interfaces te hebben ontworpen, ben ik gestart met het ontwerpen van een conceptueel datamodel met behulp van ORM. Ik heb dit model gedefinieerd om dan later op basis ervan het databank schema te kunnen genereren. Een conceptueel datamodel definieert welke gegevens in een informatiesysteem vastgelegd kunnen worden, hoe deze gegevens gestructureerd zijn en wat de verbanden zijn tussen die gegevens. Hieronder vindt u mijn ORM schema’s. Om het geheel leesbaar te houden, heb ik ervoor gekozen om meerdere schema’s te gebruiken in plaats van één groot schema. 2.3.7.1
Na het opstellen van de functionele analyse was het tijd om aan het tweede onderdeel van mijn stageopdracht te beginnen, namelijk de technische analyse. Een technische analyse bevat een uitvoerige beschrijving van de technische omgeving en van de technische implementatie. Voor het opstellen van deze technische analyse (afkort TA) moest ik een template gebruiken die voor alle technische analyses in het NDCC gebruikt wordt. Het interne document van de technische analyse die ik uitgevoerd vindt u in de bijlagen.
2.4.1
Tijdslijn Voor het opstellen van de technische analyse was er geen tijdslijn voorzien, zoals dit het geval was bij de functionele analyse (zie pagina 14). Er werd dus niet aangegeven hoe ik precies te werk moest gaan. Er werd me enkel gezegd dat een technische analyse gemiddeld vijf werkdagen in beslag neemt. Hoe ik te werk ben gegaan, ziet u in de figuur hiernaast. Indien u deze figuur naast het intern technische analysedocument legt (zie bijlagen), zult u zien dat ik de structuur van de template gebruikt heb. Het bepalen van het ERD en het beschrijven van de “special code cases” namen het meeste tijd in beslag. Wat deze “special code cases” juist zijn, leest u verder in dit document.
Kritikaliteit Aantal Gebruikers Aantal Gelijktijdige Gebruiker Integratie met andere producten? Toegang voor andere applicaties
• IIS • ASP.NET • .NET 3.5 / C# • jQuery / Javascript • Oracle 10g 99,75% ± 200 ± 25 - 50 Ja, met BRail Application Portal Ja, via een web service interface
De tabel hierboven toont een technisch overzicht van de BRail Configuration Application. Dit overzicht bevat uiteraard een lijst van alle gebruikte technologieën. Hieruit kan afgeleid worden dat het om een webapplicatie gaat. Het tweede punt in bovenstaande tabel is de kritikaliteit. Deze kritikaliteit is de normale kritikaliteit voor applicaties van het NDCC. Het betekent dat er naar gestreefd wordt om de applicatie 99,75% van de tijd beschikbaar te stellen voor de gebruikers. Dit lijkt zeer veel, maar uiteindelijk betekent dit dat de BRail Configuration Application ongeveer 21 uur per jaar offline is. Er wordt verwacht dat de applicatie door ongeveer 200 personen zal gebruikt worden en dat er maximaal tussen de 25 en 50 gelijktijdige gebruikers zullen zijn. De applicatie zal geïntegreerd worden met het BRail Application Portal. Dit is een portaal website waarin alle applicaties van H-ICT te vinden zijn. Het grote voordeel hiervan is dat er maar één maal ingelogd moet worden om toegang te hebben tot alle applicaties (waar men rechten toe heeft). Er zal ook een web service interface voorzien worden, zodat andere applicaties toegang hebben tot bepaalde functionaliteiten van de BRail Configuration Application.
2.4.3
Technische omgeving
De BRail Configuratie zal gehost worden op een webfarm bestaande uit twee IIS web servers. De applicatie maakt gebruik van een Oracle 10g databank voor gegevensopslag, die uiteraard geïnstalleerd is op een aparte database server. Web Farm Web Service Client : other application
IIS Server
IIS Server
De applicatie is op twee verschillende manieren toegankelijk: door een gebruiker via de webapplicatie, wat de eigenlijke applicatie is en door andere applicaties via een web service interface.
De BRail Configuration Application werd geïmplementeerd als een Three-tier architectuur (ook bekend als n-tier of multitier architectuur). Multitier is een client/server architectuur waarin de gebruikersinterface, de functionele logica (business logica) en de data toegang ontwikkeld en onderhoud worden als onafhankelijke modules. In de figuur hieronder wordt de werking van de n-tier architectuur in de BRail Configuration Application geïllustreerd. We kunnen dus zeggen dat de applicatie bestaat uit 3 verschillende lagen:
Request
Response
CLIENT
1. Presentatie laag (GUI) Dit is de bovenste laag van de applicatie. Deze laag staat in voor het weergeven van informatie.
SERVER
2. Application laag (Business Logica) get questions
GUI
get questions 3 Questions
Get list of all viewable questions
BUSINESS LOGIC
Put all questions together in a list
Query
DATA ACCESS
Deze laag staat in voor de functionaliteit van de applicatie. Het controleert eigenlijk het verkeer tussen de data toegang laag en de presentatielaag.
GENERAL
Question 1 Question 2 Question 3
3. Data toegang laag (Data Access) Deze laag regelt de toegang tot de databank. Hier wordt alle informatie opgehaald en opgeslagen.
Database
4. General laag Hoewel er over 3-tier architectuur gesproken wordt, komt hier vaak nog een general laag bij kijken. Deze laag bevat de eigenlijke objecten, het model zeg maar. De objecten in deze laag zijn toegankelijk voor alle andere lagen in de applicatie (mits ze public zijn uiteraard).
Op het eerste zicht lijken het model-view-controller (MVC) concept en n-tier architectuur erg op elkaar. Ze worden namelijk beiden als architecturale patterns aanzien en hebben allebei als doel de verschillende onderdelen van een applicatie van elkaar te scheiden. Maar als we de topologie van beide patterns bekijken, dan is er een duidelijk verschil tussen beiden zichtbaar. De fundamentele regel in een three-tier architectuur is namelijk dat de GUI laag nooit rechtstreeks met de Data Access laag communiceert. Alle communicatie moet er via de business laag verlopen. We kunnen dus zeggen dat het concept van 3-tier architectuur lineair is. In een MVC architectuur daarentegen, gebeurd de communicatie in een driehoek: de view stuurt informatie naar de controller, de controller update het model en de view krijgt de nieuwe informatie direct van het model.
Presentatie laag
Model Business laag
Data laag
Controller
View
Ook in historisch opzicht zit er een duidelijk verschil tussen beide concepten. Het three-tier concept is eind jaren 1990’ afgeleid van gedistribueerde systemen (voornamelijk web applicaties), waar de verschillende lagen op fysisch verschillende toestellen draaiden. Het MVC concept is reeds een decennium eerder ontstaan, namelijk begin de jaren 1980’. Het is afgeleid en gebaseerd op observaties van applicaties die werkten op één client. MVC werd pas later toegepast op gedistribueerde systemen. Hoewel er duidelijk verschillen zijn hebben ze toch beiden hetzelfde doel, namelijk het verkrijgen van een gelaagde architectuur. Eigenlijk kunnen we zeggen dat MVC gewoon een manier is om tot een ntier architectuur te bekomen. Maar het is ook mogelijk om verschillende lagen af te dwingen en dus tot een n-tier architectuur te komen zonder MVC te gebruiken.
De BRail Configuration Application kunnen we eigenlijk opdelen in twee grote stukken: de eigenlijke applicatie (wat een ASP.NET webapplicatie is) en een web services interface (die sommige delen van de functionaliteit van de applicatie toegankelijk maakt voor andere ontwikkelaars).
In het eerste gedeelte van de applicatie is er sprake van drie verschillende types gebruiker. Elk van deze gebruikertypes heeft een eigen homepagina. Vanaf deze startpagina heeft men toegang tot verschillende acties die afhankelijk zijn van het gebruikertype. Via het tweede gedeelte van de applicatie, de web service interface, zijn enkel gelimiteerde acties mogelijk. Deze zijn: • • • •
Het lezen van rapporten Het lezen/updaten van follow-ups Het downloaden van een output document. Het lezen en aanpassen van antwoorden op vragen.
Hoe deze web service interface er uiteindelijk gaat uitzien werd bewust niet in de technische analyse beschreven, omdat dit gedeelte van de applicatie pas zal geïmplementeerd worden wanneer het eerste gedeelte afgewerkt is. Ook de analyse ervan zal pas later gebeuren.
Het onderstaande databaseschema werd gegenereerd op basis van de ORM schema’s uit de functionele analyse met de tool Microsoft Visio Modeler 3.1. Dit is een tool die niet langer door Microsoft ondersteund wordt, omdat het in 2001 vervangen werd door Microsoft Visio (momenteel is versie 2007 hiervan de laatste versie). Omdat ik het nog steeds makkelijker vind om ORM schema’s te ontwerpen met deze oude tool dan met de nieuwe Microsoft Visio software, heb ik dit ook op mijn stage gedaan. Mijn stagementor had hier absoluut geen bezwaar tegen en kon zelf ook de pluspunten (sneller relaties tussen entiteiten leggen, minder complex…) van deze tool inzien ten opzichte van Microsoft Visio. FieldType PK FieldType Id U1 FieldTypeName Application PK ApplicationID U1 ApplicationName U2 ApplicationCode ApplicationDeleted Description
Eens het logische databank schema gecontroleerd en goedgekeurd was door een Oracle Developer van het OTCC, moest ik de namen in mijn schema aanpassen aan de Naming Conventions van het OTTC. Het resultaat hiervan is onderstaand schema. De S875 prefix voor de tabelnamen staat voor: het schema (S) voor de applicatie met code 875 (A875). Alle applicaties die ontwikkeld worden in de verschillende Competence Centers van H-ICT krijgen namelijk een applicatiecode toegewezen. Die van de BRail Configuration Application is A875. S875_FIELD_TYPE S875_APPLICATION
S875_TECHNOLOGY
PK
APPL_ID
PK
TECH_ID
U1 U2
NAME CODE DELETESTATUS DESCRIPTION
U1
NAME DELETESTATUS
PK
QTYP_ID NAME
S875_ENVIRONMENT PK
ENVI_ID
U1
NAME DELETESTATUS
S875_APPL_FOLL PK,FK1 PK,FK2
S875_ANSWER
S875_APPL_TECH PK,FK1 PK,FK2
APPL_ID TECH_ID
PK
ANSW_ID
FK1,I1,U1 FK2,I2,U1 FK4,U1,I4 FK3,I3
APPL_ID ENVI_ID QUES_ID PERS_ID TEXT LASTCHANGE_DATE
QUES_1_ID QUES_2_ID FOLL_ID TEXT DELETESTATUS DEFAULTVALUE
57
2.4.8
Data Dictionary
Om het databankschema iets te verduidelijken heb ik besloten om een data dictionary in dit eindwerk toe te voegen. Een data dictionary bevat informatie over de databank zelf. Het is eigenlijk data over de data (metadata). Alle informatie voor het opstellen van dit data dictionary ben ik bekomen via de rapporteringfuncties van Microsoft Visio For Enterprise Architects. 2.4.8.1
De BRail Configuration Application maakt ook gebruik van een aantal reeds bestaande componenten. Deze kunnen opgedeeld worden in twee categorieën: de interne NDCC componenten en de externe componenten.
2.4.9.1
Interne NDCC componenten
In principe wordt er eigenlijk maar één interne NDCC component gebruikt: het BRail Application Framework. Maar omdat deze component een Framework is, bestaat deze uit vele verschillende sub componenten. Hieronder vindt u een overzicht van de sub componenten die gebruikt zullen worden door de BRail Configuration Application. • •
• •
BRail Application Framework Core BRail Client Extensions o Database Tools o Database Scraper BRail Server Extensions o IIS Settings SOA Based Sub Components o BRail Monitoring Application o BRail Security Application
Op het einde van mijn stageperiode bevond het project zich nog steeds in de ontwikkelingsfase. Hierdoor heb ik niet alle interne NDCC componenten zelf kunnen implementeren. De enige sub componenten uit bovenstaande lijst die ik zelf intensief gebruikt heb, zijn de BRail Client Extensions. Met de Database Tools heb ik de SQL code voor de tabellen en de stored procedures in de Oracle databank gecreëerd. Op basis van deze gegenereerde stored procedures en een aantal zelf geschreven stored procedures, heb ik dan met de Database Scraper de Data Access en General lagen van mijn project kunnen laten genereren. 2.4.9.2
Externe Componenten
Naast de interne NDCC componenten werden er nog een aantal externe componenten gebruikt, namelijk: • •
Een Oracle 10g database. Een tweetal onderdelen van de Microsoft Enterprise Bibliotheek 3.1 o Het Exception Handling Application Block o Het Logging Application Block
2.4.9.2.1 Oracle Oracle is een merk van Oracle Corporation. Het vlaggenschip dat onder deze merknaam wordt uitgebracht is de databasesoftware Oracle RDBMS. Oracle RDBMS was de eerste relationele database die gebruik maakt van SQL. Inmiddels is deze software uitgegroeid tot één van de meest gebruikte databases door bedrijven. Er is ondersteuning voor een groot aantal besturingssystemen. De laatste versie van deze databasesoftware is Oracle 11g. Omdat in een grote omgeving niet vlug overgeschakeld wordt op een nieuwere versie (als de oude degelijk werkt), wordt op mijn stage nog steeds gebruikt gemaakt van Oracle 10g. 2.4.9.2.2 Microsoft Enterprise Bibliotheek De Microsoft Enterprise Bibliotheek is een onderdeel van de patterns en practices van Microsoft. Het is een verzameling van een aantal applicatie blokken voor het oplossen van de meest voorkomende problemen. Een applicatie blok kan gezien worden als een herbruikbaar en uitbreidbaar stuk software dat helpt bij een veelvoorkomend ontwikkelingsscenario. Met andere woorden: deze applicatie blokken zijn een soort van leidraad in de vorm van broncode voor ontwikkelaars. Hoewel alle applicatie blokken zeker hun nut hebben, worden er toch maar twee applicatie blokken gebruikt in mijn applicatie: 1. Het Exception Handling Application Block Het Exception Handling Management Block maakt exception handling aanzienlijk eenvoudiger en maakt het mogelijk exceptions eenduidig in applicaties af te handelen. 2. Het Logging Application Block Logging is een eis van vrijwel alle enterprise-applicaties. Het Logging Block van EntLib biedt hiervoor een zeer mooie oplossing. De kracht ervan is dat het loggen losgekoppeld is van de logging- en instrumentatieproviders. Of u nu wilt loggen in een file, MSMQ, e-mail, databases, WMI, eventlog of zelf een locatie wilt maken, het is allemaal erg gemakkelijk te configureren. 2.4.10
Special code cases
Het laatste onderdeel van de technische analyse die ik heb moeten uitvoeren, waren de “Special Code Cases”. In dit onderdeel moeten alle verwachte problemen reeds opgelost en beschreven worden. Een voorbeeld van zo’n special code case is de treeview met drag-and-drop functionaliteit voor het question management gedeelte van de applicatie. Het oplossen van deze problemen op voorhand biedt één groot voordeel: één maal het programmeerprobleem opgelost en beschreven is kan het door eender welke ontwikkelaar gebruikt worden. Hier ga ik nu geen opsomming geven van alle special code cases, omdat deze aan bod zullen komen in het volgend hoofdstuk in dit dossier (de ontwikkeling).
Zoals de meeste projecten op mijn stage, werd mijn project ontwikkeld op basis van data driven development. Eens de database volledig operationeel was, werden op basis van de stored procedures de general en de data access laag automatisch gegenereerd in de ontwikkelomgeving. Een beter voorbeeld van data driven development is er dus waarschijnlijk niet te vinden. 2.5.2
Tijdslijn Eens de functionele en technische analyse achter de rug waren, kon ik eindelijk beginnen met het programmeren. Omdat iedere project verschilt in grootte en moeilijkheid, wordt er geen standaard verloop voor een project opgemaakt in het NDCC. Er is dus geen tijdslijn beschikbaar zoals voor de functionele analyse. Daarom heb ik, net zoals bij de technische analyse, zelf een tijdslijn van het verloop moeten opmaken. Deze kunt u in de figuur hiernaast zien. Maar dankzij de vele extra tijd die ik in de analyses moest steken, werd duidelijk dat de applicatie niet volledig zou afgeraken voor het einde van mijn stageperiode. Daarom werd afgesproken dat ik enkel de administrator gedeeltes (blauw en rood op de figuur) zou implementeren. Een andere ontwikkelaar zou dan naast mij op het project geplaatst worden wanneer het einde van mijn stageperiode in zicht kwam. Toen dit zover was, in de laatste weken van mijn stageperiode, zijn er niet één, maar twee ontwikkelaars bijgekomen op mijn project. Nadat ik de taken had verdeeld tussen deze ontwikkelaars, moest ik ervoor zorgen dat alles duidelijk was voor hen zodat de applicatie kon afgewerkt worden na de stageperiode. U kunt dus stellen dat de laatste week een soort van overgangsperiode was (groen op de figuur).
ASP.NET Applicaties worden doorgaans ontwikkeld met behulp van Visual Studio, de IDE van Microsoft. Het biedt een complete set ontwikkelingstools om computerprogramma's in diverse programmeertalen (Visual Basic, Visual C++, C#...) te ontwikkelen voor Windows omgevingen. Op mijn stage kreeg ik de kans om met de meest recente technologieën en producten te werken. Zo kreeg ik Visual Studio 2008 ter beschikking en mocht ik het .NET Framework 3.5 als basis voor mijn project gebruiken. Dit was voor mij een compleet nieuwe ervaring, aangezien ik tijdens mijn opleiding enkel met Visual Studio 2005 gewerkt had (in combinatie met het .NET Framework 2.0). Op mijn stage werd trouwens met de Visual Studio Team System editie gewerkt in plaats van met de professionele editie die ik op school gebruikt heb. Visual Studio Team System (VSTS) is vooral gericht op het vereenvoudigen en vergemakkelijken van de samenwerking tussen de verschillende rollen (ontwikkelaar, analist, project leider, project manager…) in een softwareontwikkelingscyclus. VSTS is dus veel meer dan enkel een set ontwikkelingstools. Het biedt ook extra functionaliteit voor samenwerking, rapportering en code analyse. In combinatie met deze VSTS werd ook de Visual Studio Team Foundation Server (TFS) gebruikt. Dit is de Microsoft Backend-server voor Source Code Control, Work Item Tracking, Process Guidance, Project Management en Project Reporting. Ook dit concept was nieuw voor mij. Ik had tijdens mijn opleiding wel reeds met CVS gewerkt in Java projecten, maar TFS gaat werkelijk veel verder dan CVS. Niet enkel de code wordt er bijgehouden, maar het volledige verloop van het project kan ermee opgevolgd worden. Er is zelf integratie met Microsoft SharePoint mogelijk, zodat de informatie over het project ook toegankelijk is via computers waarop VSTS niet geïnstalleerd is. 2.5.3.2
De database
Tijdens mijn opleiding ben ik geen enkele keer met Oracle in contact gekomen. Hierdoor had ik geen voorkeur voor een bepaalde tool om aan SQL ontwikkeling en databank onderhoud te doen op het Oracle platform. Op mijn stageplaats gebruikten de meeste mensen de gratis tool Oracle SQL developer, dus heb ik deze software ook geïnstalleerd. Het is een Java applicatie voor database ontwikkeling dat deel uitmaakt van de Oracle 10g Suite. Na enkele dagen bleek al vlug dat deze Oracle SQL developer niet de meest ideale tool was. Het programma liep regelmatig vast en werkte niet erg vlot. Na de wijze raad van een collega ben ik dan ook overgestapt op TOAD for Oracle. Deze tool bleek iets ingewikkelder te zijn, maar ik was er al vlug mee vertrokken. Uiteindelijk bleek deze TOAD veel vlotter te werken dan de Oracle SQL Developer en heb ik het blijven gebruiken tot aan het einde van mijn stageperiode.
De meest recente versie van de C# programmeertaal waarin ik tijdens mijn opleiding heb geprogrammeerd is C# 2.0. In deze versie waren de nieuwe features (in vergelijking met de vorige versie) onder andere: generics, nullable value type en partial classes. Momenteel is C# 3.0 de laatste versie van de C# programmeertaal. Deze versie werd uitgebracht op 19 november 2007 als onderdeel van het .NET Framework 3.5. Net als C# 2.0 bevat ook C# 3.0 veel nieuwe features in vergelijking met zijn voorganger. Deze nieuwe features zijn geïnspireerd door functionele programmeertalen zoals Haskell en ML. In de BRail Configuration Application heb ik een aantal van deze nieuwe features van C# 3.0 gebruikt. Hieronder vindt u over enkele van deze features een korte toelichting:
3.1
Object en Collection Initializers
3.1.1
Wat
Eén van de nieuwe taalfeatures van C#3.0 is de nieuwe syntax voor het creëren van objecten en collecties. De Object Initializer feature laat toe om met één commando zowel het object te creëren (zoals we vroeger deden met de “new” expressie) en om tegelijkertijd de eigenschappen van dat object in te vullen. De Collection Initializer werkt op een gelijkaardige manier: met één commando is het mogelijk om een collectie aan te maken en deze op het zelfde moment te vullen. Een voorbeeld: Person tomas = new Person() { Name = "Tomas", Age = 28, Hobby = "Music" }; Person clone = new Person() { tomas.Hobby, tomas.Name, tomas.Age }; List people = new List() { tomas, clone };
De eerste regel initialiseert een persoon object met de default constructor en vult de eigenschappen van het persoon object in. Hier konden we dus ook gewoon een constructor met dezelfde drie parameters opgeroepen hebben. De tweede regel initialiseert opnieuw een persoon object met de default constructor en opnieuw worden alle eigenschappen van dit persoon object ingevuld. Het verschil met de eerste regel is dat we hier niet expliciet de namen van de eigenschappen meegeven. De compiler weet hier namelijk welke eigenschappen moeten ingevuld worden met de meegegeven waarden. De derde regel initialiseert een collectie van het type List met de twee persoon objecten erin. Hier is duidelijk te zien dat een Collection Initializer expressie heel erg op een Array Initializer expressie lijkt.
Bij de ontwikkeling van de BRail Configuration Application heb ik vaak gebruikt gemaakt van de nieuwe object Initializer feature. In onderstaand voorbeeld wordt een tabelrij opgevuld met cellen, met behulp van object initializers. tr.Cells.Add(new tr.Cells.Add(new tr.Cells.Add(new tr.Cells.Add(new tr.Cells.Add(new
De ASP.NET tabel waartoe de rij behoort, ziet u op onderstaande screenshot. Dit is tevens het scherm om een nieuwe applicatie aan te maken in de BRail Configuration Application. Zoals u ziet, werd dus ook de BRail Configuration Application zelf als een applicatie ingegeven.
Lamdba Expressies zijn ook een nieuwe taalfeature van C# 3.0, ze maken deel uit van het LINQ Framework. Maar ook afzonderlijk van LINQ zijn ze heel erg handig. Ze kunnen namelijk gebruikt worden als een handige verzameling voor C# 2.0 Anonymous Methods. Een voorbeeld: We willen uit een lijst van strings enkel degene afdrukken die een lengte hebben van meer dan drie. Met de C# 2.0 syntax kunnen we dit als volgt doen: List<string> lijst = new List<string> { "Dit", "is", "een", "verzameling", "strings" }; List<string> newLijst = lijst.FindAll(delegate(string s) { return (s.Length > 3);}); foreach( string s in newLijst ) { Console.WriteLine( s ); }
Aan FindAll wordt een delegate meegegeven, welke wordt aangeroepen voor ieder item T in de List. In de delegate wordt nagegaan of het meegegeven item voldoet aan een bepaalde eis, en er wordt true of false terug gegeven, al naar gelang de uitkomst. In C# 3.0 kunnen we bovenstaand voorbeeld nog vereenvoudigen, namelijk met behulp van lambda expressions: List<string> lijst = new List<string> { "Dit", "is", "een", "verzameling", "strings" }; List<string>
foreach( var s in newLijst ) { Console.WriteLine( s ); }
Als we bovenstaand voorbeeld nu vertalen in theorie, dan kunnen we zeggen dat een lambda expression gedefinieerd wordt met volgende syntax: (input parameters) => {expression or statement block}; De lambda operator, => wordt gelezen als “goes to”. Links van deze operator ziet u een lijst van nul of meer input parameters en rechts van de lambda operator ziet u de body van de lambda expression.
In de BRail Configuration Application heb ik ook gebruik gemaakt van lambda expressies. In onderstaand voorbeeld ziet u bijvoorbeeld hoe ik enkel de resultaten van checkboxen uit de GETrequest van een pagina filter met behulp van een lambda expressie. foreach (string key in Request.Form.AllKeys.Where(k => k.StartsWith( "ctl00$ContentPlaceHolder$checkbox_" ,StringComparison.OrdinalIgnoreCase))) { //Get the properties for the user from the request string[] vUserProperties = (key.Substring(34)).Split('$'); string vUSERNAME = vUserProperties[0]; string vFIRST_NAME = vUserProperties[1]; string vLAST_NAME = vUserProperties[2]; string vEMAIL = vUserProperties[3]; string vTELEPHONE = vUserProperties[4]; //Add a person to the database decimal? vID = _personactions.AddPerson(vUSERNAME, vFIRST_NAME, vLAST_NAME, vTELEPHONE, vEMAIL); //Add personID to the arraylist for the viewstate vSelectedPersons.Add(vID); }
Nog een nieuwigheid in C# 3.0 zijn Extension methods. Deze maken het voor ontwikkelaars mogelijk om nieuwe methoden toe te voegen aan een bestaand type (klasse of struct) zonder dat hiervoor een subklasse moet gemaakt worden. Dit geeft extra flexibiliteit zonder dat er inboet wordt op zaken als strong typing en validatie tijdens compiletijd. Ook deze nieuwe C# 3.0 taalfeature is nauw verbonden met LINQ. Een voorbeeld: Deze simpele methode (let op het this sleutelwoord) public static string Encrypt(this string input){ // Hier komt de functionaliteit om een string te encrypteren }
laat ons toe om de encrypt methode toe te passen op elke string instantie in dezelfde scope als de extenstion method: string s = "Test"; string encrypted = s.Encrypt();
3.3.2
Voorbeeld
Jammer genoeg heb ik pas “Extension Methods” ontdekt wanneer ik ze niet meer kon gebruiken. Er wordt van deze nieuwe feature dus geen gebruik gemaakt in de BRail Configuration Application. Maar moest ik vanaf de start van de ontwikkeling geweten hebben wat Extension Methods zijn en hoe ze gebruikt worden, dan had ik ze ongetwijfeld kunnen toepassen.
Een andere nieuwe handige feature is de Automatic Properties. Dit is een kortere syntax voor het declareren van een property dat leest en schrijft naar een bepaald veld of attribuut. Een voorbeeld: public string Name { get; set; }
Bovenstaande code doet hetzelfde als private string _name; public string Name { set { _name = value; } get { return _name; } }
3.4.2
Voorbeeld
Bovenstaand voorbeeld (3.4.1) komt eigenlijk rechtstreeks uit de BRail Configuration Application, dus ook deze nieuwe C# 3.0 feature werd in het project gebruikt.
Anonymous Types geven u de mogelijkheid om objecten te creëren van ongedefinieerde types tijdens het compileren. Deze ongedefinieerde types hebben geen naam, of zijn dus "anoniem". Anonieme types moeten gedeclareerd worden met behulp van de nieuwe Object Initializer functie (zie eerder in dit dossier). Een voorbeeld: class ConcreteType { private int _x; private int _y; public int X { get { return _x; } set { _x = value; } } public int Y { get { return _y; } set { _y = value; } } } ConcreteType conType = new ConcreteType(); contype.X = 1; contype.Y = 2;
Bovenstaande code kunnen we met anonieme types vervangen door één regel code, namelijk: var anonType = new { X = 1, Y = 2 };
In plaats van ConcreteType gebruiken we hier dus het keyword var. Er wordt dus pas tijdens het compileren een concreet type aan dit keyword gekoppeld. 3.5.2
Eén van de meest voorkomende programmeertaken bij de ontwikkeling van een applicatie is het vinden en ophalen van objecten uit het geheugen, uit een database of uit een XML bestand. C# 2.0 biedt wel een ondersteuning voor het zoeken in het interne geheugen, zoals het zoeken van een bepaalde naam in een collectie, maar voor het ophalen van data uit een database moet er een andere technologie aangesproken worden (dit is meestal ADO.NET). Er is dus een sterk verschil tussen het ophalen van data uit collecties in het interne geheugen en het ophalen van data uit een databank (ook al kan dit heel gemakkelijk met ADO.NET). Beide manieren van data ophalen hebben zo hun voor- en nadelen: zoeken in het interne geheugen mist de sterke en flexibele query-mogelijkheden van SQL en ADO.NET is eigenlijk geen deel van de C# taal (het is en blijft nog steeds een extern framework). Het doel van LINQ (Language INtegrated Query) is om de query-mogelijkheden van SQL te integreren in de C# taal. Op deze manier verdwijnt het onderscheid tussen het zoeken in een database, een XMLdocument en een collectie in het interne geheugen. Een voorbeeld: List lijstGetallen = new List{ 6, 4, 3, 1, 1, 18, 7, 5 }; //alleen de even getallen selecteren + sorteren var lijstEven = from g in lijstGetallen where g % 2 == 0 orderby g select g; foreach (int i in lijstEven) { Console.WriteLine(i.ToString()); }
In de bovenstaande code wordt een lijst aangemaakt en opgevuld met een aantal integer waarden. In deze lijst wordt dan gezocht met behulp van een LINQ query naar alle even getallen. Het resultaat wordt opgeslagen in een anonymous type. Wanneer dan alle waarden in dit anonymous type doorlopen worden, weet de compiler meteen dat het om integer waarden gaat. Het resultaat is uiteraard: 4 6 18. Bovenstaande code is een voorbeeld van LINQ-to-Objects, maar er bestaan nog veel meer LINQ providers. Enkele voorbeelden: LINQ-to-SQL, LINQ-to-Dataset, LINQ-to-XML, LINQ-to-Amazon, LINQto-SharePoint, LINQ-to-LDAP, LINQ-to-Flickr…
In mijn project heb ik jammer genoeg geen gebruik gemaakt van LINQ, maar ik heb er wel mee geëxperimenteerd. Hieronder ziet u bijvoorbeeld hoe ik het codevoorbeeld van de Lambda Expressies herwerkt heb met behulp van LINQ. Dit is opnieuw een voorbeeld van LINQ-to-Objects. Het object is hier de collectie van alle sleutels in de GET-request van de pagina. var query = from k in Request.Form.AllKeys where k.StartsWith("ctl00$ContentPlaceHolder$checkbox_") select k; foreach (string key in query){ //Get the properties for the user from the request string[] vUserProperties = (key.Substring(34)).Split('$'); string vUSERNAME = vUserProperties[0]; string vFIRST_NAME = vUserProperties[1]; string vLAST_NAME = vUserProperties[2]; string vEMAIL = vUserProperties[3]; string vTELEPHONE = vUserProperties[4]; //Add a person to the database decimal? vID = _personactions.AddPerson(vUSERNAME, vFIRST_NAME, vLAST_NAME, vTELEPHONE, vEMAIL); }
Op mijn stageplaats is jQuery, een javascript bibliotheek, de standaard om aan client-side scripting te doen in webapplicaties. Omdat jQuery een zeer recent verschijnsel is in de wereld van webontwikkeling, heb ik besloten om een hoofdstuk van mijn eindwerk eraan te wijden. Hieronder geef ik een korte schets van wat jQuery is, waarom het zo handig is, hoe het werkt, hoe ik het gebruikt heb en wat de alternatieven zijn.
4.1
Inleiding
Alhoewel javascript vaak niet als een “echte” programmeertaal aanzien wordt door webontwikkelaars, heeft ze de laatste jaren toch een veel beter imago verworven. Dit is te danken aan de recente interesse in interactieve internetapplicaties (Rich Internet Applications) en in de AJAX technologie. Webontwikkelaars hebben knip-en-plak javascript aan de kant gezet en vervangen door complete javascript bibliotheken die problemen als browserafhankelijke moeilijkheden voor eens en voor altijd oplossen. jQuery is pas laat toegetreden tot de markt van de zogenaamde Javascript bibliotheken. Met als slogan “The Make Less, Do More Javascript Framework” heeft jQuery de community der webontwikkelaars snel veroverd. Dit was mogelijk dankzij de steun van enkele populaire websites (zoals MSNBC) en enkele grote open source projecten (zoals SourceForge en Drupal). Als we jQuery vergelijken met de andere Javascript bibliotheken lijkt jQuery een ander doel na te streven. De focus ligt bij de meeste andere bibliotheken namelijk op het ontwerpen van handige javascript technieken, terwijl dit bij jQuery niet echt het geval is. Het doel van jQuery is het bieden van een nieuwe manier om interactieve internetapplicaties te ontwerpen. In plaats van te sukkelen met complexe javascript code hebben ontwikkelaars dankzij jQuery de mogelijkheid om, gebruikmakend van hun CSS-, XHTML- en basis Javascript kennis, elementen rechtstreeks te benaderen.
Als 21-jarige student kan ik het me niet voorstellen om websites te ontwikkeling zonder CSS. Maar voor 1996 bestond deze technologie helemaal niet. Webontwikkelaars waren in die tijd verplicht om opmaak te integreren in de documentstructuur van hun HTML-pagina’s. De toevoeging van CSS laat ons toe om de structuur van de pagina te scheiden van de opmaak/de stijl. Het laat ons toe om de volledige opmaak van een pagina te verwisselen met een andere stylesheet, zonder dat de structuur van die pagina (de HTML) moet aangepast worden. Jammer genoeg wordt tegenwoordig het gedrag (events en dergelijke) meestal niet gescheiden van de structuur van de pagina. Stukken code zoals hieronder zijn de dag van vandaag dan ook niet ongewoon:
In dit voorbeeld wordt er niet echt gezondigd tegen de scheiding van stijl en structuur, want de opmaak wordt toegepast met CSS. Wat niet van elkaar gespitst worden zijn de structuur van de pagina en het gedrag van de pagina, doordat het click-event een rechtstreeks onderdeel is van de structuur de pagina (onclick="doc…). Voor dezelfde redenen als de scheiding tussen opmaak en structuur heeft het ook zijn voordelen om een opsplitsing te maken tussen de structuur en het gedrag van een pagina, concreet komt dit neer op het scheiden van HTML en javascript. Het maken van deze scheiding wordt “unobtrusive javascript” genoemd. De makers van jQuery hebben zich erop gefocust om met hun javascript bibliotheek een mogelijkheid te creëren om deze scheiding tussen structuur en gedrag makkelijk te kunnen toepassen. Als we deze “unobstrusive javascript” techniek toepassen, dan kunnen we bovenstaand codevoorbeeld als volgt herschrijven (zonder jQuery):
In combinatie met dit (in de header van de pagina): <script type="text/javascript"> window.onload = function() { document.getElementById('testButton').onclick = makeItRed; }; function makeItRed() { document.getElementById('xyz').style.color = 'red'; }
jQuery bestaat uit één javascript bestand die alle algemene DOM-, Event-, Effect- en Ajax-functies bevat. Dit bestand kan als referentie toegevoegd worden in de header van om het even welke webpagina op volgende manier: <script type="text/javascript" src="path/to/jQuery.js">
jQuery biedt twee manieren van interactie: 1. Via de $ functie, dit is eigenlijk een factory method voor het jQuery object. Deze functie is chainable, ze retourneert telkens het jQuery object. 2. Via functies in het genre van $.functie. Deze functies werken niet per se met het jQuery object. Een typische manier van werken voor de manipulatie van meerdere DOM nodes begint met een $ functie waaraan een CSS selector string is gekoppeld. Het jQuery object bevat dan de referentie naar nul of meer elementen in de HTML pagina die voldoen aan de selector. Een voorbeeld: $("div.test").add("p.quote").addClass("blue").slideDown("slow");
Bovenstaande regel jQuery code vindt de verzameling van alle
tags met het class-attribuut test en alle
tags met het class-attribuut quote, en voegt de waarde blue toe aan het class-attribuut van alle nodes in de verzameling. Aan deze nodes wordt dan uiteindelijk ook een “SlideDown” animatie toegevoegd. U ziet dus dat $ en de .add functies betrekking hebben op het bepalen van de resultaat set, terwijl de addClass en de SlideDown functies betrekking hebben op de nodes in dit resultaat. De functies met prefix $. zijn basis methoden of hebben betrekking op globale eigenschappen en gedrag. Een voorbeeld: $.each([1,2,3], function() { document.write(this + 1); });
Bovenstaande regel jQuery code zal “2 3 4” in het document plaatsen. Hierbij heb ik dan ook de basis werking van jQuery uitgelegd, maar uiteraard zijn met jQuery ook veel complexere zaken mogelijk (bijvoorbeeld Ajax-functies) en zijn er zeer veel handige plugins beschikbaar voor deze javascript bibliotheek. Voor meer informatie over jQuery verwijs ik dan ook graag naar het boek “jQuery in action” en de officiële website van jQuery (zie literatuurlijst achteraan dit dossier).
In de BRail Configuration Application heb ik het jQuery zoveel mogelijk gebruikt. Telkens wanneer ik iets in javascript moest ontwerpen, heb ik dit met jQuery gedaan. Zo heb ik bijvoorbeeld volgende functie gebruikt om de geselecteerde rij in een tabel een andere opmaak te geven: $(function(){ $("table tr").hover(function(){ $(this).addClass("over"); },function(){ $(this).removeClass("over"); }); })
4.4.2
jQuery plug-ins
Bij de ontwikkeling van de BRail Configuration Application heb ik voor het implementeren van bepaalde functionaliteit een jQuery gebruikt, omdat het niet mogelijk was om voor deze bepaalde zaken een gelijkaardige functionaliteit te bieden met enkel C#/ASP.NET. 4.4.2.1
jQuery SimpleModal
SimpleModal is een jQuery plug-in die een simpele interface voorziet warmee het maken van modal dialogs mogelijk is. Het doel van deze plug-in is ontwikkelaars een middel geven om een cross-browser overlay te implementeren. Om deze plug-in te doen werken, moeten twee zaken gebeuren. Ten eerste moet de referentie naar deze plug-in gelegd worden. Dit ziet er als volgt uit: <script src="App_Themes/NDCC/js/jquery.simplemodal-1.1.1.js" type="text/javascript">
Verder moet ook aangegeven worden welke
tags als overlay moeten getoond worden en wanneer deze moeten getoond worden. Dit heb ik als volgt gedaan: $(document).ready(function () { $('a#insertfield').click(function (e) { e.preventDefault(); $.modal($('#insertfieldpopup')); }) $('a#inserttextblock').click(function (e) { e.preventDefault(); $.modal($('#inserttextblockpopup')); }) });
"; // 2.3 Als de vraag geen herhalende sub vraag is, dan ook de sub vragen van deze vraag ophalen. if (q.FIELD_TYPE != "Repetitive Sub Question") { LoadSubQuestions(q.QUES_ID); } // 2.4 Het listitem afsluiten lblTree.Text += "
De code op de vorige pagina wordt uitgevoerd bij het laden van de pagina. Eens deze code is uitgevoerd is de treeview geladen en is het mogelijk om de relaties tussen de vragen te wijzigen met behulp van de drag-and-drop functionaliteit. Eens alle aanpassingen gebeurd zijn, kunnen deze opgeslagen worden met behulp van een “Save” knop. Hieronder ziet u de implementatie van de NestedSortable jQuery plug-in voor het question management in de BRail Configuration Application.
jQuery was de meest logische keus als javascript bibliotheek voor mijn project, omdat het de standaard was binnen het .NET Competence Center. Dit had als voordeel dat ik bij problemen raad kon vragen bij collega’s, iets wat niet mogelijk zou geweest zijn als ik met een ander javascript Framework zou gewerkt hebben. Maar er zijn uiteraard nog een aantal andere gratis javascript bibliotheken beschikbaar naast jQuery. Hieronder vindt u een overzicht van de meest populaire onder hen. 4.5.1
Prototype
Prototype is een javascript bibliotheek geschreven door Sam Stephenson. Deze bijzonder goed doordachte en goed geschreven broncode neemt een groot deel van de last van uw schouders, verbonden met het creëren van uitgebreide, zeer interactieve web pagina's, karakteristiek voor Web 2.0. Deze javascript bibliotheek zorgt er ook voor dat javascript zich meer gedraagt als Ruby. Dit is logisch omdat Prototype oorspronkelijk ontworpen is om geïntegreerd te worden met Ruby On Rails. Dit is nog steeds mogelijk, maar tegenwoordig wordt uiteraard ook integratie met andere technologieën voorzien. Prototype is de javascript bibliotheek die het dichtste aanleunt bij jQuery. Net zoals jQuery biedt prototype een manier om javascript samen te vatten. Maar toch is er één groot verschil tussen beide bibliotheken. Het hoofddoel van prototype is namelijk het vereenvoudigen van javascript code en het vergemakkelijken van reeds bestaande javascript technieken, terwijl jQuery een volledig nieuwe manier voor javascript programmatie aanbiedt. Een groot voordeel van prototype tegenover jQuery is dat de community op dit moment veel groter is, wat logisch is, want prototype bestaat ook al bijna 3 jaar langer. In Combinatie met prototype wordt ook vaak Script.aculo.us gebruikt. Dit een uitbreiding voor de Prototype bibliotheek die functionaliteit voor speciale effecten biedt, zoals drag-and-drop, autocompletion…
4.5.2
Google Web Toolkit (GWT) Een andere javascript bibliotheek die steeds populairder wordt is de Google Web Toolkit (GWT). Het is ook een toolkit voor het ontwikkelen van Rich Internet Applicaties volgens het Ajax concept, maar het werkt op een compleet andere manier.
Eigenlijk past GWT zelfs niet tussen de andere javascript bibliotheken die ik besproken heb. Bij GWT moet u namelijk niet in javascript ontwikkelen, maar in Java. De GWT compiler zet de Java code vervolgens weer om naar (hele efficiënte) javascript. Deze javascript library is compatibel met Internet Explorer, Firefox, Mozilla, Safari en Opera.
Dojo is een open source DHTML tool die in javascript is geschreven. Het is in 2004 ontworpen door Alex Russell uit een aantal oudere javascript bibliotheken (nWidgets, Burstlib, f(m)…). Dit is ook de reden waarom Dojo soms een unified toolkit genoemd wordt. Het doel van Dojo is om de tijd tussen een idee en de realisatie van dat idee drastisch te verkorten door een aantal API’s en tools aan te bieden die de dagelijkse problemen bij het ontwikkelen van een dynamische website oplossen. Dojo beschikt niet alleen over een behoorlijk grote community, maar wordt ook gesteund door vele belangrijke bedrijven. Voorbeelden hiervan zijn: IBM, AOL en sinds kort ook ZEND. Eind mei 2008 is Dojo namelijk een partnerschap aangegaan met ZEND, een zeer groot PHP bedrijf. De Dojo toolkit zal hierdoor in de volgende versie van het ZEND Framework geïntegreerd worden. Verder is Dojo wellicht de snelste javascript bibliotheek die momenteel beschikbaar is. Uit de verschillende testresultaten (o.a. SlickSpeed) die op internet te vinden zijn, blijkt dat Dojo in een hogere versnelling werkt dan andere javascript bibliotheken. Net zoals jQuery beschikt ook Dojo over een zeer groot aantal plug-ins. Het verschil met jQuery is dat Dojo modulair is opgebouwd. Dit is ook de reden waarom sommige ontwikkelaars vinden dat Dojo makkelijker te gebruiken is.
4.5.4
Yahoo! User Interface (YUI) YUI is een javascript bibliotheek die intern bij Yahoo! ontwikkeld werd. Het oorspronkelijke doel ervan was om de manier om javascript te schrijven in het bedrijf te standaardiseren. Dit heeft als gevolg dat deze bibliotheek ontworpen is om te gebruiken in nieuwe applicaties, maar ook om te integreren in oudere legacy applicaties. YUI focust zich in principe niet erg op de javascript functionaliteit zelf, maar meer op het oplossen van browser problemen.
In tegenstelling tot alle andere gratis javascript werd de ontwikkeling van YUI wel gefinancierd, doordat het intern bij Yahoo! ontwikkeld werd. Het gevolg hiervan is dat YUI het meest geteste en het best gedocumenteerde javascript Framework is die er te vinden is.
Mijn stage was een zeer verrijkende ervaring geweest. Ik heb zeer veel bijgeleerd, zowel op het gebied van informatica als op andere gebieden. En ik ging elke dag met plezier naar het werk. Veel meer kan een student informatica niet wensen van een stage. De stageopdracht is volgens mij succesvol beëindigd. De BRail Configuration Application is niet volledig afgewerkt, maar dit was uiteraard ook niet de bedoeling. De functionele en technische analyse voor de applicatie werden wel volledig afgewerkt en up-to-date gebracht op de laatste dag van mijn stage. Het belang van deze documenten werd me nogmaals duidelijk gemaakt tijdens de laatste week, wanneer ik het project heb overgedragen aan twee andere .NET ontwikkelaars. Zij zullen de BRail Configuration Applicatie afwerken, zodat deze in productie kan genomen worden. Het gedeelte van de BRail Configuration Application dat ik zelf heb afgewerkt, voldoet logischerwijze aan de functionele en technische eisen die ik bepaald heb tijdens de analyse. Verder zijn ook mijn eigen toevoegingen aan het project zeker niet onopgemerkt gebleven bij mijn stagementor en collega’s. Voor mezelf had ik ook enkele voornemens gesteld bij de start van mijn stageperiode. Naast de normale voornemens (bijleren en goede punten halen), had ik bijvoorbeeld ook de bedoeling om mijn talenkennis bij te schaven. Dit is onder andere één van de hoofdredenen waarom ik mijn stage in Brussel gelopen heb. Hoewel ik mijn kennis van het Frans en het Engels nog veel kan verbeteren, vind ik toch dat ik in mijn opzet geslaagd ben. Ik spreek namelijk veel vlotter Frans en Engels dan voor mijn stage. Bijgevolg kan als een tevreden student terugkijken op mijn stage. Aan alle toekomstige laatstejaarsstudenten Toegepaste Informatica geef ik graag nog één raad mee. Als je de kans krijgt om ooit bij H-ICT stage te lopen, zeker niet twijfelen. Volgens mij is H-ICT één van de meest interessante stageplaatsen die er te vinden is voor een informaticastudent…
Hoewel ik zeer tevreden ben over mijn stageopdracht, heb ik ondertussen toch een aantal bedenkingen als ik nu terug kijk naar de BRail Configuration Application. Bij sommige keuzes die ik gemaakt heb tijdens de ontwikkeling, kunnen er zeker een aantal vraagtekens geplaatst worden.
1. AJAX in plaats van verborgen velden Een eerste bedenking is de manier waarop ik jQuery gebruikt heb. Over het algemeen is hier volgens mij weinig op aan te merken, maar in sommige gevallen is toch zeker een optimalisatie mogelijk. Zo heb ik een pagina ontworpen die volledig dynamisch opgebouwd wordt tijdens het inladen van de pagina. Om het resultaat van dit dynamische formulier op te slaan, heb ik een statisch hidden field aan de pagina toegevoegd om er met jQuery de resultaten van de dynamische onderdelen in weg te schrijven met javascript. Na iedere postback zijn namelijk alle dynamisch toegevoegde onderdelen opnieuw verdwenen. In de C# code-behind van de pagina wordt dan enkel de inhoud van het statische verborgen veld ingelezen om de resultaten van het dynamische formulier te weten te komen. In plaats van met een verborgen veld te werken had ik misschien beter de AJAX functies van jQuery gebruikt. Deze zijn naar het schijnt zeer gemakkelijk te implementeren en zouden mijn code heel wat eenvoudiger gemaakt hebben. Maar anderzijds heb ik nog nooit met deze AJAX functies gewerkt en had ik waarschijnlijk heel wat tijd verloren om er volledig mee vertrouwd te raken. Om bovenstaande bedenking verder te illustreren, vindt u hieronder enkele voorbeelden: Het stuk code hieronder bevat de functie om de NestedSortable plug-in van jQuery te gebruiken (zie pagina 88). Deze plug-in heeft een eigenschap “onChange” waaraan een javascript functie aan wordt gekoppeld. In deze functie wordt dan, in het geval van de BRail Configuration Application, de volledige nieuwe structuur van de plug-in opgeslagen in een verborgen veld. jQuery( function($) { $("#questions").NestedSortable( { accept: "page-item1", noNestingClass: "no-nesting", opacity: 0.8, helperclass: "helper", onChange: function(serialized) { $('#ctl00_ContentPlaceholder_lblHiddenField').val(serialized[0].hash); }, autoScroll: true, handle: ".sort-handle" } );
Zoals reeds gezegd is het codevoorbeeld op de vorige pagina dus niet de ideale oplossing. Een betere oplossing is het gebruik van de jQuery AJAX functies. Dit zou er als volgt uitzien: jQuery( function($) { $("#questions").NestedSortable( { accept: "page-item1", noNestingClass: "no-nesting", opacity: 0.8, helperclass: "helper", onChange: function(serialized) { $.ajax({ type: "POST", url: "doel ASPX pagina", data: serialized[0].hash }}, autoScroll: true, handle: ".sort-handle" } ); }
2. Nog meer gebruik maken van C# 3.0 Een tweede bedenking is dat ik nog veel meer gebruik kon gemaakt hebben van de nieuwe C# 3.0 functionaliteit. Zo heb ik bijvoorbeeld een methode om het zoekveld (dit is de naam en de voornaam aan elkaar zonder spaties, klinkers of vreemde tekens) voor een gebruiker aan te maken, geïmplementeerd als een static functie. Dit kon ik eventueel geïmplementeerd hebben als een extension method voor het C# string-object. Een andere nieuwe feature die ik misschien beter gebruikt had is LINQ. Het gebruik van deze nieuwe C# 3.0 feature zou in ieder geval leiden tot meer consistentie in de applicatie. Als ik LINQ-to-SQL gebruikt had, dan had ik geen ADO.NET moeten gebruiken. Hierdoor zou er geen onderscheid meer zijn tussen het benaderen van objecten in het interne geheugen en het ophalen van records uit de databank. Een nadeel hiervan is wel dat ik mijn DAL en GENERAL lagen niet meer zou kunnen laten genereren, zoals ik nu wel gedaan heb. De meest optimale oplossing voor dit probleem is dan volgens mij ook het gebruik van LINQ-toDataSet in plaats van LINQ-to-SQL. Hierdoor zou ik namelijk wel nog steeds de DAL en GENERAL lagen kunnen laten genereren. In de BUSINESS laag zou ik, op de datasets uit de gegenereerde DAL laag, LINQ kunnen toepassen waardoor ik eigenlijk het beste van beide werelden zou verkrijgen: consistentie bij het benaderen van objecten en de automatische generatie van de DAL en GENERAL lagen. Maar ook deze meest optimale oplossing heeft enkele nadelen: het vertrouwd raken met LINQ neemt veel tijd in beslag en wanneer andere ontwikkelaars moeten verder werken aan het project, moeten ook zij reeds vertrouwd zijn met LINQ.
3. Sneller overschakelen op nieuwe versies van componenten Een derde bedenking is dat ik misschien te lang gewacht heb om over te schakelen op de meest recente versie van externe componenten die ik heb gebruikt. Zo gebruikt de BRail Configuration Application op dit moment nog steeds niet de meest recente versie van de BRail Database Scraper en de jQuery Chili plug-in. Het was misschien beter geweest om meteen over te schakelen op de nieuwe versie van de externe componenten zodra ze verschenen zijn. Want zoals het nu is, zal iemand op het einde van de ontwikkeling een soort van optimalisatie doen. Deze optimalisatieperiode zou veel korter zijn geweest of men had het zelfs volledig kunnen weglaten, bij het direct overschakelen op de laatste versie van een component bij een nieuwe release. Maar anderzijds werkt de applicatie ook zonder deze meest recente componenten. Het integreren van deze laatste versies is geen prioriteit voor het slagen van het project, dus vind ik het maar logisch dat dit op het einde van het ontwikkelingsproces gebeurt. Op deze manier is er namelijk meer kans op het halen van de deadline, aangezien alle noodzakelijke eisen op dat moment reeds voldaan zijn.
4. jQuery versie bepalen per pagina Mijn vierde en laatste bedenking is dat ik geen controle geïmplementeerd heb om te bepalen welke versie van jQuery op welke pagina moet worden geladen. Dit is nodig omdat ik gebruik maak van de NestedSortable plug-in voor jQuery. Deze plug-in biedt namelijk geen ondersteuning voor Internet Explorer 7 als ze in combinatie met jQuery 1.2 gebruikt wordt. Momenteel wordt dit probleem opgelost door op de betreffende pagina, waar de NestedSortable plug-in gebruikt wordt, ook de vorige versie van jQuery (versie 1.1.9) in te laden. Dit heeft als gevolg dat bij het laden van deze pagina, twee verschillende versies van het jQuery bestand geladen worden (jQuery 1.2 wordt reeds in de masterpagina ingeladen). Ik had misschien beter een controle ingebouwd op de pagina met de NestedSortable, zodat de oudere jQuery versie enkel ingeladen wordt bij het openen van de pagina in Internet Explorer 7. Anderzijds wordt bij het laden van deze pagina al een aantal zware bewerkingen uitgevoerd en zou deze pagina nog meer vertraagd worden door deze controle. Ook zijn de twee jQuery bestanden die momenteel ingeladen worden samen slechts 60kb groot, wat absoluut geen verschil maakt in prestatie in een intranet omgeving. Een andere oplossing is een controle inbouwen in de masterpagina om daar reeds te bepalen welke versie van jQuery moet worden ingeladen. Maar omdat het resultaat van deze controle in bijna alle gevallen jQuery 1.2 is (behalve op de pagina met de NestedSortable plug-in), is dit duidelijk niet de juiste plaats voor een dergelijke controle. Het zou de prestaties van de applicatie te sterk beïnvloeden.
Besluit Ondanks bovenstaande bedenkingen, vind ik toch dat ik mijn stageopdracht met succes heb voltooid. Ik heb misschien niet altijd de juiste beslissing genomen, maar uit elke verkeerde of minder goede beslissing heb ik veel bijgeleerd. Omdat al mijn handelingen zeer goed werden opgevolgd, kon een verkeerde beslissing trouwens telkens op tijd gecorrigeerd worden.
Colofon Dit stageverslag werd uitgewerkt met behulp van: • IBM Laptop T43p • Microsoft Office Word 2007 De lopende tekst is uitgewerkt in het lettertype Calibri 11pts; programmacode zijn in Courrier New 10pts; De koppen zijn in het lettertype Cambria.