Ökad tillgänglighet av existerande programvara genom ...
Ökad tillgänglighet av existerande programvara genom ...
Ökad tillgänglighet av existerande programvara genom ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Examensarbete<br />
<strong>Ökad</strong> <strong>tillgänglighet</strong> <strong>av</strong> <strong>existerande</strong><br />
<strong>programvara</strong> <strong>genom</strong><br />
komponentifiering<br />
<strong>av</strong><br />
Fredrik Jonsson<br />
LiTH-IDA-Ex-01/N<br />
2001-11-14<br />
Företag: GoldPen Computing AB<br />
Handledare på företaget: Fredrik Söderlund<br />
Examinator: Kristian Sandahl
SAMMANFATTNING<br />
Sammanfattning<br />
Komponentifiering <strong>av</strong> system betyder att man gör<br />
funktionalitet i detta tillgängligt för andra system. Detta gör<br />
systemen mer flexibla och interaktion mellan flera system<br />
lättare. Man kan exempelvis göra viss funktionalitet hos ett<br />
komplext system tillgängligt via ett webbgränssnitt. Det finns<br />
en mängd faktorer att ta hänsyn till när man vill utföra en<br />
komponentifiering, såsom tillgängliga tekniker för<br />
komponenten, den <strong>existerande</strong> <strong>programvara</strong>ns uppbyggnad,<br />
programmeringsspråk, utvecklingsmiljö m.m.<br />
Tekniker som finns tillgängliga är exempelvis COM/DCOM,<br />
från Microsoft, men även CORBA, från The Object<br />
Management Group (OMG), och J<strong>av</strong>aRMI, från Sun<br />
Microsystems. För att exemplifiera komponentifieringen <strong>av</strong><br />
ett <strong>existerande</strong> system implementerades ett exempelsystem<br />
med hjälp <strong>av</strong> COM. Denna komponent användes sedan via ett<br />
webbgränssnitt med hjälp <strong>av</strong> ASP, Active Server Pages, som<br />
exekverade på en Microsoft IIS webbserver.<br />
Utvecklingsmiljön för komponenten var Microsoft Visual<br />
C++, eftersom det <strong>existerande</strong> systemet är implementerat med<br />
hjälp <strong>av</strong> detta verktyg. Viktigt när det gäller<br />
komponentifiering är att man lätt ska kunna uppdatera sin<br />
komponent, den ska vara tillgänglig och effektiv, framför allt<br />
när det gäller minneshantering. Just minne kan vara svårt att<br />
hantera om komponenten ska användas via ett webbgränssnitt.<br />
För att välja teknik för komponenten bör man ta hänsyn till i<br />
vilken miljö komponenten ska exekvera, det <strong>existerande</strong><br />
systemets implementationsspråk och framför allt hur<br />
komponenten ska användas.<br />
Förutom implementation <strong>av</strong> exempelsystemet med hjälp <strong>av</strong><br />
COM har även DCOM studerats. Förslag på<br />
systemuppbyggnad med hjälp <strong>av</strong> den senare modellen har<br />
tagits fram.<br />
iii
iv<br />
Sammanfattning
Förord<br />
Förord<br />
Denna rapport är resultatet <strong>av</strong> ett examensarbete vid<br />
Institutionen för Dat<strong>av</strong>etenskap (IDA) på Linköpings<br />
Tekniska Högskola (LiTH) under hösten 2001. Arbetet har<br />
utförts på uppdrag <strong>av</strong> GoldPen Computing AB i Linköping.<br />
Rapporten vänder sig till personer som vill lära sig mer om<br />
tekniker för komponentifiering, främst med hjälp <strong>av</strong> COM<br />
och DCOM, <strong>av</strong> <strong>existerande</strong> <strong>programvara</strong>. För att rapporten<br />
ska tillföra läsaren något bör denne besitta grundläggande<br />
kunskaper om datorer och programmering, framför allt<br />
Windows- och webbprogrammering.<br />
Linköping, 2002-03-28.<br />
Fredrik Jonsson<br />
v
vi<br />
Förord
Innehållsförteckning<br />
Innehållsförteckning<br />
1 INTRODUKTION ......................................................................13<br />
1.1 BAKGRUND.....................................................................13<br />
1.2 SYFTE.............................................................................14<br />
1.3 LÄSANVISNINGAR ...........................................................14<br />
2 PROBLEMSPECIFICERING .......................................................17<br />
2.1 PROBLEMFORMULERING..................................................17<br />
2.2 MÅLBESKRIVNING...........................................................18<br />
3 FÖRSTUDIE .............................................................................21<br />
3.1 DET EXISTERANDE SYSTEMET..........................................21<br />
3.2 VAL AV UTVECKLINGSMILJÖ............................................23<br />
3.3 VAL AV KOMPONENTTEKNIK ...........................................23<br />
3.4 MICROSOFT VISUAL STUDIO............................................25<br />
3.5 COM/DCOM .................................................................25<br />
4 SAMMANFATTNING/SLUTSATSER AV FÖRSTUDIE ....................27<br />
4.1 UTVECKLINGSMILJÖ........................................................27<br />
4.2 KOMPONENTTEKNIK........................................................27<br />
4.3 UPPTÄCKTA PROBLEM UNDER FÖRSTUDIEN......................28<br />
4.4 SAMMANFATTNING .........................................................30<br />
5 PROTOTYPUTVECKLING.........................................................33<br />
5.1 WEBBGRÄNSSNITTET ......................................................33<br />
5.2 PROTOTYPERNA ..............................................................35<br />
5.3 JÄMFÖRELSE/UTVÄRDERING AV PROTOTYPERNA..............52<br />
6 IMPLEMENTATION AV EXEMPELSYSTEM ................................57<br />
6.1 ÖVERGRIPANDE ..............................................................57<br />
6.2 ARBETSGÅNG UNDER UTVECKLINGEN..............................58<br />
6.3 SYSTEMETS UPPBYGGNAD ...............................................59<br />
6.4 DESIGN...........................................................................59<br />
6.5 IMPLEMENTATION ...........................................................69<br />
6.6 RESULTAT AV DESIGN/IMPLEMENTATIONEN .....................73<br />
6.7 TESTNING .......................................................................73<br />
7 UTVÄRDERING OCH FÖRBÄTTRINGSFÖRSLAG ........................75<br />
vii
viii<br />
Innehållsförteckning<br />
7.1 UTVÄRDERING................................................................75<br />
7.2 REAKTIONER FRÅN KUND OCH TESTPERSONER .................76<br />
7.3 FÖRBÄTTRINGSFÖRSLAG .................................................77<br />
7.4 ALTERNATIVA TEKNIKER (DCOM)..................................78<br />
8 SLUTSATSER, RESULTAT OCH ERFARENHETER.......................83<br />
8.1 SLUTSATSER/FÖRUTSÄTTNINGAR.....................................83<br />
8.2 RESULTAT.......................................................................84<br />
8.3 ERFARENHETER ..............................................................85<br />
9 BEGREPPSLISTA......................................................................87<br />
10 REFERENSER ..........................................................................91<br />
A. COM/DCOM.........................................................................95<br />
A.1 ALLMÄNT OM COM/DCOM ...........................................95<br />
A.2 ARKITEKTUREN HOS COM/DCOM .................................96<br />
A.3 GRÄNSSNITTET...............................................................97<br />
A.4 KLASSER/OBJEKT.......................................................... 102<br />
A.5 SÄKERHET.................................................................... 104<br />
A.6 PROCESS/TRÅDMODELL (THREADING MODEL)................ 106<br />
A.7 ARBETSFÖRDELNINGSMODELLER FÖR DCOM ............... 109<br />
A.8 MARSHALING ............................................................... 111<br />
B. MICROSOFT IIS OCH DCOMCNFG .................................... 115<br />
B.1 MICROSOFT IIS ............................................................ 115<br />
B.2 DCOMFNG................................................................. 116
1 Introduktion<br />
Introduktion<br />
Allteftersom Internet och WWW etablerat sig hos gemene<br />
man ökar efterfrågan <strong>av</strong> applikationer tillgängliga via detta<br />
forum. Man vill på företag kunna använda sina applikationer<br />
via exempelvis en webbläsare. Systemansvariga på företag<br />
inför restriktioner på vilken <strong>programvara</strong> som får installeras<br />
och användas i systemet. Lyckas man då konstruera<br />
<strong>programvara</strong> som kan köras <strong>genom</strong> exempelvis Internet<br />
Explorer, tjänar utvecklarna mycket pengar och tid eftersom<br />
de slipper <strong>genom</strong>gå certifieringsprocedurer på sina program,<br />
samt att man slipper installationsarbete på alla klienter som<br />
ska använda <strong>programvara</strong>n. Ännu bättre vore om man kunde<br />
slippa utveckla ny <strong>programvara</strong> för att använda via ett<br />
webbgränssnitt och att man istället kunde använda <strong>existerande</strong><br />
system för på ett enkelt sätt göra dessa mer tillgängliga. Detta<br />
kan uppnås <strong>genom</strong> att man komponentifierar <strong>existerande</strong><br />
<strong>programvara</strong> och använder dessa komponenter på olika sätt på<br />
en webbserver eller liknande.<br />
Den här rapporten presenterar möjligheter och lösningar på<br />
problem som kan uppkomma när man ska komponentifiera ett<br />
<strong>existerande</strong> system och göra det tillgängligt via ett<br />
webbgränssnitt och Internet Explorer på ett internt nätverk.<br />
Rapporten är ett resultat <strong>av</strong> ett examensarbete utfört vid<br />
Institutionen för Dat<strong>av</strong>etenskap (IDA) vid Linköpings<br />
Tekniska Högskola på uppdrag <strong>av</strong> GoldPen Computing AB i<br />
Linköping.<br />
1.1 Bakgrund<br />
GoldPen Computing AB är ett företag i Linköping med ca. 15<br />
anställda. De inriktar sig på applikationer <strong>av</strong>sedda för<br />
handdatorer att använda i fält, exempelvis vid projekteringar.<br />
En kund hos GoldPen Computing AB är Telia AB, som<br />
använder penndatorer när de är ute och projekterar arbeten.<br />
Till sin hjälp har de ett system som heter Klipp, f.d. MätBok<br />
90, som beräknar materialåtgång, materialkostnad,<br />
arbetskostnad etc. Detta ska göras tillgängligt via ett<br />
webbgränssnitt, där man ska kunna utföra vissa beräkningar<br />
med ett antal grundmallar som bas.<br />
9
10<br />
1.2 Syfte<br />
Introduktion<br />
Syftet med examensarbetet är att identifiera möjligheter och<br />
problem vid komponentifiering <strong>av</strong> ett <strong>existerande</strong> system<br />
<strong>genom</strong> att implementera en sådan komponent för det specifika<br />
fallet beskrivet i kapitel 3.1, Det <strong>existerande</strong> systemet. Kan<br />
man göra sin komponentifierade <strong>programvara</strong> tillgänglig via<br />
ett webbgränssnitt medför detta att man kan komma åt<br />
funktionalitet <strong>genom</strong> sin vanliga webbläsare, exempelvis<br />
Internet Explorer. Många företag försöker standardisera sin<br />
datormaskinpark, framför allt när det gäller mjukvara. Kan<br />
man då göra sina system tillgängliga via webbläsaren behöver<br />
man alltså inte installera någon <strong>programvara</strong> för varje<br />
användare, vilket medför att man kommer undan den<br />
kostsamma och tidskrävande certifieringsprocessen som varje<br />
ny <strong>programvara</strong> måste <strong>genom</strong>gå. Certifieringsprocessen<br />
kommer <strong>av</strong> att man inte vill att nya system ska störa<br />
<strong>existerande</strong>.<br />
Utöver själva komponentifieringen tillkommer även att<br />
identifiera möjligheter och problem vid utvecklingen <strong>av</strong> ett<br />
webbgränssnitt för komponenten. Ett webbgränssnitt medför<br />
vissa begränsningar när det gäller exempelvis<br />
användargränssnitt, men även vissa programmeringstekniska<br />
begränsningar såsom datatyper, händelser mm.<br />
1.3 Läsanvisningar<br />
Rapporten vänder sig framför allt till personer som är<br />
intresserade <strong>av</strong> komponentifiering och webbprogrammering.<br />
För att få någon behållning <strong>av</strong> rapporten bör alltså en viss<br />
kunskap inom dessa områden finnas, samt inom<br />
utvecklingsarbete i Windowsmiljö. Det antas även att läsaren<br />
har en viss programmeringsvana i C++ (Microsoft Visual<br />
C++ [5]).<br />
Återstoden <strong>av</strong> rapporten disponeras på följande sätt:<br />
Kapitel 2: Problemspecificering<br />
Omfattar en specificering <strong>av</strong> problemet samt en beskrivning<br />
<strong>av</strong> målet med examensarbetet.
Kapitel 3: Förstudie<br />
Introduktion<br />
Omfattar en beskrivning <strong>av</strong> arbetet under förstudieperioden.<br />
Här beskrivs även det <strong>existerande</strong> systemet kort, en del<br />
komponenttekniker samt val <strong>av</strong> programspråk och<br />
utvecklingsmiljö. Här återfinns även de tekniker som valdes<br />
bort tillsammans med en kort motivering för dessa val.<br />
Kapitel 4: Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
Här återges vad som framkom under förstudieperioden samt<br />
vilka slutsatser som kunde dras <strong>av</strong> detta. Under förstudien<br />
lästes en hel del material inom respektive område vilket<br />
resulterade i att vissa problem uppdagades. Slutsatserna ligger<br />
till grund för arbetet under prototyputvecklingsperioden och<br />
utvecklingsperioden.<br />
Kapitel 5: Prototyputveckling<br />
I det här kapitlet beskrivs arbetet med att utveckla prototyper.<br />
Det ingår då en kort beskrivning <strong>av</strong> varje teknik som testats<br />
och sedan en utvärdering <strong>av</strong> dessa. Utvärderingen är till för att<br />
välja teknik för utvecklingsarbetet <strong>av</strong> en färdig komponent<br />
tillsammans med ett webbgränssnitt.<br />
Kapitel 6: Implementation <strong>av</strong> exempelsystem<br />
Här beskrivs hur ett exempelsystem skapades. Kapitlet<br />
innehåller design, implementation och testning <strong>av</strong> detta.<br />
Systemet är uppdelat i två huvuddelar, en komponentdel,<br />
innehållande en eller flera komponenter, och ett<br />
webbgränssnitt. Båda dessa beskrivs här.<br />
Kapitel 7: Utvärdering och förbättringsförslag<br />
Här återfinns en utvärdering <strong>av</strong> exempelsystemet, baserat på<br />
bl.a. information från en applikation för att simulera många<br />
simultana användare på en webbserver, Microsoft Web<br />
Application Stress Tool [26]. I kapitlet ges även två förslag på<br />
hur systemet skulle kunna byggas upp med hjälp <strong>av</strong> DCOM<br />
och ActiveX tillsammans med DCOM.<br />
11
12<br />
Introduktion<br />
Kapitel 8: Begreppslista<br />
Här beskrivs viktiga och vanligt förekommande begrepp som<br />
behövs för att underlätta förståelsen <strong>av</strong> resten <strong>av</strong> dokumentet.<br />
Kapitel 9: Referenser<br />
I det här kapitlet återfinns alla externa referenser till andra<br />
dokument, böcker och webbsidor.<br />
Appendix A: COM/DCOM<br />
Här beskrivs Microsofts tekniker för komponenter, COM och<br />
DCOM. Framför allt beskrivs COM eftersom det är denna<br />
modell som används för komponentifiering <strong>av</strong> ett system i det<br />
här fallet.
Problemspecificering<br />
2 Problemspecificering<br />
Detta kapitel formulerar problemställning och mål med<br />
examensarbetet.<br />
2.1 Problemformulering<br />
Examensarbetet <strong>av</strong>ser att komponentifiera ett <strong>existerande</strong><br />
system för att göra valda delar <strong>av</strong> detta tillgängligt via ett<br />
webbgränssnitt. Det <strong>existerande</strong> systemet används idag som<br />
en fristående applikation och fungerar på datorer med<br />
operativsystem ur Microsofts Windowsfamilj, Windows 95,<br />
98, NT och 2000 (se 3.1, Det <strong>existerande</strong> systemet).<br />
För att <strong>genom</strong>föra komponentifieringen finns ett antal olika<br />
tekniker och utvecklingsmiljöer att tillgå. Problemet kan<br />
därför delas upp i följande delproblem:<br />
• Val <strong>av</strong> utvecklingsmiljö utifrån operativsystem,<br />
programmeringsspråk, IDE (Integrated Development<br />
Environment) m.m.<br />
• Val <strong>av</strong> komponentteknik utifrån vald utvecklingsmiljö<br />
• Implementation <strong>av</strong> komponent<br />
• Implementation <strong>av</strong> webbgränssnitt<br />
2.1.1 Val <strong>av</strong> utvecklingsmiljö<br />
Beroende på i vilken miljö lösningen skall fungera kan olika<br />
programmeringsspråk och IDE användas. Vid valet bör alltså<br />
vägas in vilket operativsystem som komponenten skall<br />
fungera i och vilken webbserver webbgränssnittet ska ligga<br />
på. Även utvecklingsmiljö för det <strong>existerande</strong> systemet spelar<br />
en <strong>av</strong>görande roll.<br />
2.1.2 Val <strong>av</strong> komponentteknik<br />
För att skapa en bakgrund till valet <strong>av</strong> komponentteknik för<br />
den slutgiltiga komponenten bör en delmängd <strong>av</strong> de tänkbara<br />
teknikerna testas och utvärderas. Resultatet från denna<br />
utvärdering ligger till grund för vilken teknik som kommer att<br />
användas vid utvecklingen <strong>av</strong> en användbar komponent.<br />
Viktigt att ta hänsyn till här är stöd för t.ex. databaskopplingar<br />
13
14<br />
Problemspecificering<br />
och kodåtervinning. För att kunna göra det här valet ska olika<br />
tekniker testas <strong>genom</strong> att ett antal prototyper implementeras.<br />
2.1.3 Implementation <strong>av</strong> komponent<br />
När valet <strong>av</strong> komponentteknik (se 2.1.2, Val <strong>av</strong><br />
komponentteknik) gjorts ska en komponent implementeras.<br />
Denna ska fungera i åtminstone en simulerad miljö.<br />
Komponenten ska dock vara utvecklad så att den lätt kan<br />
införas i den slutgiltiga lösningen på komponentifieringen <strong>av</strong><br />
systemet.<br />
2.1.4 Implementation <strong>av</strong> webbgränssnitt<br />
För att utvärdera hur komponenten fungerar ska ett<br />
webbgränssnitt implementeras, där denna används.<br />
Webbgränssnittet ska innehålla valda delar <strong>av</strong> funktionaliteten<br />
hos det <strong>existerande</strong> systemet. När man vill använda sin<br />
komponent via webben måste man följa vissa regler, framför<br />
allt när det gäller datatyper och säkerhet.<br />
2.2 Målbeskrivning<br />
Examensarbetet kan delas upp i ett antal delmål utifrån<br />
problemformuleringen enligt:<br />
1. Undersökning och utredning <strong>av</strong> tillgängliga teknologier<br />
och hur implementationen bör utföras. I första hand ska<br />
COM/DCOM behandlas för att användas från<br />
exempelvis ASP (Active Server Pages).<br />
2. Någon eller några delar <strong>av</strong> systemet är simulerat. En<br />
testmiljö skapas för att kontrollera om tekniken, som<br />
togs fram under punkt 1, fungerar.<br />
3. Någon eller några delar <strong>av</strong> systemet är implementerat<br />
som <strong>av</strong>sett, samtidigt som några delar simuleras i<br />
testmiljön.<br />
4. De flesta delarna <strong>av</strong> systemet fungerar som <strong>av</strong>sett och<br />
kan visas i en fingerad miljö.<br />
5. Ett demonstrationsexemplar har gjorts i skarp miljö.<br />
Ett realistiskt mål är att uppnå minst nivå 3.
Problemspecificering<br />
2.2.1 Undersökning <strong>av</strong> tillgängliga tekniker<br />
Det här målet kan återkopplas till första och andra punkten i<br />
problemformuleringen (se 2.1.1, Val <strong>av</strong> utvecklingsmiljö, och<br />
2.1.2 Val <strong>av</strong> komponentteknik). När målet uppnåtts bör en<br />
delmängd <strong>av</strong> tillgängliga tekniker ha testats <strong>genom</strong> att<br />
prototyper utvecklats. Dessa prototyper ska utvärderas för att<br />
senare val <strong>av</strong> teknik för den slutliga komponenten ska kunna<br />
göras på ett bra sätt.<br />
2.2.2 Simulering i en testmiljö<br />
Det här målet är till för att noggrannare testa den teknik som<br />
valdes under tidigare undersökning (se 2.2.1, Undersökning<br />
<strong>av</strong> tillgängliga tekniker). Om den valda tekniken inte skulle<br />
visa sig fungera som förutsett finns fortfarande möjlighet att<br />
byta teknik.<br />
2.2.3 Delar <strong>av</strong> komponenten implementerade som <strong>av</strong>sett<br />
Med det här målet <strong>av</strong>ses att komponentifieringen är<br />
<strong>genom</strong>förbar och viss grundläggande funktionalitet är<br />
implementerad. Sådan funktionalitet kan vara att<br />
komponenten kan användas med vissa parametrar satta till<br />
standardvärden.<br />
2.2.4 De flesta delarna <strong>av</strong> komponenten implementerade<br />
Komponenten är i stort sett färdig. Fortfarande förekommer<br />
en del standardvärden på vissa parametrar samt att de mest<br />
komplicerade delarna <strong>av</strong> det <strong>existerande</strong> systemet inte finns<br />
tillgängligt via webbgränssnittet.<br />
2.2.5 Demonstrationsexemplar <strong>av</strong> komponenten<br />
Komponenten är så pass färdig och webbgränssnittet<br />
implementerat för att kunna användas på ett tillfredsställande<br />
sätt.<br />
15
3 Förstudie<br />
Förstudie<br />
Förstudien syftar till att presentera information om olika<br />
valmöjligheter för delproblemen specificerade i<br />
problemformuleringen (se 2.1, Problemformulering) samt att<br />
sätta sig in i det <strong>existerande</strong> systemet som skall användas för<br />
utredningen.<br />
3.1 Det <strong>existerande</strong> systemet<br />
Systemet som ska göras tillgängligt via ett webbgränssnitt<br />
heter Klipp och är ett projekteringssystem som används <strong>av</strong><br />
Telia AB. Med hjälp <strong>av</strong> detta system kan man beräkna arbets-<br />
och materialkostnader för att exempelvis lägga ned en kabel<br />
mellan två punkter i terrängen. Man beskriver då terrängen<br />
längs den sträcka som ska projekteras, exempelvis <strong>genom</strong> att<br />
tala om var och hur mycket som behöver sprängas, hur många<br />
vägtrummor som måste läggas ned m.m. Klipp hette tidigare<br />
MätBok 90 (MB 90) och var ett DOS-baserat system, som i<br />
senare versioner har flyttats över till 32-bitars Windowsmiljö.<br />
Systemet är uppbyggt <strong>av</strong> ett antal moduler och databaser (se<br />
Figur 1). I systemet finns två databaser som existerar hela<br />
tiden och en projektdatabas för varje projekt.<br />
I systemdatabasen (Sysbaser) finns, förutom tillgängligt<br />
material för arbetet, ett antal mallar som kan användas för att<br />
snabbt skapa sig en uppfattning om kostnaden för vissa<br />
projekt. Här återfinns bland annat projekt som husmontering,<br />
nedläggning <strong>av</strong> OPTO-kabel i tätort/glesbyggd etc. Denna<br />
funktion är det som i första hand eftersöks hos den komponent<br />
och det webbgränssnitt som ska utvecklas under<br />
examensarbetet. I den andra systemdatabasen, krypterad<br />
CTree, finns priser för arbeten och material för respektive<br />
entreprenör.<br />
I figuren nedan (Figur 1) syns att systemet består <strong>av</strong> fem<br />
moduler:<br />
• MB3: Användargrässnittet.<br />
• MB3MODEL: Beräkningsmodeller,<br />
projektinformation.<br />
• MB3DB: Databashantering.<br />
• MB3PRDB: Databashantering.<br />
17
18<br />
Klipp<br />
MB3UTIL<br />
Förstudie<br />
• MB3UTIL: Kvarleva från tidigare versioner. Innehåller<br />
bland annat klasser för stränghantering m.m.<br />
Sysbaser<br />
med material,<br />
mallar mm (Access)<br />
MB3<br />
MB3MODEL<br />
MB3DB MB3PRDB<br />
Krypterad DB<br />
med priser mm (CTree)<br />
Figur 1. Moduler och kopplingar mellan dessa i Klipp<br />
Alla moduler utom MB3 är implementerade och tillgängliga<br />
som statiska kodbibliotek (lib-filer). Dessa bibliotek länkas in<br />
i MB3 som sedan kan använda funktionalitet hos dessa.<br />
Det som eftersträvas är en modul att koppla till MB3MODEL<br />
som gör det möjligt att komma åt funktionalitet från denna<br />
och nedåt i hierarkin via ett webbgränssnitt.<br />
3.2 Val <strong>av</strong> utvecklingsmiljö<br />
Projekt (Access)<br />
WWW<br />
Komponent<br />
När det gäller valet <strong>av</strong> utvecklingsmiljö finns ett antal faktorer<br />
att väga in. Bland dessa märks speciellt:
• Operativsystem<br />
• Tillgänglighet<br />
• Dokumentation<br />
• Förkunskap<br />
Förstudie<br />
De operativsystem som kan vara aktuella för lösningen är<br />
Microsoft Windows, Unix och Linux. Den <strong>existerande</strong> lösning<br />
finns just nu i versioner som fungerar på datorer med olika<br />
versioner ingående i Microsoft Windows-familjen, så som<br />
Windows 95, 98 och 2000 Professional/Server. Även på<br />
serversidan, alltså den dator där webbservern för<br />
webbgränssnittet ska köras, används Microsoft Windows med<br />
Microsoft Internet Information Service (IIS) [21] installerat.<br />
För Microsoft Windows finns även tillgängligt<br />
utvecklingsverktygen Microsoft Visual Studio 6.0 och<br />
Microsoft Visual Studio.NET 7.0 [5]. Till båda dessa finns<br />
dokumentation tillgänglig via Microsoft Developer Network<br />
Home (MSDN Home) [1] på Internet samt Microsoft<br />
Developer Network Library (MSDN Library) som installeras<br />
lokalt på utvecklingsdatorn. Det senare ingår då som en del i<br />
Microsoft Visual Studio.<br />
Med ovanstående fakta var valet en självklarhet.<br />
Operativsystemet som ska användas är Microsoft Windows<br />
och utvecklingsverktyget är Microsoft Visual Studio.<br />
Intressant att nämna är att Microsoft Visual Studio.NET 7.0<br />
för tillfället endast finns i s.k. bet<strong>av</strong>ersion och att ingen på<br />
företaget tidigare använt denna miljö för utvecklingsarbete.<br />
Det var först tänkt att version 7.0 skulle testas under<br />
prototyputvecklingen, framför allt under utvecklingen <strong>av</strong><br />
webbgränssnittet. Detta <strong>genom</strong>fördes dock inte (se 5.1.3,<br />
Visual Studio.NET 7.0 (C# Web Application)).<br />
3.3 Val <strong>av</strong> komponentteknik<br />
En komponent är en modul, bestående <strong>av</strong> ett eller flera objekt<br />
eller klasser, som kan ses som en s.k. svart låda.<br />
Komponenten har ett väldefinierat gränssnitt (interface)<br />
<strong>genom</strong> vilket kommunikation i form <strong>av</strong> metodanrop kan ske.<br />
De tekniker som finns tillgängligt inom komponentifieringen<br />
<strong>av</strong> system skiljer sig en del åt i implementation och<br />
19
20<br />
Förstudie<br />
underliggande struktur när det gäller anropskedjor m.m.<br />
Tillgängliga tekniker för komponentifieringen är:<br />
• COM/DCOM<br />
• ActiveX<br />
• CORBA<br />
• J<strong>av</strong>aRMI<br />
m.fl.<br />
Eftersom valet <strong>av</strong> utvecklingsmiljö (se 3.2, Val <strong>av</strong><br />
utvecklingsmiljö) föll på Microsoft Windows tillsammans<br />
med Microsoft Visual Studio föll valet <strong>av</strong> komponentteknik<br />
på COM/DCOM (se 9, Begreppslista, samt appendix A,<br />
COM/DCOM)<br />
3.3.1 Tekniker som valdes bort<br />
I <strong>av</strong>snittet ovan listades ett antal tekniker för<br />
komponentifieringen. Av dessa valdes en ut eftersom de andra<br />
<strong>av</strong> olika anledningar inte ansågs uppfylla de kr<strong>av</strong> som ställs<br />
på komponenten.<br />
1. ActiveX – Den här tekniken har ungefär samma<br />
egenskaper som COM/DCOM-komponenter men är<br />
inte lika generell som dessa. Exempelvis krävs det att<br />
klienten har den aktuella ActiveX-komponenten<br />
registrerad för att kunna använda den. Det finns även<br />
vissa begränsningar på vilket sätt en ActiveXkomponent<br />
kan användas i webbgränssnittet,<br />
exempelvis i en s.k. ASP (Active Server Page). Dessa<br />
begränsningar kommer <strong>av</strong> att en ActiveX-komponent<br />
kan innehålla grafiskt användaregränssnitt (GUI), vilket<br />
inte är tillåtet om man vill att komponenten ska<br />
exekvera på en server.<br />
2. CORBA – Det här är egentligen inte någon komponent<br />
utan en standard definierad <strong>av</strong> The Object Management<br />
Group (OMG) [2] för att möjliggöra kommunikation<br />
mellan en server och en klient. CORBA är speciellt<br />
användbart när lösningarna implementeras i J<strong>av</strong>a. För<br />
en jämförelse mellan DCOM och CORBA se [3].<br />
3. J<strong>av</strong>aRMI – Det här är Sun Microsystems [4] modell för<br />
distribuerade komponenter och objekt. Eftersom<br />
utvecklingsverktyget för uppgiften är vald till Microsoft
Förstudie<br />
Visual Studio så kan inte denna renodlade J<strong>av</strong>ateknik<br />
användas. En fördel med J<strong>av</strong>aRMI är att modellen gör<br />
att lösningarna blir helt plattformsoberoende. Detta<br />
gäller även för CORBA-lösningar implementerade i<br />
J<strong>av</strong>a.<br />
3.4 Microsoft Visual Studio<br />
Microsoft Visual Studio är ett kraftfullt verktyg som erbjuder<br />
utveckling <strong>av</strong> allt från stora system med flera utvecklare ner<br />
till små enkla program utvecklade <strong>av</strong> en person. Verktyget har<br />
funnits i ett antal versioner där den senast släppta versionen är<br />
version 6.0. Ute nu finns dock bet<strong>av</strong>ersioner <strong>av</strong> .NET 7.0, som<br />
beräknas släppas i fullständig version inom kort. .NET 7.0<br />
innehåller bl.a. ett helt nytt programspråk, C# (C Sharp), som<br />
är ett språk utvecklat för att underlätta utvecklingen <strong>av</strong><br />
webbapplikationer. Det är en blandning mellan J<strong>av</strong>a och C++.<br />
Mer information om Microsoft Visual Studio finns på<br />
Microsoft Developer Network [1] samt på Microsoft Visual<br />
Studio Home Page [5].<br />
3.5 COM/DCOM<br />
COM (Component Object Model) och DCOM (Distributed<br />
Component Object Model) [6] är två olika modeller för<br />
komponentutveckling. DCOM är en utökning <strong>av</strong> COM med<br />
stöd för distribuerade komponenter. COM ska vara en<br />
plattformsoberoende, objektorienterad modell, men vänder sig<br />
framför allt till utvecklare som använder sig <strong>av</strong> Visual Basic<br />
eller C++. Detta gör att komponenter enligt COM främst<br />
används för system som körs under Microsoft Windows. För<br />
mer information se appendix A, COM/DCOM.<br />
21
Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
4 Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
Det här kapitlet syftar till att sammanfatta vad som framkom<br />
under förstudiefasen samt vilka slutsatser man kan dra <strong>av</strong><br />
detta.<br />
Under förstudieperioden lästes mycket material, <strong>genom</strong>gång<br />
<strong>av</strong> det <strong>existerande</strong> systemet förekom samt s.k. debuggning<br />
(debugging, <strong>av</strong>lusning) <strong>av</strong> detsamma. Den debugger som<br />
användes är den som ingår i Microsoft Visual Studio 6.0 [5].<br />
Med detta som grund kunde vissa slutsatser dras. Dessa ligger<br />
sedan till grund för det fortsatta arbetet, framför allt under<br />
utvecklingsperioden, men även under prototyputvecklingen.<br />
4.1 Utvecklingsmiljö<br />
Valet <strong>av</strong> utvecklingsmiljö var relativt lätt att göra. För själva<br />
komponenten är det Microsoft Visual Studio 6.0 [5] som är<br />
aktuellt. Anledningen till detta val är att det <strong>existerande</strong><br />
systemet är utvecklat i denna miljö. Under förstudien har även<br />
Microsoft Visual Studio.NET 7.0 studerats och det<br />
<strong>existerande</strong> systemet har kompilerats med hjälp <strong>av</strong> den<br />
kompilatorn. Själva kompileringen gick bra efter ett fåtal<br />
ändringar och en del inställningar framför allt när det gäller<br />
länkningen <strong>av</strong> programmet. Det som var <strong>av</strong>görande för valet<br />
<strong>av</strong> version 6.0 <strong>av</strong> utvecklingsmiljön var att det<br />
omkompilerade systemet krävde nya versioner <strong>av</strong> vissa s.k.<br />
DLL:er. Dessa DLL:er finns oftast inte tillgängliga i dagsläget<br />
om inte version 7.0 är installerat på respektive dator.<br />
Vad som dock kan vara intressant att utvärdera är användning<br />
<strong>av</strong> version 7.0 när det gäller utvecklingen <strong>av</strong><br />
webbgränssnittet. Detta eftersom den här versionen innehåller<br />
mycket bättre stöd för utveckling <strong>av</strong> sådana system.<br />
4.2 Komponentteknik<br />
Även valet <strong>av</strong> komponentteknik var relativt enkelt att göra.<br />
Här föll valet, som tidigare nämnts, på COM [6] (se 3.5,<br />
COM/DCOM). Detta eftersom det finns stöd för sådan<br />
utveckling i den valda utvecklingsmiljön. De delar <strong>av</strong> det<br />
<strong>existerande</strong> systemet som ska ingå i komponenten existerar i<br />
form <strong>av</strong> statiska lib-filer. Dessa filer använder sig <strong>av</strong> DLL-<br />
23
24<br />
Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
filer <strong>av</strong> en något äldre version, som nämndes ovan (se 4.1,<br />
Utvecklingsmiljö).<br />
4.3 Upptäckta problem under förstudien<br />
Under förstudien uppdagades ett antal problem. En del <strong>av</strong><br />
dessa löstes medan andra kan lösas längre fram i tiden, efter<br />
det att detta examensarbete <strong>av</strong>slutats.<br />
Problemen är:<br />
• Flyttning <strong>av</strong> projekt i Visual Studio mellan maskiner<br />
inte helt problemfritt.<br />
• Det <strong>existerande</strong> systemets uppbyggnad (statisk eller<br />
dynamisk länkning).<br />
• Datatyper som inte stöds i ASP [7] (VBScript och<br />
JScript [8]).<br />
Dessa förklaras kort nedan tillsammans med eventuella<br />
lösningar.<br />
4.3.1 Flyttning <strong>av</strong> projekt i Visual Studio<br />
Trots att all källkod versionshanteras med hjälp <strong>av</strong> Microsoft<br />
Visual SourceSafe 6.0 [9] kunde inte flytten <strong>av</strong><br />
källkodsprojektet <strong>genom</strong>föras på ett enkelt sätt. Det visade sig<br />
fattas en del kodbibliotek samt att vissa delar <strong>av</strong> det<br />
<strong>existerande</strong> systemet var tvunget att ändras.<br />
Lösning<br />
Det finns för närvarande ingen förklaring och därmed ej heller<br />
någon lösning på detta, men projektet fungerar i alla fall<br />
tillfredsställande tills vidare. Det kan bli aktuellt att senare<br />
försöka lösa dessa problem. Det kan också bli tvunget att göra<br />
detta. En sista utväg är att helt enkelt testa att flytta till en<br />
annan dator och flytta över arbetet till denna.<br />
4.3.2 Det <strong>existerande</strong> systemets uppbyggnad<br />
Som delarna i det <strong>existerande</strong> systemet är uppbyggt för<br />
tillfället så kan inte dynamisk länkning <strong>av</strong> dessa åstadkommas<br />
(se 3.1, Det <strong>existerande</strong> systemet). Delarna är uppbyggda på<br />
ett sådant sätt att de ingår i den exekverbara enheten. Detta<br />
medför att den komponent som ska utvecklas måste
Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
kompileras om varje gång en viktig uppdatering <strong>av</strong> någon del<br />
i det <strong>existerande</strong> systemet utförs. Detta är dock inget stort<br />
problem eftersom komponenten är <strong>av</strong>sedd att finnas i ett fåtal<br />
exemplar på centrala webbservrar. Det skulle vara ett <strong>av</strong>sevärt<br />
större problem om komponenten skulle behöva installeras på<br />
alla klientdatorer som ska använda denna.<br />
Lösning<br />
Det finns en lösning till detta problem, men det innebär<br />
mycket arbete. Det bör påpekas att uppdelningen och därmed<br />
länkningen såg annorlunda ut i tidigare versioner <strong>av</strong> det<br />
<strong>existerande</strong> systemet, men detta innebar en del problem. Man<br />
valde då att lösa dessa <strong>genom</strong> att statiskt länka in delarna i<br />
den exekverbara enheten. Man kan lösa problemet <strong>genom</strong> att<br />
man kapslar in de olika delarna i enheter som kan länkas<br />
dynamiskt. Man behöver alltså inte länka om hela systemet,<br />
utan bara kompilera om de delarna som ändrats. Det krävs<br />
dock en hel del arbete eftersom man då måste mappa varje<br />
metod och attribut i den <strong>existerande</strong> delen mot motsvarande<br />
metoder och attribut i inkapslingsbiblioteket. Man vet inte<br />
heller hur mycket arbete som krävs för att få de nu <strong>existerande</strong><br />
delarna att fungera tillsammans som skilda dynamiskt länkade<br />
enheter. Detta eftersom det förekommer ett stort antal<br />
kopplingar mellan dessa och sådana kopplingar kan ställa till<br />
en hel del problem.<br />
4.3.3 Datatyper i ASP<br />
Eftersom de scriptspråk som ingår i ASP inte är lika kraftfulla<br />
som ett vanligt programmeringsspråk så finns det en del<br />
undantag när det gäller framför allt datatyper. När det ska<br />
finnas kommunikation mellan COM och ASP så är det<br />
datatypen VARIANT (se appendix A.8.1, VARIANT) som är<br />
aktuell. Detta är en typ som kapslar in en underliggande<br />
struktur som i sin tur kan innehålla ett antal olika typer <strong>av</strong><br />
data. Typen VARIANT används för att den ser likadan ut utåt,<br />
oberoende <strong>av</strong> vilken datatyp som egentligen ingår i den. I<br />
VARIANT finns en typ som heter VT_ARRAY. Detta gör det<br />
möjligt att skicka arrayer <strong>genom</strong> komponentens gränssnitt.<br />
Denna typ är mycket aktuell i just den här komponenten som<br />
ska utvecklas. Det som ställer till problem här är att man<br />
måste använda en s.k. SafeArray på komponentsidan. Detta är<br />
relativt komplicerat, vilket gör att det bör undvikas.<br />
25
26<br />
Lösning<br />
Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
Det finns lösningar på detta problem, enligt nedan.<br />
1. Man kan låta komponenten skicka tillbaka HTML-kod i<br />
form <strong>av</strong> en sträng. Denna strängen kan sedan visas med<br />
hjälp <strong>av</strong> ASP eftersom strängar enkelt kan hanteras.<br />
2. Man kan låta komponenten skicka tillbaka en sträng<br />
formaterad på ett speciellt sätt. Strängen tas sedan om<br />
hand <strong>av</strong> scriptspråket på ASP-sidan som genererar<br />
önskad HTML-kod.<br />
3. Man kan låta komponenten skicka tillbaka en sträng i<br />
XML-format. Strängen används sedan <strong>genom</strong> att man<br />
specificeras ett s.k. stylesheet som presenterar<br />
informationen på önskat sätt.<br />
Den första lösningen är enkel men inte så flexibel. Skulle man<br />
vilja presentera informationen från komponenten på ett annat<br />
sätt kräver det att man skriver om koden i komponenten.<br />
Den andra lösningen är bättre men inte heller den så flexibel.<br />
För att ändra på hur informationen presenteras måste man<br />
ändra i scriptet.<br />
Den tredje lösningen är den som är effektivast och mest<br />
flexibel. Den kräver dock mer arbete och kunskap inom XML.<br />
Fördelen med XML är att det är speciellt <strong>av</strong>sett för att<br />
presentera mycket information på olika sätt. Det är även<br />
mycket flexibelt eftersom man kan ha flera olika stylesheets.<br />
Ett stylesheet är en definition på hur man vill presentera<br />
information i ett XML-dokument, som tillåter att man<br />
bestämmer färger, indentering etc. Man kan alltså göra ett<br />
antal stylesheets tillgängliga och låta respektive användare<br />
välja just sitt f<strong>av</strong>oritutseende bland dessa.<br />
4.4 Sammanfattning<br />
Som beskrivits ovan har ett antal val gjorts och vissa problem<br />
upptäckts. Baserat på dessa val kommer en<br />
prototyputvecklingsperiod påbörjas. Eftersom val <strong>av</strong><br />
komponentteknik är gjort så kommer inte några andra<br />
tekniker att testas inom detta område. Det som kommer att
Sammanfattning/slutsatser <strong>av</strong> förstudie<br />
testas med hjälp <strong>av</strong> prototyper är olika tekniker på klientsidan<br />
(se 4.3.2, Det <strong>existerande</strong> systemets uppbyggnad, och 4.3.3<br />
Datatyper i ASP). Nedan ges fyra förslag på sådana:<br />
1. Utveckla en prototyp med hjälp <strong>av</strong> ASP.<br />
2. Utveckla en prototyp med hjälp <strong>av</strong> ASP och XML.<br />
3. Utveckla en prototyp med hjälp <strong>av</strong> Microsoft Visual<br />
Studio.NET 7.0 [5].<br />
4. Utveckla en prototyp med hjälp <strong>av</strong> Microsoft Visual<br />
Studio.NET 7.0 [5] och XML.<br />
Möjlighet ett innebär att man sköter presentationen på<br />
komponentsidan och skickar tillbaka HTML-kod i form <strong>av</strong> en<br />
sträng.<br />
Möjlighet två innebär att man från komponenten skickar<br />
tillbaka informationen som en XML-formaterad sträng vilken<br />
presenteras med hjälp <strong>av</strong> ett stylesheet.<br />
Möjlighet tre innebär att man skapar en s.k. ”ASP.NET Web<br />
Application” i vilken man skriver programkod i Microsofts<br />
nya programspråk C# [5]. En sådan applikation kan sedan<br />
användas tillsammans med exempelvis Microsoft IIS. Med<br />
hjälp <strong>av</strong> C#-kod formaterar man strängen som skickas tillbaka<br />
från komponenten.<br />
Möjlighet fyra innebär att man utökar möjlighet tre med att<br />
låta XML ta hand om formateringen och presentationen <strong>av</strong><br />
informationen.<br />
Dessa fyra möjligheter planeras att användas för<br />
prototyputvecklingsperioden som följer.<br />
27
Prototyputveckling<br />
5 Prototyputveckling<br />
Det här <strong>av</strong>snittet beskriver arbetet under<br />
prototyputvecklingsperioden. Prototyperna var först meningen<br />
att testa vilka komponenttekniker som kunde passa för det<br />
aktuella systemet. Eftersom det <strong>existerande</strong> systemet ser ut<br />
som det gör idag så är det bara en teknik som är aktuell,<br />
nämligen COM/DCOM. Detta gör att de prototyper som<br />
utvecklas under den här perioden kommer att bli sådana som<br />
finns på klientsidan <strong>av</strong> systemet, alltså i webbgränssnittet. Där<br />
finns ett antal olika lösningar och förslag till sådana (se 4.4,<br />
Sammanfattning). Komponenten som kommer att användas<br />
för utvärdering <strong>av</strong> webbgränssnittet kommer att vara enkel.<br />
5.1 Webbgränssnittet<br />
På klientsidan, webbgränssnittet, finns ett antal olika<br />
lösningar att tillgå. Bland dessa finns framför allt tre områden<br />
att testa:<br />
1. ASP (Active Server Pages)<br />
Denna metod bygger på att man med hjälp <strong>av</strong><br />
scriptspråk, antingen VBScript eller JScript [8], bygger<br />
upp webbsidorna (se 5.1.1, ASP (Active Server<br />
Pages)).<br />
2. XML (eXtensible Markup Language)<br />
Detta är en standard som möjliggör att man strukturerar<br />
stora mängder data enligt en trädliknande struktur.<br />
Denna data kan sedan presenteras på olika sätt <strong>genom</strong><br />
att man använder stylesheets (se 5.1.2, XML<br />
(eXtensible Markup Language)).<br />
3. Visual Studio.NET 7.0 (C# Web Application)<br />
C# och Visual Studio.NET 7.0 [5] är Microsofts nya<br />
programspråk och utvecklingsverktyg. Verktyget<br />
möjliggör att man kan skapa kraftfulla<br />
webbapplikationer <strong>genom</strong> att skriva C#-kod (se 5.1.3,<br />
Visual Studio.NET 7.0 (C# Web Application)).<br />
Med hjälp <strong>av</strong> dessa tre tekniker ska ett antal prototyper<br />
utvecklas och utvärderas. Teknikerna beskrivs utförligare<br />
nedan och efter det kommer en kort utvärdering tillsammans<br />
med val <strong>av</strong> teknik för implementationen <strong>av</strong> den färdiga<br />
komponentens webbgränssnitt.<br />
29
30<br />
Prototyputveckling<br />
5.1.1 ASP (Active Server Pages)<br />
Active Server Pages är som namnet antyder ett scriptspråk<br />
som exekverar på servern i en webbapplikation. Det finns<br />
framförallt två språk som man använder för lösningar i<br />
Windowsmiljö. Dessa är VBScript [16] och JScript [15] och<br />
ingår i Microsofts infrastruktur för scriptspråk, Windows<br />
Script [8]. Med denna som grund kan man utveckla kraftfulla<br />
och flexibla webbapplikationer som innehåller bland annat<br />
databasaccess, användning <strong>av</strong> komponenter och andra<br />
programmoduler. Aktuell version för Windows Script är<br />
version 5.6, som finns tillgänglig för nedladdning på<br />
Windows Scripts hemsida [8]. I detta paket ingår VBScript<br />
5.6, JScript 5.6, Windows Script Components 5.6, Windows<br />
Script Host 5.6 och Windows Script Runtime Version 5.6.<br />
Det som gör ASP kraftfullt för utveckling <strong>av</strong> webbgränssnitt<br />
som använder sig <strong>av</strong> komponenter, COM eller DCOM, är<br />
möjligheten att skapa instanser <strong>av</strong> dessa objekt och anropa<br />
metoder från scripten. Det gör man <strong>genom</strong> metoden:<br />
Set so =<br />
Server.CreateObejct(servername.typename[,location])<br />
Detta ger en referens till komponentobjektet och man kan<br />
sedan anropa metoder i detta med hjälp <strong>av</strong> so, enligt:<br />
so.Metod(arg1,arg2,...)<br />
Genom detta kommer man åt funktionalitet i sin komponent.<br />
Se vidare 5.2.1, Prototyp 1 - ASP-version, för att se hur ASP<br />
användes i den första prototypen på webbgränssnitt.<br />
5.1.2 XML (eXtensible Markup Language)<br />
XML [11] kan ses som en utökning <strong>av</strong> HTML [18]. Det är en<br />
universell standard för att på ett strukturerat sätt presentera<br />
information på webbsidor. Språket utvecklades <strong>av</strong> XML<br />
Working Group, tidigare känd som SGML Editorial Review<br />
Board, bildad 1996 under överseende <strong>av</strong> W3C [10]. Ett <strong>av</strong><br />
målen med XML var att det skulle vara lätt att använda på<br />
Internet och att det skulle stödja en bred variation <strong>av</strong><br />
applikationer. Det som gör XML speciellt kraftfullt är<br />
möjligheten att definiera egna s.k. taggar i en datasträng som
Prototyputveckling<br />
man med hjälp <strong>av</strong> ett stylesheet kan formatera och visa på en<br />
webbsida. Det stylesheet som används då är XSL [19],<br />
tillsammans med transformationerna i XSLT, XSL<br />
Transformations. För exempel och hur XML och XSL<br />
användes för prototyputveckling se 5.2.2, Prototyp 2 - XMLversion.<br />
5.1.3 Visual Studio.NET 7.0 (C# Web Application)<br />
Visual Studio.NET 7.0 [20] är Microsofts nya<br />
utvecklingsmiljö som bland annat innehåller det nya<br />
programspråket C# (C Sharp). Med hjälp <strong>av</strong> detta språk kan<br />
man utveckla webbapplikationer som bygger på en ny version<br />
<strong>av</strong> ASP, ASP.NET. I utvecklingsmiljön ingår bland annat<br />
verktyg för att rita upp användargränssnittet för<br />
webbapplikationen. Detta gör det snabbt och lätt att skapa<br />
grundstommen för ett webbgränssnitt. Till detta gränssnitt kan<br />
man koppla funktionalitet, meddelandehanterare (Message<br />
Handlers) m.m.<br />
Det var från början tänkt att en prototyp skulle utvecklas med<br />
hjälp <strong>av</strong> Visual Studio.NET 7.0, men detta kommer inte att<br />
<strong>genom</strong>föras. Anledningen är att installationen <strong>av</strong> miljön<br />
skapade många problem med kompatibilitet och konfigurering<br />
<strong>av</strong> webbservern som ska användas i systemet, Microsoft<br />
Internet Information Service (IIS) även kallad Windows Web<br />
Services [21].<br />
5.2 Prototyperna<br />
Som nämndes ovan kommer ingen prototyp utvecklas med<br />
hjälp <strong>av</strong> Visual Studio.NET 7.0. Två andra prototyper har<br />
utvecklats, en ren ASP-version och en ASP/XML-version.<br />
Dessa två beskrivs nedan (se 5.2.1, Prototyp 1 - ASP-version,<br />
och 5.2.2, Prototyp 2 - XML-version).<br />
Ett mål med prototyperna som utvecklades var att utseendet<br />
på de webbgränssnitt som skapades skulle se så lika ut som<br />
möjligt. Detta för att kunna jämföra vilken teknik som passar<br />
bäst när det gäller framför allt programstruktur och<br />
vidareutvecklingsmöjligheter.<br />
Gemensamt för båda prototyperna är att de använder sig <strong>av</strong><br />
samma komponent (se 5.2.3, Komponentprototyperna). Detta<br />
visar att webbgränssnittet kan bytas ut till godtycklig teknik,<br />
31
32<br />
Prototyputveckling<br />
bara man vet formatet på den information som komponenten<br />
genererar. Komponenten är uppbyggd på ett sådant sätt att<br />
den returnerar informationen i form <strong>av</strong> strängar.<br />
Informationen i strängarna grupperas med hjälp <strong>av</strong> start- och<br />
sluttaggar. En fördel med att returnera strängar som innehåller<br />
mycket information är att man slipper anropa komponenten<br />
många gånger, vilket skulle belasta servern onödigt mycket.<br />
Att returnera strängar <strong>genom</strong> ett COM-gränssnitt är enkelt och<br />
relativt snabbt. Det är även enkelt att på komponentsidan<br />
bygga upp denna sträng. Det finns exempelvis inte något<br />
enkelt sätt att returnera arrayer <strong>genom</strong> ett gränssnitt. Dessa<br />
måste kapslas in i s.k. SafeArrays, vilka är komplicerade att<br />
använda (se 4.3.3, Datatyper i ASP).<br />
5.2.1 Prototyp 1 - ASP-version<br />
Prototypen byggdes så att all HTML-kod genererades på<br />
serversidan. I figuren nedan (Figur 2) åskådliggörs<br />
prototypens uppbyggnad.<br />
Webbserver<br />
ASP<br />
COM<br />
HTML<br />
Klient<br />
Figur 2. Prototyp 1 översikt<br />
VBScript används för att generera HTML-koden från servern.<br />
Detta scriptspråk visade sig vara kraftfullt när det gäller<br />
stränghantering och strängmanipulation. I VBScript ingår s.k.<br />
regular expressions, som kan användas för att söka efter<br />
mönster i strängar och ersätta dessa mönster med godtyckliga<br />
delsträngar eller tecken.
Prototyputveckling<br />
Med hjälp <strong>av</strong> detta filtrerades informationen från<br />
komponenten och den önskade delen presenterades med hjälp<br />
<strong>av</strong> HTML-kod. Nedan syns ett exempel på hur en webbsida<br />
från prototyp 1 ser ut.<br />
Figur 3. Exempel på webbsida genererad i prototyp 1.<br />
Så länge prototypen var relativt liten kunde man skapa<br />
välstrukturerad VBScript-kod, men ju större den blev desto<br />
svårare var det att hålla strukturen. Exempel på detta är den<br />
något komplicerade metoden att plocka fram relevant<br />
information ur strängen som komponenten genererade. Det<br />
finns inget enkelt sätt att hämta information från en tagg utan<br />
man var tvungen att använda sig <strong>av</strong> regular expressions på ett<br />
ganska ologiskt sätt. Sådana saker gör att VBScript-koden blir<br />
långsam och ogenerell. Visserligen kan datasträngen från<br />
komponenten ändra utseende, exempelvis <strong>genom</strong> att man<br />
lägger till nya taggar, men det kan inte behandlas på ett<br />
generellt sätt.<br />
33
34<br />
Prototyputveckling<br />
Versionen <strong>av</strong> prototypen som syns i figuren ovan (Figur 3) är<br />
inte speciellt invecklad och innehåller inte så mycket<br />
funktionalitet. Trots detta behövdes ca. 30 % fler rader<br />
programkod för att skapa den jämfört med versionen i XML,<br />
beskriven nedan (5.2.2 Prototyp 2 - XML-version). Detta trots<br />
att XML-versionen innehåller mer funktionalitet och att<br />
användargränssnittet är bättre. Här följer ett exempel på kod<br />
för att plocka ut information ur en tagg.<br />
Function GetData(tag, data)<br />
Set regEx = new RegExp<br />
regEx.Pattern = ".*"<br />
Set resultCollection = regEx.Execute(data)<br />
Set result = resultCollection.Item(0)<br />
result = Replace(result,"","")<br />
result = Replace(result,"","")<br />
GetData = result<br />
End Function<br />
Listning 1. Funktion för att plocka fram information från en tagg.<br />
I listningen ovan (Listning 1) ser vi att det krävs ett regular<br />
expression och två strängersättningar. Detta är lite oeffektivt<br />
och en kraftfullare metod för hantering <strong>av</strong> data vore önskvärt.<br />
Det första intrycket <strong>av</strong> ASP var att det var kraftfullt och enkelt<br />
att skapa webbsidor med, men detta visade sig vara fel i just<br />
den här tillämpningen. Programkoden blev lång och svår att<br />
hitta i. Om små ändringar i layouten på sidan skulle göras<br />
krävdes relativt stora ändringar i koden, samtidigt som detta<br />
kunde medföra att vissa specialfall inte fungerade. För en mer<br />
utförlig utvärdering och jämförelse med XML-versionen se<br />
nedan (5.3 Jämförelse/utvärdering <strong>av</strong> prototyperna).<br />
5.2.2 Prototyp 2 - XML-version<br />
XML-versionen gjordes på ett sådant sätt att utseendet på<br />
klientsidan skulle vara så likt ASP-versionen som möjligt.<br />
Den byggdes upp med hjälp <strong>av</strong> ett litet ASP-program som<br />
anropade komponenten och skickade vidare datasträngen från<br />
denna till ett XSL-dokument på klientsidan. Det medförde att<br />
all informationshantering flyttades från ASP till XML, vilket i<br />
sin tur medför att utseendet på webbsidan genereras på<br />
klientsidan. Klienten har en s.k. XML-parser som går i<strong>genom</strong><br />
XML-koden och använder sig <strong>av</strong> ett stylesheet, en XSL-fil,
Prototyputveckling<br />
för att generera utseendet på webbsidan. I figuren nedan<br />
(Figur 4) syns uppbyggnaden hos systemet för prototyp 2.<br />
Webbserver<br />
Webbserver<br />
ASP<br />
ASP<br />
COM<br />
COM<br />
Datasträng Datasträng (XML)<br />
(XML)<br />
Figur 4. Prototyp 2, XML-versionen, översikt<br />
I och med att XML användes flyttades en stor del <strong>av</strong> arbetet<br />
över från servern till klienten. Intressant med den här<br />
lösningen är att den XSL-fil som används för att definiera<br />
utseendet på webbsidan är helt fristående och kan bytas ut<br />
mot en annan. Man kan på sätt styra vilken information som<br />
skall synas och på vilket sätt den ska presenteras totalt<br />
oberoende <strong>av</strong> de andra delarna i systemet. Det enda som krävs<br />
är att man måste veta hur datasträngen är formaterad och vilka<br />
taggar som ingår i denna. Man behöver inte själv plocka ut<br />
informationen i taggarna eftersom dessa fungerar som<br />
matchningsmönster i XSL-filen för att använda olika mallar<br />
beroende på vilken tagg som parsern träffar på.<br />
Exempel på datasträng som komponenten genererar syns<br />
nedan:<br />
¢£§©¨£ ¥ ¦¢¢£ ¥ ¢£ §£¤¨ <br />
¡£¢£¤¦¥<br />
§©¨£©¢££¥ © ¦© © © ¡£¢£¤¢£©¦¢£ <br />
¢£<br />
¦ ¥ ¤¦££££¨£¤ <br />
¡£¢£¤¦¥ ¢£§©¨££©© ¥ ¤£¥ ©£££¨£¤ <br />
©¢£ ¦©£ ©¢£ <br />
¤¦££¤ ©¥ <br />
¨££©¨ ¨££©¨ <br />
¥ ¦¨£¤¡£¢£ <br />
¥ ¦¨£¤¡£¢£ <br />
¥ ¥ <br />
¢ ¢ <br />
££¦¡£¢£ £¦¡£¢£ <br />
XSL<br />
XSL<br />
”HTML”<br />
”HTML”<br />
Klient<br />
Klient<br />
35
36<br />
¢<br />
¢<br />
¤¦££¤ <br />
¡£¢£¤¦¥ ¢£§©¨£ <br />
Prototyputveckling<br />
¡£¢£¤¦¥ ¢£§©¨££©© ¥ ¡ £¤£¥ ©££¨£¤ <br />
©¢£ ¦©£ ©¢£ <br />
¤¦££¤ ©¥ <br />
¨££©¨ ¨££©¨ <br />
¥ ¦¨£¤¡£¢£ <br />
¥ ¦¨£¤¡£¢£ <br />
¤¦££¤ <br />
¡£¢£¤¦¥ ¢£§©¨£ <br />
¥ ¥ <br />
¢ ¢ <br />
££¦¡£¢£ £¦¡£¢£ <br />
¡£¢£¤¦¥ ¢£§©¨££©© ¥ £¤£¥ ©££¨£¤ <br />
©¢£ ¦©£ ©¢£ <br />
¤¦££¤ ©¥ <br />
¨££©¨ ¨££©¨ <br />
¥ ¦¨£¤¡£¢£ <br />
¥ ¦¨£¤¡£¢£ <br />
¤¦££¤ <br />
¡£¢£¤¦¥ ¢£§©¨£ <br />
¢<br />
¢<br />
¢<br />
¥ ¤¦££ <br />
¦<br />
¢<br />
¢£§©¨£ ¥ ¦¢ <br />
¡£¢£¤¦¥<br />
¥ ¥ <br />
¢ ¢ <br />
££¦¡£¢£ £¦¡£¢£ <br />
Listning 2. Datasträngen från komponenten<br />
Som syns i listningen ovan (Listning 2) är strängens<br />
formatering väldigt strukturerad och informationen är<br />
grupperad med hjälp <strong>av</strong> start- och sluttaggar. Detta är något<br />
som XML-parsern kräver.<br />
När det gäller XSL-filen så är det samma kr<strong>av</strong> på denna.<br />
Varje starttagg måste ha en sluttagg. Detta ger en väldigt bra<br />
struktur på koden och utökningar eller förändringar är lätt<br />
införda. Nedan syns ett exempel på en mall som tar hand om
Prototyputveckling<br />
all information i datasträngen inom taggen struktur:<br />
<br />
<br />
<br />
<br />
<br />
<br />
border-color:'#CCCCCC';border-style:'solid'<br />
<br />
<br />
<br />
border-top-width:'5px'<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
true<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
true<br />
<br />
<br />
<br />
border-top-width:'15px'<br />
<br />
<br />
<br />
<br />
37
38<br />
<br />
<br />
Prototyputveckling<br />
border-top-width:'5px'<br />
<br />
<br />
<br />
border-color:'#CCCCCC';border-style:'solid'<br />
<br />
<br />
<br />
<br />
<br />
<br />
varde<br />
<br />
<br />
<br />
text-align:right<br />
<br />
<br />
8<br />
<br />
<br />
<br />
<br />
Listning 3. XSL-kod för att ta hand om informationen i taggen .<br />
Som syns i listningen ovan (Listning 3) är XSL-koden lika<br />
strukturerad som datasträngen i listningen ovan denna<br />
(Listning 2). Listning 3 visar även användningen <strong>av</strong><br />
metoderna i språket. Metoderna är uppbyggda på samma sätt<br />
som elementen i ett XML-dokument, men dess taggnamn<br />
börjar med xsl:. Man kan alltså låta sitt stylesheet innehålla<br />
vilkorssatser (if-satser) och select-satser m.m. enligt ovan.<br />
Den mängd kod som behövs för att generera webbsidan i<br />
figuren nedan (Figur 5) är drygt 30 % kortare än den som<br />
behövdes för prototyp 1 med hjälp <strong>av</strong> ASP.
Prototyputveckling<br />
Figur 5. Webbsidan som genereras med hjälp <strong>av</strong> XML och XSL<br />
Viktigt att påpeka är att det finns ett antal s.k. namespaces för<br />
XSL. I en första version <strong>av</strong> prototyp 2 användes ett gammalt<br />
namespace, som visade sig ha en hel del begränsningar. Bland<br />
annat fanns inte möjlighet att skriva if-satser innehållande<br />
AND, OR eller NOT. Detta medförde djupt nästlade if-satser,<br />
vilket gjorde koden svårtarbetad. För att använda en nyare<br />
version <strong>av</strong> namespace krävdes en installation <strong>av</strong> tre stycken<br />
DLL-filer, som finns tillgängliga på Microsofts hemsida för<br />
XML [22]. Installationen uppdaterade XML-parsern för<br />
Internet Explorer, utan att för den delen göra den äldre<br />
versionen obrukbar.<br />
I samband med utvecklingen <strong>av</strong> prototyp 2 skapades även ett<br />
utkast på hur en tänkt resultatsida skulle kunna se ut.<br />
39
40<br />
Prototyputveckling<br />
Resultatet som ska presenteras här är bland annat<br />
arbetskostnader och materialkostnader för ett projekt. I<br />
figuren nedan (Figur 6) syns denna sida.<br />
Figur 6. Förslag på utseende för resultatsidan efter beräkningar<br />
på mallen.<br />
För denna sida ser datasträngen ut enligt nedan:<br />
¥ £¤¦¢¥ £©¡£¨£¤¦¥ <br />
¦ ¥ ¤¦££££¨£¤ <br />
¢£¢£¢£¥ © <br />
¢£¦¢£ ¤¢£ ¢£¦¢£ ¤¢£ <br />
¤¢£ <br />
¤¢£ <br />
©¢£ ¢¡£ ©¢ <br />
§©¨©©¤¦¥ ¡£¥ © <br />
¤£¦¥£§¡¦ ¢¨© £<br />
§©¨©©¤¦¥ ¡£¥ ©
¢<br />
¢<br />
¢<br />
Prototyputveckling<br />
¢£© £¥ ©£££¦¨£¤ <br />
£££ <br />
£££ <br />
£££ <br />
£££ <br />
¢<br />
¢<br />
¦¢£¤ ¥£ ¡ ¦¢¤ <br />
¤¢£ ¢¡£ ¤¢£ <br />
¦¢£¤ ¨ ¦¢£¤ <br />
¤¢£ ¢¡£ ¤¢£ <br />
¢<br />
¢£© £¥ ©££££¦¨£¤ <br />
<br />
¢£¢£¢£¥ © <br />
¦ ¥ ¤¦££ <br />
¦ ¥ ¤¦££££¨£¤ <br />
¢£¤¦§©¨¦¨ <br />
¢£¤¦§©¨¦¨£ ¨£¨£ <br />
¢£¦¢£ ¡ ¢£¦¢£ <br />
¨££©¨ ¡ ¨££©¨ <br />
§©¨©©¤¦¥ ¡£¥ © <br />
£ £ £¢¥¤§¦¡ £¢£ ¥¨ ¢©¤¦£¢<br />
§©¨©©¤¦¥ ¡£¥ © <br />
¨£¤¨££¤¨£©£¤ <br />
¦ £©¨£ © <br />
¨£¤¨££¤¨£©£¤ <br />
¢£¤¦§©¨¦¨£ ¨£¨£ <br />
¢<br />
¢<br />
¢<br />
¢£¤¦§©¨¦¨ <br />
¦ ¥ ¤¦££ <br />
¦ ¥ ¤¦££££¨£¤ <br />
¢¦¨£¤¦¥ ¢£ <br />
¢¦¨£¤¦¥ ¢£ ¨£ ¨¨£ <br />
¢£¦¢£ ¡ ¢£¦¢£ <br />
¨££©¨ ¨££©¨ <br />
§©¨©©¤¦¥ ¡£¥ © ¥ §©¨©©¤¦¥ ¡£¥ © <br />
¢¦¨£¤¦¥ ¢£ ¨£ ¨¨£ <br />
¢<br />
¢<br />
41
42<br />
¢<br />
¢¦¨£¤¦¥ ¢£ <br />
<br />
¦ ¥ ¤¦££ <br />
¦ ¥ ¤¦££££¨£¤ <br />
¡¤¦¥ © <br />
¦ ¥ ¤¦££ <br />
¦ ¥ ¤¦££££¨£¤ <br />
©©¢©£¨£¤ <br />
Prototyputveckling<br />
©©¢©£¨£ ¨£¨£ <br />
§©¨©©¤¦¥ ¡£¥ © ¦ ©¦ © ¡ §©¨©©¤¦¥ ¡£¥ £ <br />
£¤¦¥ ¡ ¢¡ £¤¦¥ <br />
©©¢©£¨£ ¨£¨£© <br />
¢<br />
¢<br />
¢<br />
©©¢©£¨£ ¨£¨£¦¦¦¢£ <br />
© ¤£<br />
©©¢©£¨£ ¨£¨£©¦¦¦¦¢£ <br />
©¢© ¢©£¨£ ¨£¨£ <br />
¥ ©£¤¥ ©¨ ¦ £© ¡ ¥ ©¤¦¥ ©¨ <br />
¢£©££¨£ ¨£¨£ <br />
¢£©£ ¡ ¢£©£ <br />
¨££©¨ ¥ ¨££©¨ <br />
¢£©££¨£ ¨£¨£ <br />
£¤¦¥ ©¦¡ ¡ £¤¦¥ <br />
§©¨£©¢££¥ © §©¨£©¢££¥ © <br />
©¢© ¢©£¨£ ¨£¨£ <br />
¢<br />
¢<br />
¢<br />
©¢© ¢©£¨£ ¨£¨£¦¦¦¢£ <br />
©¦¡ ¡<br />
©¢© ¢©£¨£ ¨£¨£¦¦¦¢£ <br />
©©¢©£¦¦¦¢£ ¢ ¢¡ ©©¢©£¦¦¢£ <br />
©©¢©£¨£¤ <br />
¦ ¥ ¤¦££ <br />
¦ ¥ ¤¦££££¨£¤ ¡ <br />
¥ £¨£¤ <br />
¥ £¨£ ¨£¨£ <br />
§©¨©©¤¦¥ ¡£¥ © <br />
£ ¡ ¨§ ¥¨£ ¡£ © ©¨£¦ <br />
§©¨©©¤¦¥ ¡£¥ © <br />
¢£¦¢£ ¦¥ ¢£¤ £©£¡ ¥¢ ¢£¦¢£ ¦¥ ¢¤ <br />
¥ £¨£ ¨£¨£
¥ £¨£¤ <br />
¦ ¥ ¤¦££ <br />
¥ £¤¦¢¥ £©¡£¨£¤¥ <br />
¢<br />
¢<br />
¢<br />
Prototyputveckling<br />
¦¦¢£ ¦¥ £©£ ©¢ ¦¦¢£ ¥ <br />
Listning 4. Datasträngen för resultatsidan.<br />
Dataträngarna för de andra sidorna i prototypen har liknande<br />
utseende, men med andra taggar och värden.<br />
För en jämförelse och utvärdering <strong>av</strong> den här prototypen, se<br />
nedan (5.3 Jämförelse/utvärdering <strong>av</strong> prototyperna).<br />
5.2.3 Komponentprototyperna<br />
Som nämnts ovan är gränssnittet mellan komponenten och<br />
webbgränssnittet enkelt. Metoderna i komponenten returnerar<br />
endast strängar, vilket stöds fullt ut <strong>av</strong> COM. Detta gör det<br />
enkelt att använda komponenten från VBScript. Det som<br />
kräver lite extra arbete är inte gränssnittet utåt utan hur man<br />
använder den <strong>existerande</strong> <strong>programvara</strong>n i sin komponent. Det<br />
som märktes under prototyputvecklingen var att man måste<br />
vara extra noggrann med minneshanteringen. På det sättet<br />
prototypkomponenten var implementerad var webbservern,<br />
Microsoft IIS [21], tvungen att startas om med jämna<br />
mellanrum, eftersom den blev alltmer minneskrävande ju fler<br />
gånger komponenten användes. Detta eftersom en ny instans<br />
<strong>av</strong> komponenten skapades för varje sida som skulle genereras<br />
och att de gamla instanserna inte frigjorde använt minne<br />
ordentligt.<br />
Det uppdagades även vissa problem med att skapa instanser<br />
<strong>av</strong> olika klasser i komponenten som ingick i Klipp. Speciellt<br />
var det objekt som ingick i det grafiska användargränssnittet<br />
för systemet. Detta kan möjligtvis lösas <strong>genom</strong> att låta<br />
referensen till komponenten ligga i sessionsobjektet för<br />
webbsidorna. Om man gör så behöver man endast skapa en<br />
instans <strong>av</strong> komponenten per webbsession, vilket även minskar<br />
minnesallokeringarna markant. Detta testades dock inte under<br />
prototyputvecklingen men kommer att utredas under<br />
implementationsfasen.<br />
43
44<br />
Prototyputveckling<br />
Under prototyputvecklingen implementerades endast en<br />
komponentprototyp. Denna testades tillsammans med<br />
webbgränssnittet. Under början <strong>av</strong> implementationsperioden<br />
testades dock att utveckla ytterligare en komponent som<br />
istället för att returnera endast strängar till ASP-scripten<br />
returnerade XML-objekt. Objekten är egentligen pekare till ett<br />
gränssnitt, MSXML::IXMLDOMDocument, som följer med<br />
den XML-parser som ingår i Internet Explorer. Den här<br />
komponenten visade sig hantera minnet på ett mycket bättre<br />
sätt än den tidigare versionen. Ett snabbt beslut togs att istället<br />
använda denna teknik. Det enda som skiljer versionen som<br />
returnerar strängar från den senare versionen är att man<br />
extraherar XML-datasträngen på klientsidan istället, med<br />
hjälp <strong>av</strong> ett ActiveX-objekt, Msxml2.DOMDocument, som<br />
man sedan låter XML-parsern formatera på samma sätt som<br />
tidigare. Detta ActiveX-objekt ingår i XML-parsern och<br />
medför ingen extra installation på klientsidan.<br />
5.3 Jämförelse/utvärdering <strong>av</strong> prototyperna<br />
För att kunna välja teknik för webbgränssnittet<br />
implementerades, som nämnts ovan, två prototyper. Dessa<br />
genererade identiska sidor, men XML-versionen har<br />
utvecklats längre än den rena ASP-versionen. Prototyperna<br />
använde sig <strong>av</strong> samma komponent. Den enda skillnaden här<br />
var att XML-versionen använde uppdaterade metoder i<br />
komponenten. Detta eftersom XML är mycket noggrant när<br />
det gäller start- och sluttaggar i datasträngen från<br />
komponenten, samt att en del attribut för vissa taggar<br />
kompletterades allteftersom XML-versionen<br />
vidareutvecklades. Det bör nämnas att all användning <strong>av</strong><br />
komponenten sköttes med hjälp <strong>av</strong> VBScript i ASP-filer även<br />
i XML-versionen.<br />
När det gäller för- och nackdelar med ASP-versionen så finns<br />
det egentligen inga fördelar med denna, som inte finns i<br />
XML-versionen. Däremot finns det en hel del nackdelar.<br />
Bland dessa nämns några nedan. Det finns givetvis nackdelar<br />
även med XML-versionen, men dessa är inte lika allvarliga.
Prototyputveckling<br />
Nackdelar med ASP-versionen<br />
• För att plocka ut önskade delar ur datasträngen krävdes<br />
regular expressions. Dessa kunde i vissa fall vara<br />
komplicerade.<br />
• För att dela upp datasträngen i mindre delar krävdes<br />
även här regular expressions och användningen <strong>av</strong><br />
dessa var inte helt logisk. Exempelvis var man tvungen<br />
att först plocka bort startaggar för att sedan dela<br />
strängen på sluttaggarna.<br />
• Scriptkoden blev ostrukturerad när sidorna blev alltmer<br />
komplicerade. Detta gjorde att små förändringar i<br />
utseendet kunde medföra stora förändringar i koden,<br />
som i sin tur kunde kräva att vissa specialfall var<br />
tvungna att behandlas.<br />
• Det var svårt att hitta fel i koden, eftersom det finns<br />
mycket begränsade möjligheter att debugga scripten.<br />
Man kan få webbservern att skriva ut meddelanden om<br />
var fel uppstår, men dessa är inte alltid lätta att förstå.<br />
Nackdelar med XML-versionen<br />
• Det finns ett stort antal versioner <strong>av</strong> XML-parsers och<br />
namespaces. Den version som användes i ett första<br />
utkast visade sig ha stora begränsningar. Den nya<br />
versionen kan ibland kräva installation <strong>av</strong> en ny version<br />
<strong>av</strong> parser.<br />
• Svårt att få script på klientsidan att fungera. Här<br />
användes J<strong>av</strong>aScript för att hantera händelser, såsom<br />
knapptryckningar. Dessa var tvungna att läggas till som<br />
kommentarer i det stylesheet som ska används <strong>av</strong> en<br />
XML-sida.<br />
Som nämnts ovan finns inte så många eller inga fördelar alls<br />
med ASP-versionen som inte finns i XML-versionen.<br />
Fördelarna med XML-versionen återfinns nedan.<br />
Fördelar med XML-versionen<br />
• Datasträngen från komponenten är välstrukturerad.<br />
• Datasträngen kan kompletteras med nya taggar och<br />
taggarna kan kompletteras med nya attribut utan att<br />
XML-sidans stylesheet behöver ändras. Man kan dock<br />
45
46<br />
Prototyputveckling<br />
inte plocka bort taggar fritt eftersom en del behandlas<br />
speciellt.<br />
• Koden i XSL-filen är mycket strukturerad och<br />
kompletteringar kan lätt införas.<br />
• Utseendet på sidan som genereras kan lätt förändras<br />
eftersom koden i XSL-filen är välstrukturerad.<br />
Sammanfattning<br />
Med detta som grund var inte valet <strong>av</strong> teknik för<br />
webbgränssnittet svårt. För att få ett generellt gränssnitt<br />
kommer XML användas tillsammans med olika stylesheets<br />
(XSL-filer). På komponentsidan är valet <strong>av</strong> teknik redan gjort,<br />
men här behövs en noggrannare minneshantering för att slippa<br />
problemen med en alltför minneskrävande webbserver.<br />
I XML-versionen infördes även inloggning för att använda<br />
systemet. Detta kan man lägga över på IIS, men det gör<br />
hanteringen <strong>av</strong> de olika användarna för systemet mer<br />
komplicerad. Test med att spara data på webbservern från<br />
klienten <strong>genom</strong>fördes också. Denna funktionalitet ska kopplas<br />
ihop med användarautencieringen för att varje användare ska<br />
få tillgång till en egen projektmapp på servern och på så sätt<br />
skydda sina filer från obehöriga. Att spara filer på servern är<br />
inte ett kr<strong>av</strong> på det slutliga systemet, men önskvärt eftersom<br />
man kanske vill justera sina värden vid ett senare tillfälle.<br />
Eftersom scriptspråk är relativt långsamt bör så mycket som<br />
möjligt <strong>av</strong> intelligensen och beräkningarna flyttas från<br />
scripten över till komponenten på serversidan. Exempel på<br />
detta är den användarautenciering som infördes i en <strong>av</strong><br />
prototyperna enligt ovan. Kontrollen <strong>av</strong> användarens identitet<br />
görs via ett script som hämtar sin information från en databas<br />
med hjälp <strong>av</strong> gränssnittet ADODB. Om denna funktionalitet<br />
flyttas över till komponenten kan ODBC användas istället och<br />
scripten renodlas till att vara enkla metodanrop in i<br />
komponenten.<br />
Ännu en förbättring är att låta komponenten använda sig <strong>av</strong><br />
olika XML-gränssnitt för att hantera datasträngarna som skall<br />
byggas upp. Detta har testats och komponenten blev då<br />
mycket mer minnessnål och koden mer strukturerad.<br />
Samtidigt testades att skicka färdiga XML-dokumentobjekt<br />
från komponenten till scripten som i sin tur skulle använda sig
Prototyputveckling<br />
<strong>av</strong> parsergränssnitt för att applicera olika stylesheets på dessa<br />
objekt. Resultatet <strong>av</strong> detta test var inte det önskade eftersom<br />
objekt inte kan skickas över gränssnitt som skall användas <strong>av</strong><br />
ASP. Det går dock att <strong>genom</strong>föra detta om komponenten<br />
används <strong>av</strong> en applikation. Detta beror på att ASP inte stöder<br />
s.k. typkonvertering (type casting) till skillnad från<br />
applikationer.<br />
Vad som inte upptäcktes under utvecklingen <strong>av</strong> den första<br />
prototypen med XML var att tillsammans med XML-parsern<br />
kom även ActiveX-objekt för XML. Dessa gjorde det möjligt<br />
att returnera pekare till olika gränssnitt, exempelvis<br />
MSXML::IXMLDOMDocument. Det är alltså möjligt att<br />
slippa undan att returnera rena strängar från komponenten till<br />
ASP-scripten. Det här kommer att införas under<br />
implementationen <strong>av</strong> exempelsystemet (6 Implementation <strong>av</strong><br />
exempelsystem).<br />
Det kan också behövas en noggrannare hantering <strong>av</strong><br />
webbsessioner. Man kan i IIS ställa in sessioners varaktighet.<br />
En session är aktiv så länge webbsidor skickas från servern<br />
till klienten eller en viss tid efter det att ingen begäran <strong>av</strong><br />
sidor kommer från klienten. Standardinställningen för detta är<br />
20 minuter.<br />
47
Implementation <strong>av</strong> exempelsystem<br />
6 Implementation <strong>av</strong> exempelsystem<br />
I detta kapitel beskrivs hur implementationen <strong>av</strong> ett<br />
exempelsystem fortlöpt. Som grund för implementationen<br />
ligger de erfarenheter och idéer som uppkom under<br />
prototyputveckligen. Det finns ingen formell<br />
kr<strong>av</strong>specifikation för systemet.<br />
6.1 Övergripande<br />
Enligt uppgiftsformuleringen för examensarbetet skall vissa<br />
delar <strong>av</strong> den funktionalitet som finns i det <strong>existerande</strong><br />
systemet göras tillgängligt via ett webbgränssnitt. En lagom<br />
del <strong>av</strong> denna funktionalitet kan vara att göra beräkningar på<br />
färdiga mallar möjliga. Detta beskrivs nedan (6.1.1<br />
Funktionalitet i systemet).<br />
6.1.1 Funktionalitet i systemet<br />
Som nämndes ovan finns det ett antal mallar i det <strong>existerande</strong><br />
systemet. Dessa mallar är till för att snabbt skapa en<br />
uppskattning <strong>av</strong> hur mycket material och arbete ett projekt<br />
kan kräva. Projekten kan vara allt från att riva hus till att lägga<br />
ner ett s.k. OPTO-nät i en innerstad/tätort. För alla dessa<br />
projekt finns olika mallar som i sin tur innehåller ett antal<br />
variabler. Exempel på sådana variabler är längd på kablar <strong>av</strong><br />
olika typer, grävning/schaktning i terrängen, omskyltning <strong>av</strong><br />
vägar under arbetet etc. Man kan sätta dessa variabler till<br />
olika värden och därefter utföra en beräkning <strong>av</strong><br />
arbetskostnad, materialåtgång, tidsåtgång m.m. för projektet.<br />
Det är denna funktionalitet som eftersöks i webbgränssnittet<br />
för exempelsystemet. Som nämndes i uppgiftsformuleringen<br />
är implementationen <strong>av</strong> exempelsystemet till för att belysa<br />
problem och lösningar på dessa under komponentifieringen <strong>av</strong><br />
ett <strong>existerande</strong> system. Det uppkommer dock fler problem<br />
beroende på begränsningar i scriptspråket som kommer att<br />
användas för att generera webbsidorna (se 4.3.3, Datatyper i<br />
ASP).<br />
Nedan listas önskvärd funktionalitet hos systemet:<br />
• Inloggning med identitetskontroll.<br />
• Listning <strong>av</strong> mallar som finns att tillgå.<br />
49
50<br />
Implementation <strong>av</strong> exempelsystem<br />
• Inmatning <strong>av</strong> värden på variabler i mallarna.<br />
• Möjlighet att spara sina inmatade värden för senare<br />
justering.<br />
• Beräkna material- och arbetskostnad, material- och<br />
tidsåtgång för tillgängliga entreprenörer.<br />
• Möjlighet att spara resultaten <strong>av</strong> beräkningar på<br />
mallarna.<br />
• Hantera sina sparade mallvärden och resultat.<br />
Exempelvis ta bort, öppna och uppdatera värdena.<br />
Med dessa punkter som grund designades systemet enligt<br />
nedan (se 6.4, Design).<br />
6.2 Arbetsgång under utvecklingen<br />
Arbetsgången under utvecklingen följer gängse regler för<br />
sådant. Processen är uppdelad i tre huvuddelar:<br />
1. Design<br />
2. Implementation<br />
3. Testning<br />
Denna process är iterativ vilket innebär att vissa delar<br />
designas följt <strong>av</strong> implementation och testning. Processen<br />
börjar sedan om med design för ytterligare delar i systemet.<br />
Detta ställer stora kr<strong>av</strong> på designen i de olika iterationerna<br />
eftersom man då måste göra denna så generell och<br />
strukturerad som möjligt för att ny, nästan godtycklig,<br />
funktionalitet ska kunna läggas till under senare iterationer.<br />
Innan designen kan påbörjas krävs givetvis en analysfas.<br />
Denna anses dock <strong>av</strong>slutad i och med att förstudieperioden<br />
<strong>av</strong>slutats, där analys i form <strong>av</strong> <strong>genom</strong>gång <strong>av</strong> det <strong>existerande</strong><br />
systemet samt ett antal olika val gjorts (se 3, Förstudie).<br />
Eftersom inga tidigare erfarenheter för design och<br />
implementation <strong>av</strong> COM/ASP-kopplingar finns, förutom de<br />
från implementationen <strong>av</strong> prototyperna, påbörjas arbetet med<br />
att söka information om detta, framför allt på Internet.
Användardatabas<br />
Användardatabas<br />
Implementation <strong>av</strong> exempelsystem<br />
6.3 Systemets uppbyggnad<br />
DOMDocument DOMDocument mm<br />
mm<br />
(gränssnitt)<br />
(gränssnitt)<br />
I figuren nedan (Figur 7) syns hur exempelsystemet är tänkt<br />
att se ut i stora drag. Detta ligger till grund för designen (se<br />
6.4, Design). För en utförlig beskrivning <strong>av</strong> Klipp se 4.3.2,<br />
Det <strong>existerande</strong> systemets uppbyggnad.<br />
KOMPONENT KOMPONENT<br />
WWW-server WWW-server WWW-server WWW server (IIS)<br />
(IIS)<br />
Komponenter<br />
Komponenter<br />
Klippdatabaser<br />
6.4 Design<br />
KLIPP<br />
KLIPP<br />
SERVER<br />
SERVER<br />
ASP<br />
ASP<br />
XML<br />
XML<br />
XSL<br />
XSL<br />
Figur 7. Exempelsystem översikt<br />
POST<br />
POST<br />
GET<br />
GET<br />
KLIENT<br />
KLIENT<br />
Webbläsare<br />
Webbläsare<br />
WWW-sidor<br />
WWW-sidor<br />
WWW-sidor<br />
WWW sidor<br />
I figuren ovan (Figur 7) syns hur systemet är tänkt att se ut i<br />
stora drag. Under designarbetet för komponenten är det<br />
speciellt viktigt att designa gränssnittet på ett bra sätt. Ett mål<br />
med detta är att hålla det så enkelt som möjligt. Eftersom<br />
komponenten är tänkt att användas från ASP-script kan den<br />
inte innehålla några s.k. callbacks, utan endast enkla<br />
metodanrop med in- och utparametrar <strong>av</strong> typen VARIANT (se<br />
4.3.3, Datatyper i ASP) eller pekare till gränssnitt som är<br />
kända i ASP-scripten. För att returnera en sådan pekare<br />
använder man IUnknown** (se A.3.1, Viktiga gränssnitt i<br />
COM/DCOM) från komponenten. För en detaljerad<br />
beskrivning <strong>av</strong> designen <strong>av</strong> komponenten se 6.4.1,<br />
Komponentdesign.<br />
51
52<br />
Implementation <strong>av</strong> exempelsystem<br />
På webbserversidan finns ett antal mål att uppnå. Bland annat<br />
ska ASP-scripten innehålla så lite intelligens som möjligt.<br />
Dessa ska i stort sett endast innehålla ett anrop till<br />
komponenten och sedan ska resultatet, en XML-sträng,<br />
skrivas ut till HTTP-strömmen mot klienten. För en<br />
detaljerade beskrivning <strong>av</strong> designen <strong>av</strong> webbgränssnittet se<br />
6.4.2, Design <strong>av</strong> webbgränssnittet.<br />
6.4.1 Komponentdesign<br />
Det viktigaste med designen <strong>av</strong> komponenten är att få ett<br />
enkelt och effektivt gränssnitt mot klienterna som ska<br />
använda denna. Som nämnts tidigare bör gränssnittet endast<br />
innehålla enkla metodanrop utan callbacks, eftersom<br />
komponenten ska användas från ett antal ASP-script. Efter att<br />
ha granskat den önskvärda funktionaliteten hos systemet togs<br />
beslutet att använda två olika komponenter:<br />
• WebbKlipp<br />
• AnvandarHanterare<br />
Anledningen till den separata komponenten för<br />
användarhanteringen, AnvandarHanterare, är att det i<br />
framtiden kan bli aktuellt att sköta detta på något annat sätt.<br />
WebbKlipp är den komponent som gör det <strong>existerande</strong><br />
systemet tillgängligt för webbgränssnittet <strong>genom</strong> att länka in<br />
de lib-filer som detta består <strong>av</strong> (se 3.1, Det <strong>existerande</strong><br />
systemet).<br />
När man designar komponenter måste man göra ett val <strong>av</strong><br />
vilken s.k. threading model (se A.6, Process/trådmodell<br />
(threading model)) komponenten ska använda. I det här fallet<br />
ska komponenterna användas från ASP-script och det<br />
rekommenderas då att man använder sig <strong>av</strong> s.k. apartment<br />
threading (se A.6.2, Apartment-threading). För att använda sig<br />
<strong>av</strong> denna modell används ett direktiv som läggs i filen<br />
stdafx.h enligt:<br />
#define _ATL_APARTMENT_THREADED<br />
Innan valet <strong>av</strong> threading model görs ska man välja vilken typ<br />
<strong>av</strong> server som ska användas. I det här fallet valdes en DLLserver<br />
(se A.2, Arkitekturen hos COM/DCOM) med stöd för<br />
MFC, Microsoft Foundation Class Library. Detta val gör man<br />
i ATL COM AppWizard i Visual C++.<br />
Ovanstående val gäller för båda komponenterna i systemet.
WebbKlipp<br />
Implementation <strong>av</strong> exempelsystem<br />
Den önskvärda funktionaliteten för systemet kräver sex<br />
gränssnittsmetoder:<br />
• HamtaMallNamnXML – Hämta en lista med namnen<br />
på alla tillgängliga mallar.<br />
• HamtaVariablerXML – Hämta en lista med variabler<br />
för en given mall.<br />
• BeraknaXML – Utför beräkningen.<br />
• SparaDataXML – Sparar mallar och resultat på servern.<br />
• HamtaSparadDataXML – Hämtar sparade mallar och<br />
resultat från servern.<br />
I tabellen nedan (Tabell 1) återges metoderna för gränssnittet.<br />
Där syns hur parametrarna definieras, med givna attribut.<br />
Dessa attribut kan vara:<br />
• in – parametern är en ren in-parameter.<br />
• out – parametern är en ut-parameter, till vilken man kan<br />
tilldela ett värde som kan användas <strong>av</strong> klienten.<br />
• retval – parametern används som resultat <strong>av</strong><br />
metodanropet.<br />
Gränssnittsmetoder<br />
HamtaMallNamnXML([out, retval] IUnknown** pUnkXMLDoc)<br />
Parametrar:<br />
pUnkXMLDoc En pekare till ett IXMLDOMDocument som innehåller<br />
listan med namnen på tillgängliga mallar.<br />
HamtaVariablerXML([in] long lMId, [in] long lMRef,<br />
[out, retval] IUnknown** pUnkXMLDoc)<br />
Parametrar:<br />
lMId Id för den mall vars variabler som skall hämtas.<br />
lMRef Referensnummer för den mall vars variabler som skall<br />
hämtas .<br />
pUnkXMLDoc En pekare till ett IXMLDOMDocument som innehåller<br />
listan med variabler för mallen.<br />
BeraknaXML([in] VARIANT* bstrInXMLDoc, [in] VARIANT* bstrProjNamn,<br />
[out, retval] IUnknown** pUnkXMLDoc)<br />
Parametrar:<br />
bstrInXMLDoc Sträng med värden på mallens variabler, som skall<br />
användas vid beräkningen. Skulle felaktiga värden matas<br />
53
54<br />
Implementation <strong>av</strong> exempelsystem<br />
in kommer Klipp att använda default-värden på dessa.<br />
bstrProjNamn Namnet på projektet (mallen).<br />
pUnkXMLDoc En pekare till ett IXMLDOMDocument som innehåller<br />
resultatet <strong>av</strong> beräkningen, arbetskostnader mm.<br />
SparaDataXML([in]VARIANT* bstrPath, [in] VARIANT* bstrFilNamn,<br />
[in] int nReplace, [in] VARIANT* bstrFilData,<br />
[out, retval] IUnknown** pUnkXMLDoc)<br />
Parametrar:<br />
bstrPath Sökvägen där filen ska sparas på servern.<br />
bstrFilNamn Namnet på filen.<br />
nReplace Ska <strong>existerande</strong> fil skrivas över?<br />
bstrFilData XML-strängen som ska skrivas till filen.<br />
pUnkXMLDoc En pekare till ett IXMLDOMDocument som innehåller<br />
information om hur sparningen gick.<br />
HamtaSparadData([in] VARIANT* bstrPath,<br />
[out, retval] IUnknown** pUnkXMLDoc)<br />
Parametrar:<br />
bstrPath Sökvägen inklusive filnamnet på filen som ska hämtas.<br />
pUnkXMLDoc En pekare till ett IXMLDOMDocument som innehåller<br />
XML-dokumentet i filen.<br />
Tabell 1. Gränssnittsmetoder för IMallHantering i WebbKlipp.<br />
Alla metoder i gränssnittet returnerar HRESULT, vilket är ett<br />
heltal som innehåller information om hur exekveringen <strong>av</strong> en<br />
metod gick. Om ett metodanrop misslyckades innehåller<br />
HRESULT information om vad som gick fel, annars<br />
innehåller det konstanten S_OK.<br />
För att hålla implementationsklassen för gränssnittet enkelt<br />
kommer den verkliga funktionaliteten i gränssnittet<br />
abstraheras till underliggande klasser. Implementationsklassen<br />
kommer att heta CMallHantering och innehålla metodanrop<br />
ner i en underliggande klass som heter CXMLBuilder. I<br />
CXMLBuilder byggs XML-objektet upp och returneras till<br />
implementationsklassen. För att utnyttja<br />
IXMLDOMDocument m.m. i CXMLBuilder behöver denna<br />
klass importera en DLL-fil, msxml.dll. Denna import kommer<br />
att göras i filen stdafx.h, vilket gör gränssnitten åtkomliga för<br />
alla klasser i komponenten. Även CMallHantering behöver<br />
msxml.dll för att kunna tilldela utparametrarna pekarvärden<br />
till IXMLDOMDocument.<br />
Utseendet på CXMLBuilder kommer att vara i stort sett<br />
samma som gränssnittets och även implementationsklassen
Implementation <strong>av</strong> exempelsystem<br />
CMallHanterings utseende. Därför återges ingen tabell för<br />
metoderna i denna klassen.<br />
För att göra även CXMLBuilder så ren som möjligt behövs en<br />
hjälpklass, som bland annat innehåller metoder för att skapa<br />
noder i XML-dokumentet samt sätta och hämta attribut för<br />
noderna. Klassen heter CDOMHelper och innehåller följande<br />
metoder:<br />
Metoder i CDOMHelper<br />
CDOMHelper()<br />
Parameterlös konstruktor Inga medlemsvariabler finns, därför behövs inga<br />
initieringar.<br />
~CDOMHelper()<br />
Destruktor.<br />
MSXML::IXMLDOMNode* CreateDOMNode(<br />
MSXML::IXMLDOMDocument* pDoc,<br />
int type, BSTR bstrName)<br />
Skapar en tom IXMLNode som kan läggas till i XML-dokumentet.<br />
Parametrar:<br />
pDoc Pekare till det XML-dokumentobjekt som ska innehålla<br />
den nya noden.<br />
type Konstant heltal som talar om vilken typ <strong>av</strong> nod som ska<br />
skapas. Oftast MSXML::NODE_ELEMENT.<br />
bstrName Namnet på noden som ska skapas.<br />
HRESULT SetAttribute(MSXML::IXMLDOMNode* pNode, int type,<br />
BSTR bName, VARIANT val)<br />
Sätter attribut med namn och typ till ett värde.<br />
Parametrar:<br />
pNode Noden som ska få ett attribut.<br />
type Attributets typ. Oftast VT_BSTR.<br />
bName Attributnamnet.<br />
val Attributets värde.<br />
BSTR GetAttribute(MSXML::IXMLDOMNode* pNode, BSTR attrName)<br />
Hämtar givet attribut för en nod. Returnerar detta som en BSTR.<br />
Parametrar:<br />
pNode Noden som innehåller attributet.<br />
attrName Namnet på attributet som ska hämtas.<br />
Tabell 2. Metoder för hjälpklassen CDOMHelper.<br />
55
56<br />
Klipp<br />
Klipp<br />
MB3Db.lib MB3Db.lib MB3Db. lib<br />
MB3PrDb.lib<br />
MB3PrDb.lib<br />
MB3PrDb. lib<br />
Implementation <strong>av</strong> exempelsystem<br />
Anledningen till att lägga ut metoderna i en separat klass är att<br />
dessa används ofta och i framtiden kan det tänkas behövas<br />
flera sådana.<br />
Ovan givna design ger ett utseende på WebbKlippkomponenten<br />
enligt figuren nedan (Figur 8).<br />
MB3Model.lib<br />
MB3Model.lib<br />
MB3Model. lib<br />
MB3Util.lib MB3Util.lib MB3Util. lib<br />
Figur 8. Struktur på WebbKlipp.IMallHantering.<br />
Efter implementationen kommer dokumentation genereras<br />
med hjälp <strong>av</strong> verktyget doxygen [23]. Dokumentationen<br />
kommer att finnas tillgänglig i HTML-format<br />
(QWERTYNISSE!!! Referens till detta).<br />
AnvandarHanterare<br />
IDispatch<br />
IDispatch<br />
CMallHantering<br />
CMallHantering<br />
CXMLBuilder<br />
CXMLBuilder<br />
CDOMHelper<br />
CDOMHelper<br />
msxml.dll msxml.dll msxml dll<br />
IMallHantering<br />
IMallHantering<br />
Eftersom detta är ett testsystem kommer inte<br />
användaridentifieringen var så <strong>av</strong>ancerad. Användarnamn och<br />
lösenord kontrolleras mot en databas, Access, och om dessa<br />
angivits korrekt används cookies för att ASP-scripten ska
Implementation <strong>av</strong> exempelsystem<br />
komma ihåg att användaren är korrekt inloggad. I databasen<br />
sparas även information om var på servern en användares<br />
sparade data ligger. Gränssnittet i den här komponenten,<br />
IAuth, innehåller endast en metod, LoggaIn enligt tabellen<br />
nedan.<br />
Gränssnittsmetoder<br />
LoggaIn([in] VARIANT* bstrSession, [in] VARIANT* bstrUserId,<br />
[in] VARIANT* bstrPassWd, [out] VARIANT* bstrPath,<br />
[out] VARIANT* bstrKey)<br />
Tar användarnamn och lösenord från ett inloggningsförsök, kontrollerar dessa mot<br />
databasen och lagrar användarens ”hembibliotek” och en nyckel i utparatmetrarna.<br />
Parametrar:<br />
bstrSession Förberett för att ta ett sessions-id och generera en nyckel<br />
för inloggningen.<br />
bstrUserId Användarnamnet.<br />
bstrPassWd Lösenordet.<br />
bstrPath Användarens hembibliotek.<br />
bstrKey Resultat från inloggningen.<br />
Tabell 3. Gränssnittsmetoder för IAuth i AvandarHanterare.<br />
Implementationsklassen för IAuth använder sig <strong>av</strong> en<br />
hjälpklass som hanterar all access till databasen. Hjälpklassen<br />
heter DBClass och ser ut enligt tabellerna nedan.<br />
Medlemsvariabler i DBClass<br />
BSTR m_bstrLoginRes<br />
Resultatet <strong>av</strong> ett inloggningsförsök.<br />
BSTR m_bstrProjPath<br />
Sökvägen till en användares ”hembibliotek” på servern om inloggningen var<br />
korrekt.<br />
Metoder i DBClass<br />
Tabell 4. Medlemsvariabler i DBClass.<br />
void LoggaIn(BSTR bstrSession, BSTR bstrUserId, BSTR bstrPassWd)<br />
Kontrollerar användarnamn och lösenord mot databasen och sparar sökväg och resultat<br />
i medlemsvariablerna.<br />
Parametrar:<br />
bstrSession ID för webbsessionen.<br />
bstrUserId Användarnamnet.<br />
bstrPassWd Lösenordet.<br />
57
58<br />
Implementation <strong>av</strong> exempelsystem<br />
Tabell 5. Metoder i klassen DBClass.<br />
Strukturen på komponenten och gränssnittet ser då ut enligt<br />
figuren nedan (Figur 9).<br />
CAuth<br />
CAuth<br />
IDispatch<br />
IDispatch<br />
CDbClass<br />
CDbClass<br />
sql.h sql.h sql.h sql .h sqlext.h sqlext.h sqlext.h sqlext .h<br />
Figur 9. Struktur på AnvandarHanterare.IAuth.<br />
Allmänna kommentarer<br />
Access Access (users (users (users ( users.mdb users.mdb users.mdb mdb)<br />
Denna design ger det ungefärliga utseendet på<br />
komponentsidan i figuren ovan (Figur 7).<br />
IAuth<br />
IAuth
Implementation <strong>av</strong> exempelsystem<br />
6.4.2 Design <strong>av</strong> webbgränssnittet<br />
Det finns ett flertal saker att tänka på när man ska skapa en<br />
design för ett webbgränssnitt. Detta märktes under<br />
prototyputvecklingen.<br />
Det största problemet då var att webbläsarna som användes<br />
för att utvärdera gränssnitten lagrade vissa sidor i sin cache.<br />
Detta medförde att de sidor som frekvent ändrar utseende inte<br />
alltid uppdaterades korrekt. Detta kan dock styras till viss del<br />
<strong>genom</strong> att konfigurera webbservern, Microsoft IIS [21]. Man<br />
kan tala om att sidorna i ett virtuellt bibliotek på servern blir<br />
ogiltiga direkt, vilket förhindrar att de hamnar i cachen.<br />
Internet Explorer ignorerar oftast sådana inställningar<br />
eftersom man kanske vill stega bakåt med hjälp <strong>av</strong> bakåtknappen<br />
i läsaren utan att ladda om sidan från servern. Detta<br />
ger problem när man vill använda stylesheets för att formatera<br />
XML-strängen eftersom dessa inte alltid används när en sida<br />
hämtas från cachen.<br />
En annan viktig detalj är att underlätta vidareutveckling <strong>av</strong><br />
gränssnittet. Detta gäller för all design inom alla områden,<br />
men är speciellt viktigt i ett webbgränssnitt eftersom detta<br />
uppdateras relativt ofta.<br />
I det här systemet valdes att strukturera upp olika filtyper i<br />
olika mappar på servern. I exempelsystemet finns framför allt<br />
fem typer:<br />
• ASP-script<br />
• XSL-filer (stylesheets)<br />
• HTML-filer<br />
• Användardatabas<br />
• Bilder<br />
Till dessa kommer även användarnas ”hembibliotek”, en<br />
blandat-mapp som innehåller förklarande presentationer i<br />
PowerPoint [24] samt en mapp som innehåller en uppdatering<br />
<strong>av</strong> XML-parsern. Detta resulterar i följande katalogstruktur på<br />
servern.<br />
59
60<br />
www-root www-root www-root www root<br />
WebbKlipp<br />
WebbKlipp<br />
Implementation <strong>av</strong> exempelsystem<br />
Figur 10. Katalogstruktur på webbservern<br />
Med denna katalogstrukturen är det lätt för de som ska<br />
vidareutveckla gränssnittet att n<strong>av</strong>igera och hitta rätt filer.<br />
Nedan beskrivs lite mer utförligt vad de olika katalogerna<br />
innehåller.<br />
www-root<br />
Roten för webbservern, vilket är den mapp man kommer till<br />
om man anger adressen http://datornamn_eller_ip/. Man kan<br />
på webbservern specificera virtuella bibliotek, i det här fallet<br />
är WebbKlipp ett sådant.<br />
WebbKlipp<br />
Detta är roten för webbgränssnittet och innehåller endast en fil<br />
med namnet login.html, samt biblioteken beskrivna nedan.<br />
ASP<br />
ASP<br />
ASP<br />
HTML<br />
HTML<br />
IMAGES<br />
IMAGES<br />
XSL<br />
XSL<br />
MSXML<br />
MSXML<br />
Mappen innehåller alla ASP-script. Dessa filer hör ofta ihop<br />
med stylesheet-filer i mappen XSL. Scripten ska vara så enkla<br />
som möjligt och i stort sett endast innehålla enkla metodanrop<br />
till komponenterna och sedan skriva ut det, <strong>av</strong> komponenten,<br />
genererade XML-dokumentet.<br />
ASP – INC<br />
INC<br />
INC<br />
*.asp<br />
*.asp<br />
*.htm/html<br />
*.htm/html<br />
*.inc *.inc *.inc *. inc<br />
*.jpg/gif *.jpg/gif *.jpg/gif *.jpg/ gif/bmp gif/bmp gif/bmp bmp mm.<br />
mm.<br />
*.xsl *.xsl *.xsl *. xsl<br />
xmlinst.exe xmlinst.exe xmlinst.exe xmlinst exe<br />
xmlinst.exe xmlinst.exe xmlinst.exe xmlinst exe.ReadMe<br />
exe.ReadMe<br />
exe.ReadMe ReadMe.txt ReadMe.txt ReadMe.txt txt<br />
db db<br />
users.mdb users.mdb users.mdb users mdb<br />
projects<br />
projects<br />
anv1<br />
anv1<br />
anv2<br />
anv2<br />
anv3<br />
anv3<br />
anv4<br />
anv4<br />
Innehåller inkluderingsfiler som används frekvent från ASPscripten.<br />
Exempel på sådant är ett script som kontrollerar om<br />
*.xml *.xml *.xml *. xml<br />
*.xml *.xml *.xml *. xml<br />
*.xml *.xml *.xml *. xml<br />
*.xml *.xml *.xml *. xml
Implementation <strong>av</strong> exempelsystem<br />
användaren är korrekt inloggad vid varje förfrågan till<br />
webbservern. Inloggningsinformationen ligger sparad i<br />
cookies.<br />
HTML<br />
Mappen innehåller de rena HTML-filerna som ingår i<br />
gränssnittet.<br />
IMAGES<br />
Katalogen innehåller alla bilder som ingår i gränssnittet.<br />
XSL<br />
Innehåller de stylesheets som genererar utseendet på sidorna<br />
utifrån uppsatta regler och XML-dokumenten från<br />
komponenten.<br />
MSXML<br />
Innehåller en uppdatering <strong>av</strong> XML-parsern som behövs för att<br />
sidorna ska genereras korrekt. Uppdateringen kommer från<br />
Microsoft.<br />
db, projects<br />
Katalogerna är till för användardatabasen (db) och<br />
användarnas hembibliotek (projects).<br />
6.5 Implementation<br />
Implementationen <strong>av</strong> systemet var relativt enkel eftersom<br />
prototyperna utvecklats tidigare. Större delen <strong>av</strong> källkoden,<br />
både på komponentsidan och på webbgränssnittssidan, kunde<br />
återanvändas, efter vissa justeringar och förbättringar. För lite<br />
mer ingående information om implementationen <strong>av</strong><br />
komponenterna och webbgränssnittet, se nedan (6.5.1,<br />
Komponenterna, och 6.5.2, Webbgränssnittet).<br />
6.5.1 Komponenterna<br />
Som nämnts ovan (se 6.4.1, Komponentdesign) skapades två<br />
komponenter, WebbKlipp och AnvandarHanterare. Man<br />
skulle kunna lagt dess funktionalitet i samma komponent med<br />
två olika gränssnitt, men användarautencieringen ska kunna<br />
bytas ut utan att stora förändringar behöver göras. Detta löser<br />
man enklast <strong>genom</strong> att lägga WebbKlipp- och<br />
61
62<br />
Implementation <strong>av</strong> exempelsystem<br />
AnvandarHanteraredelarna i två helt skilda komponenter.<br />
Eftersom prototyperna som utvecklats på komponentsidan är<br />
relativt <strong>genom</strong>arbetade så är grundutseendet ungefär samma<br />
på komponenterna i exempelsystemet. Designen <strong>av</strong> dessa är<br />
enkel och därför återges ingen detaljerad<br />
implementationsbeskrivning. För en detaljerad beskrivning <strong>av</strong><br />
klasserna som ingår finns dokumentation <strong>av</strong> dessa i form <strong>av</strong><br />
HTML-sidor genererade med hjälp <strong>av</strong> verktyget doxygen<br />
[23].<br />
För att få komponenterna att returnera en pekare till ett<br />
IXMLDOMDocument krävdes en ganska komplicerad<br />
konstruktion. Komponenterna kan bara använda sig <strong>av</strong><br />
VARIANT-strukturer för att transportera data <strong>genom</strong><br />
gränssnittet. I VARIANT ingår, som nämnts tidigare, de flesta<br />
grundläggande datatyperna, men även pekare till IUnknowngränssnittet.<br />
Eftersom alla gränssnitt ärver egenskaper och<br />
metoder från IUnknown kan detta gränssnitt användas för att<br />
transportera andra datastrukturer <strong>genom</strong> gränssnittet för en<br />
komponent. I fallet med IXMLDOMDocument <strong>genom</strong>fördes<br />
detta med hjälp <strong>av</strong> nedanstående konstruktion (Listning 5).<br />
STDMETHODIMP CMallHantering::HamtaMallNamnXML(IUnknown<br />
**pUnkXMLDoc)<br />
{<br />
}<br />
AFX_MANAGE_STATE(AfxGetStaticModuleState())<br />
// TODO: Add your implementation code here<br />
MSXML::IXMLDOMDocument *pDoc = NULL;<br />
CXMLBuilder xmlBuilder;<br />
pDoc = xmlBuilder.HamtaMallNamn();<br />
*pUnkXMLDoc = (IUnknown*)pDoc;<br />
return S_OK;<br />
Listning 5. Exempel för att transportera IXMLDOMDocument <strong>genom</strong><br />
gränssnittet.<br />
I listningen ovan (Listning 5) är tre detaljer markerade med<br />
fet stil. Det är de som gör det möjligt att skicka pekare till<br />
XML-objekt <strong>genom</strong> gränssnittet. pDoc byggs upp inne i
Implementation <strong>av</strong> exempelsystem<br />
hjälpklassen CXMLBuilder. Denna pekare typomvandlas<br />
sedan till en IUnknown-pekare, som kan skickas <strong>genom</strong><br />
gränssnittet till ASP-scriptet. Detta förfarande användes på<br />
alla ställen där ett XML-dokument skulle returneras till<br />
klienten.<br />
Egenskapen hos gränssnitten som används ovan kan utnyttjas<br />
till att transportera komplicerade objekt <strong>genom</strong> gränssnitten<br />
för komponenter. Man kan exempelvis konstruera egna<br />
gränssnitt och sedan typomvandla dessa till IUnknown innan<br />
man skickar dem till klienten. I det här systemet krävdes dock<br />
inte detta, men möjligheten är intressant och kraftfull.<br />
En detalj som fattades i prototyperna var felhantering. Detta<br />
lades till i komponenterna för exempelsystemet <strong>genom</strong> att ett<br />
XML-dokument innehållande felinformation genererades och<br />
skickades tillbaka till klienten om något inte skulle gå som<br />
planerat. På så sätt kan administratorn för systemet meddelas<br />
och felinformationen kan användas för att spåra felkällan.<br />
6.5.2 Webbgränssnittet<br />
Det största arbetet under implementationen <strong>av</strong><br />
webbgränssnittet bestod <strong>av</strong> definitionen <strong>av</strong> stylesheets, XSLfilerna,<br />
som genererar utseendet på gränssnittet. Även här<br />
saknades felhantering i prototyperna. Detta infördes i<br />
exempelsystemet <strong>genom</strong> att felinformationen från<br />
komponenten presenteras för användaren som i sin tur<br />
uppmanas att kontakta administratorn för systemet. Utöver<br />
detta lämnas felhanteringen till XML-parsern på klientsidan.<br />
Samma sak gäller för ASP-scripten. Dessa innehåller i stort<br />
sett ingen intelligens utan skriver endast ut det XMLdokument<br />
som genereras <strong>av</strong> komponenten. Webbservern ger<br />
användaren information om fel skulle uppkomma. Denna<br />
information är ingående och räcker gått och väl för att ge en<br />
tillfredsställande information om felets typ och orsak.<br />
Nedan ges ett exempel på ASP-script för att hämta och skriva<br />
ut det XML-dokument som genereras när man vill lista alla<br />
tillgängliga mallar i systemet (Listning 6).<br />
<br />
63
64<br />
Implementation <strong>av</strong> exempelsystem<br />
<br />
<br />
<br />
Set so = Server.CreateObject("WebbKlipp.MallHantering")<br />
Set xmlObj = Server.CreateObject("Msxml2.DOMDocument")<br />
xmlObj.load(so.HamtaMallNamnXML)<br />
Response.write(xmlObj.xml)<br />
Set so = Nothing<br />
Set xmlObj = Nothing<br />
End if<br />
Listning 6. Exempel på ett ASP-script, mall-lista.asp.<br />
Överst i listningen ovan (Listning 6) syns exempel på en<br />
inkludering <strong>av</strong> en fil från INC-katalogen i ASP-katalogen. Vi<br />
ser också hur ASP-scriptet innehåller en instans <strong>av</strong><br />
Msxml2.DOMDocument för att kunna hantera pekaren till ett<br />
IXMLDOMDocument genererat <strong>av</strong> komponenten,<br />
WebbKlipp.IMallHantering. Liknande konstruktioner kan<br />
användas i J<strong>av</strong>aScript på klientsidan för att hantera XMLdokumenten.<br />
Då används ett ActiveX-objekt,<br />
Microsoft.XMLDOM, som skapas enligt nedan:<br />
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");<br />
Detta objekt och det med liknande namn i ASP-scriptet ovan<br />
(Listning 6), Msxml2.DOMDocument, är <strong>av</strong> samma typ och<br />
används på samma sätt. Användandet <strong>av</strong> ActiveX-objektet<br />
enligt ovan löste ett problem som fanns hos prototyperna.<br />
Vissa operationer i webbgränssnittet kräver att man går in och<br />
ändrar data i XML-dokumentet. Man kan göra detta <strong>genom</strong> att<br />
ändra själva strängen som bygger upp dokumentet. Det ska<br />
dock inte vara tillåtet, men lyckades i de flesta fallen ändå.<br />
Vad som ibland hände var att man fick upp ett felmeddelande<br />
om att man försökte ändra ett skrivskyddat objekt. För att få<br />
bort detta beteende infördes istället ActiveX-objektet, enligt<br />
ovan, och man manipulerade då XML-dokumentet <strong>genom</strong> att<br />
jobba med XML-objektet istället för direkt på datasträngen.
Implementation <strong>av</strong> exempelsystem<br />
6.6 Resultat <strong>av</strong> design/implementationen<br />
Ett <strong>av</strong> flera mål med design- och implementationsarbete är ett<br />
stabilt, snabbt och effektivt system med lättläst och<br />
strukturerad källkod. Lyckas man med det är systemet lätt att<br />
underhålla och vidareutveckla. Dessa mål kan dock vara svåra<br />
att uppnå, framför allt i system med webbgränssnitt som<br />
innehåller script. Detta lyckades dock <strong>genom</strong> att hålla ASPscripten<br />
så korta som möjligt. Det största arbetet på<br />
webbgränssnittssidan var arbetet med stylesheets, XSLfilerna.<br />
Dessa kom att innehålla en hel del J<strong>av</strong>aScript för att<br />
bland annat uppdatera XML-dokumentet som visas på sidan<br />
innan detta ska skickas till servern för lagring. Det som ändå<br />
gör denna källkod strukturerad och lättarbetad är att XML i<br />
sig kräver struktur när det gäller start- och sluttaggar i koden.<br />
Om ren HTML skulle användas är det svårt att hålla<br />
strukturen eftersom HTML inte kräver sluttaggar för att ändå<br />
generera önskat resultat.<br />
6.7 Testning<br />
Om man skulle sätta ett formellt namn på testningsmetoden<br />
för komponenterna så ligger svartlåde-testning närmast till<br />
hands.<br />
Det har dock inte <strong>genom</strong>förts någon formell testning <strong>av</strong><br />
systemet, med användarfall, testprotokoll m.m. Däremot<br />
implementerades en testapplikation som använde sig <strong>av</strong><br />
komponenterna i systemet. Med hjälp <strong>av</strong> denna applikation<br />
kunde utresultaten från komponenterna kontrolleras så att<br />
dessa överensstämde med det förväntade. Genom att använda<br />
sig <strong>av</strong> en sådan applikation kunde minnesläckage m.m. lättare<br />
upptäckas eftersom man då kunde välja att köra i debugläge<br />
och även debugga in i komponenterna (DLL-filerna).<br />
Testningen var sådan att när en gränssnittsmetod<br />
implementerats så kollades denna med hjälp <strong>av</strong><br />
testapplikationen innan den testades via ASP-scriptet i<br />
webbgränssnittet. Det är mycket svårt att upptäcka fel i en<br />
komponent som används via ASP-script.<br />
För att testa systemet under normal användning<br />
demonstrerades det för ansvariga för det <strong>existerande</strong> systemet<br />
på Telia. Demonstrationen fungerade som en introduktion till<br />
användning <strong>av</strong> systemet och sedan gjordes det tillgängligt för<br />
65
66<br />
Implementation <strong>av</strong> exempelsystem<br />
användning inom Telia. För reaktioner och kommentarer från<br />
användare på Telia, se 7.2, Reaktioner från kund och<br />
testpersoner. Från denna testning kunde även webbserverns<br />
beteende kontrolleras under normal användning. Det bör dock<br />
nämnas att systemet i framtiden kan komma att användas <strong>av</strong><br />
fler personer än de som just nu fått tillgång till det.<br />
Testanvändningen är tänkt att ge en fingervisning om<br />
systemets prestanda och stabilitet.
Utvärdering och förbättringsförslag<br />
7 Utvärdering och förbättringsförslag<br />
I det här kapitlet återfinns reaktioner och tankar från kunden<br />
samt en del förslag på förbättringar. Bland annat har DCOM<br />
studerats noggrannare än tidigare under arbetet och ett par<br />
förslag på systemuppbyggnad med DCOM och ActiveX som<br />
komponentteknik har tagits fram.<br />
7.1 Utvärdering<br />
Utvärderingen <strong>av</strong> exempelsystemet bör koncentreras på att<br />
utvärdera själva komponenten och inte det webbgränssnitt<br />
som implementerats. Visserligen är det så att en bra<br />
fungerande komponent i det här fallet ger en bra grund för att<br />
kunna utveckla ett <strong>av</strong>ancerat, användarvänligt och effektivt<br />
webbgränssnitt.<br />
7.1.1 Genomförande<br />
Att utvärdera en komponent <strong>av</strong> den här typen, som utvecklats<br />
för exempelsystemet, kräver en applikation eller motsvarande<br />
som använder sig <strong>av</strong> komponenten. Denna applikation kan<br />
exempelvis simulera många simultana användare <strong>av</strong><br />
komponenten. Om komponenten ska användas via en<br />
webbserver kan man använda sig <strong>av</strong> en s.k. Web Stress Tool.<br />
Ett sådant verktyg gör det möjligt att simulera många<br />
användare på en webbserver. Man kan efter en körning få en<br />
rapport innehållande svarstider och minneåtgång för<br />
serverapplikationen m.m. Ännu intressantare blir det om man<br />
under en körning bevakar hur webbservern reagerar på hög<br />
belastning.<br />
Verktyget som användes för att belasta komponenten via<br />
webbgränssnittet var Microsoft Web Application Stress Tool<br />
1.1 [26], som kan laddas ned gratis från hemsidan.<br />
Testanvändare har även fått använda systemet och resultatet<br />
blev förslag på förbättringar. Då uppkommer dock problemet<br />
med att utvärderingen inte koncentreras på själva<br />
komponenten utan mer på webbgränssnittet. Resultaten från<br />
detta återges i 7.2, Reaktioner från kund och testpersoner.<br />
67
68<br />
7.1.2 Resultat<br />
Utvärdering och förbättringsförslag<br />
Resultaten från Microsoft Web Application Stress Tool 1.1<br />
[26] granskades för att se hur användningen <strong>av</strong> komponenten<br />
via webbgränssnittet gått. Alla delar <strong>av</strong> komponenten kunde<br />
inte testas eftersom dessa kräver inmatning <strong>av</strong> värden i vissa<br />
fält, vilket inte stöds <strong>av</strong> utvärderingsverktyget.<br />
Verktyget konfigurerades till att simulera 100 simultana<br />
användare under tre minuter. Under körningen lyckades alla<br />
accesser till komponenten och mängden data från<br />
komponenten stämde överens med det förväntade. 100<br />
simultana användare är en hög belastning under de<br />
förhållande som komponenten är <strong>av</strong>sedd att användas.<br />
Minnesåtgången för komponenten var nästan konstant, efter<br />
det att alla 100 användarna börjat använda den. Vissa<br />
variationer fanns dock, men det uppkom aldrig någon onormal<br />
stegring under körningen. Detta tolkas som ett lyckat resultat.<br />
Här följer en kort tolkning <strong>av</strong> ett resultat för en körning:<br />
Under de tre minuter körningen varade gjordes 141 anrop till<br />
komponenten, alla lyckades. Detta innebär att ca 1<br />
anrop/sekund vilket är ett bra resultat för användning via ett<br />
ASP-script. Under körningen genererades 1 808,49 kB data<br />
(ca 1,77 MB) <strong>av</strong> komponenten där varje anrop generade<br />
12 893 B (ca 12,59 kB). Av detta kan slutsatsen dras att vid<br />
100 simultana användare kan ungefär en webbsida per<br />
sekund genereras. Detta är ett lyckat resultat.<br />
7.2 Reaktioner från kund och testpersoner<br />
Som nämnts ovan gjordes en demonstration <strong>av</strong> systemet för<br />
ansvariga för det <strong>existerande</strong> systemet, Klipp. Reaktionerna<br />
efter demonstrationen var positiva och WebbKlipp gjordes<br />
tillgängligt för anställda på Telia. Det som krävs för att<br />
använda det är ett användarkonto, som kan läggas till och tas<br />
bort med hjälp <strong>av</strong> en administrationsdel för systemet.<br />
Från de som testar systemet kommer reaktioner och förslag på<br />
förbättringar. Det som inte gör detta idealt är att en<br />
slutanvändare inriktar sig i huvudsak på hur<br />
användargränssnittet ser ut, i det här fallet webbgränssnittet.<br />
Det är inte detta som är huvuduppgiften i examensarbetet.<br />
Detta medför att för att skaffa sig en bra bild över hur
Utvärdering och förbättringsförslag<br />
systemet fungerar måste loggfiler, minneshanteringsstatistik<br />
m.m. användas och tolkas. Hittills har data från dessa källor<br />
inte innehållit några överraskningar och framför allt inga<br />
systemkrascher. Testpersonerna på Telia har dock inte<br />
belastat systemet så tungt som det i framtiden kan tänkas göra,<br />
men en viss tendens syns i alla fall.<br />
För att nämna några <strong>av</strong> de förbättringsförslag som kommit<br />
från Telia så rör det sig framför allt om det synliga grafiska<br />
gränssnittet och då att detta ska se enhetligt ut med resten <strong>av</strong><br />
Telias webbsidor. För förbättringsförslag som rör själva<br />
komponenterna, se 7.3, Förbättringsförslag.<br />
7.3 Förbättringsförslag<br />
Det som är intressant för examensarbetet är själva<br />
komponentifieringen, inte användbarheten hos<br />
användargränssnitt. Det är svårt att få testen, <strong>genom</strong> bara<br />
normal användning <strong>av</strong> systemet, att <strong>av</strong>spegla komponenternas<br />
effektivitet. Trots detta har ett antal förslag på annan<br />
systemuppbyggnad tagits fram. I dessa förslag har DCOM<br />
introducerats eftersom vissa beräkningar och databasaccesser<br />
kan vara betungande för webbservermaskinen. Det kan alltså<br />
vara önskvärt att lägga ut dessa på andra maskiner i nätverket.<br />
I <strong>av</strong>snittet 7.4, Alternativa tekniker (DCOM), nedan ges två<br />
förslag på sådana lösningar. Tekniken DCOM har testats<br />
<strong>genom</strong> att en klient och en server utvecklats, dock inte enligt<br />
förslagen i <strong>av</strong>snittet nedan. Klienten är en fristående<br />
applikation och servern existerar endast på en maskin, alltså<br />
ett system utan en s.k. referral component (se A.7,<br />
Arbetsfördelningsmodeller för DCOM). Det som är verkligen<br />
intressant med det här systemet är att DCOM-servern<br />
använder sig <strong>av</strong> komponenten som används från<br />
webbgränssnittet för att kommunicera med det befintliga<br />
systemet. DCOM-servern fungerar alltså som en<br />
inkapslingskomponent för att möjliggöra kommunikation<br />
enligt DCOM.<br />
För mer ingående beskrivning <strong>av</strong> DCOM-systemen, se 7.4,<br />
Alternativa tekniker (DCOM), nedan.<br />
69
70<br />
Utvärdering och förbättringsförslag<br />
7.4 Alternativa tekniker (DCOM)<br />
I 7.1.2, Resultat, syns att systemet utan större problem klarar<br />
<strong>av</strong> 100 simultana användare, i alla fall om inte de tyngsta<br />
operationerna utförs. Exempel på tung operation är när själva<br />
beräkningen <strong>av</strong> material- och arbetskostnader m.m. ska<br />
utföras. Det som ligger närmast till hands för att lätta på<br />
bördan för komponenten under denna operation, är att man<br />
skapar ett antal distribuerade komponenter som ligger på<br />
andra maskiner (se A.7, Arbetsfördelningsmodeller för<br />
DCOM). Nackdelen med denna lösning är att man behöver<br />
installera komponenterna på varje maskin som ska verka som<br />
beräkningsdator. I fallet med komponentifiering <strong>av</strong> Klipp<br />
medför detta också att de databaser som ingår i systemet<br />
måste ligga på alla dessa maskiner. Det introducerar alltså<br />
problem när uppdateringar <strong>av</strong> systemet sker.<br />
I appendix A, COM/DCOM, återfinns mer information om<br />
DCOM. Detta appendix innehåller visserligen mest<br />
information om COM, men DCOM är uppbyggt på ungefär<br />
samma sätt och stöder i stort sett samma funktionalitet.<br />
7.4.1 Exempelsystemet (DCOM-version)<br />
Målet med detta system är att distribuera tunga operationer.<br />
Det är inte aktuellt som exempelsystemet ser ut idag, men om<br />
ytterligare funktionalitet skulle läggas till kan belastningen på<br />
webbservermaskinen bli för stor. Om systemet skulle bli<br />
distribuerat är det inte så känsligt för ökat användarantal.<br />
Eftersom systemet är tänkt att användas via ett webbgränssnitt<br />
är det inte lätt att gruppera användarna. Alltså passar<br />
dynamisk arbetsfördelning bäst. På webbserverdatorn behövs<br />
en Referral Component för att fördela arbetet. Den här<br />
komponenten väljer den, för tillfället, minst belastade servern<br />
och returnerar en uppkoppling till klienten. Klienten i det här<br />
fallet är det ASP-script som innehåller metodanrop till en<br />
komponent. ASP-scriptet aktiveras på vanligt sätt <strong>genom</strong> att<br />
en webbsida begärs från webbservern. De distribuerade<br />
serverkomponenterna fungerar på i stort samma sätt som<br />
COM-versionen beskriven ovan (se 6, Implementation <strong>av</strong><br />
exempelsystem). Varje serverkomponent har tillgång till det<br />
<strong>existerande</strong> systemet <strong>genom</strong> inlänkade lib-filer samt<br />
databaserna. Databaserna måste, som nämnts tidigare, finnas
Klient 1<br />
Klient 2<br />
Utvärdering och förbättringsförslag<br />
på varje server. Systemet får då utseendet enligt nedan (Figur<br />
11).<br />
WWW-server<br />
1 2<br />
5<br />
RefKomp<br />
ASP<br />
XSL<br />
Figur 11. Exempelsystemet (DCOM-version)<br />
Här syns hur ett metodanrop kan gå till:<br />
x antal komponenter på<br />
x antal maskiner<br />
1. En användare begär en webbsida (ASP-script) från<br />
webbservern.<br />
2. Scriptet kontaktar en Referral Component, RefKomp,<br />
som kontrollerar vilken <strong>av</strong> maskinerna med<br />
serverkomponenter som är minst belastad.<br />
3. RefKomp hittar en server, belastad till 25%, och skapar<br />
en koppling mot denna.<br />
4. RefKomp returnerar kopplingen till klienten (ASPscriptet<br />
i det här fallet) som anropar en metod i<br />
serverkomponenten.<br />
5. Scriptet returnerar ett formaterat resultat till webbsidan.<br />
Efter det att RefKomp returnerat kopplingen mot servern till<br />
klienten är den helt frikopplad och direkt beredd att ta emot<br />
fler förfrågningar. Man <strong>av</strong>lastar alltså webbservermaskinen<br />
markant.<br />
3<br />
4<br />
45%<br />
25%<br />
60%<br />
85%<br />
50%<br />
Klipp<br />
Klipp<br />
Klipp<br />
Klipp<br />
Klipp<br />
71
72<br />
Utvärdering och förbättringsförslag<br />
Viktigt att ta med i beräkningarna om man ska distribuera ett<br />
system eller ej är hur nätverket, i vilket systemet ska<br />
användas, ser ut. Är detta långsamt eller om webbservern inte<br />
kan ligga nära komponentservermaskinerna kan det hända att<br />
systemet blir långsamt och tungarbetat. Det blir också en stor<br />
ökning i trafiken över nätverket vilket kan göra systemet<br />
olämpligt att distribuera.<br />
7.4.2 Exempelsystem (ActiveX/DCOM)<br />
Ytterligare en variant på uppbyggnaden <strong>av</strong> exempelsystemet<br />
har tagits fram. I den här versionen har det rena<br />
webbgränssnittet bytts ut mot en ActiveX-komponent som<br />
aktiveras via en webbsida. Fördelen med det här är att ett<br />
mycket mer <strong>av</strong>ancerat användargränssnitt kan användas,<br />
vilket faktiskt kan byggas upp så att det blir identiskt med det<br />
<strong>existerande</strong> systemets utseende. Det krävs dock att varje klient<br />
som ska använda systemet installerar denna ActiveXkomponent<br />
lokalt. Detta kan dock skötas med automatik<br />
<strong>genom</strong> att komponenten laddas ned från servern om denna<br />
inte är installerad och registrerad på klienten. Det enda<br />
ActiveX-komponenten kommer att innehålla är då ett grafiskt<br />
användargränssnitt och anrop till en distribuerad komponent<br />
som använder sig <strong>av</strong> det <strong>existerande</strong> systemet på samma sätt<br />
som i det implementerade exempelsystemet (se 6,<br />
Implementation <strong>av</strong> exempelsystem).<br />
Med detta som grund kommer ActiveX/DCOM-versionen att<br />
se ut enligt nedan (Figur 12).
Klient 1<br />
ActiveX<br />
Klient 2<br />
ActiveX<br />
Utvärdering och förbättringsförslag<br />
1<br />
2<br />
3<br />
5<br />
WWW-server<br />
HTML<br />
ActiveX<br />
RefKomp<br />
Figur 12. ActiveX/DCOM-version <strong>av</strong> exempelsytemet<br />
Scenariot ser ut som följer:<br />
1. En klient går in på adressen för en webbsida.<br />
x antal komponenter på<br />
x antal maskiner<br />
2. Webbsidan innehåller ett ActiveX-objekt som<br />
aktiveras. Komponenten laddas ned och installeras om<br />
inte klienten redan gjort detta.<br />
3. Vid aktiveringen <strong>av</strong> ActiveX-komponenten kontaktar<br />
denna en distribuerad Referral Component, RefKomp.<br />
4. RefKomp skapar en uppkoppling mot den distribuerade<br />
komponenten som är minst belastad och returnerar<br />
denna koppling till ActiveX-objektet på klienten.<br />
5. Klienten och den distribuerade komponenten utbyter<br />
tjänster med varandra.<br />
Valet <strong>av</strong> distribuerad komponent utförs alltså <strong>av</strong> RefKomp<br />
och valet baseras på olika kriterier, i det här fallet minst<br />
arbetsbelastning på de distribuerade komponenterna.<br />
Klipp<br />
Klipp<br />
Klipp<br />
Klipp<br />
Klipp<br />
Vissa tester har <strong>genom</strong>förts för att få nedladdning och<br />
installation <strong>av</strong> ActiveX-komponenten att fungera på ett bra<br />
sätt. För att få det att fungera ordentligt krävs dock att man får<br />
4<br />
45%<br />
35%<br />
60%<br />
25%<br />
50%<br />
73
74<br />
Utvärdering och förbättringsförslag<br />
sin komponent signerad, vilket innebär att den måste uppfylla<br />
vissa kr<strong>av</strong>.
Utvärdering och förbättringsförslag<br />
8 Slutsatser, resultat och erfarenheter<br />
I det här <strong>av</strong>snittet presenteras en del <strong>av</strong> de slutsatser som kan<br />
dras <strong>av</strong> arbetet, framför allt när det gäller förutsättningarna för<br />
ett system att kunna användas som komponent. En del <strong>av</strong> de<br />
erfarenheter och lärdomar som erhållits under arbetes gång<br />
presenteras också.<br />
8.1 Slutsatser/förutsättningar<br />
Innan man sätter sig ner och börjar implementera en<br />
komponent för ett <strong>existerande</strong> system, bör detta gås i<strong>genom</strong><br />
ordentligt. Man bör under <strong>genom</strong>gången titta på hur ett<br />
eventuellt grafiskt användargränssnitt används i systemet och<br />
hur systemet är uppbyggt. Det system, Klipp (se 3.1 Det<br />
<strong>existerande</strong> systemet), som använts under arbetet visade sig ha<br />
en gynnsam uppdelning och när väl utvecklingsmiljö och<br />
server konfigurerats korrekt flöt arbetet med design och<br />
implementation <strong>av</strong> exempelsystemet på relativt smidigt.<br />
Under examensarbetes senare del har ytterligare ett system<br />
gåtts i<strong>genom</strong> för att se om en komponentifiering <strong>av</strong> detta vore<br />
möjligt. Detta är inte beskrivet i rapporten tidigare, men det<br />
kan nämnas att dess uppbyggnad inte var alls lika gynnsam.<br />
Det förekom mängder <strong>av</strong> kopplingar mellan systemets<br />
moduler och användargränssnittet var inte lika väl <strong>av</strong>skilt från<br />
den verkliga intelligensen i systemet. På vissa ställen krävdes<br />
dubblering <strong>av</strong> kod och en stor mängd kontroller för att<br />
komponenten skulle kunna användas från ett webbgränssnitt.<br />
Skulle ett annat medium användas för att öka <strong>tillgänglighet</strong>en<br />
krävs andra konstruktioner.<br />
De egenskaper som är speciellt viktiga för att en<br />
komponentifiering <strong>av</strong> ett system ska vara enkel att utföra är:<br />
• En bra struktur med väl <strong>av</strong>skilda gränser mellan<br />
underliggande intelligens och användargränssnitt.<br />
• Bra minneshantering.<br />
• Korrekt hantering <strong>av</strong> databaser, om sådana kopplingar<br />
finns.<br />
• Väldokumenterad kod.<br />
• Få och enkla kopplingar mellan delarna i systemet.<br />
75
76<br />
Utvärdering och förbättringsförslag<br />
Klipp visade sig ha alla dessa egenskaper, medan det andra<br />
systemet inte helt uppfyllde första och sista punkten.<br />
8.2 Resultat<br />
Som säkert framkommit <strong>av</strong> tidigare delar i rapporten lyckades<br />
komponentifieringen bra. En komponent utvecklades med ett<br />
tillhörande webbgränssnitt. Systemet gjordes tillgängligt för<br />
användning hos Telia AB och reaktionerna från dessa<br />
användare var positiva. Den version som finns tillgänglig just<br />
nu är lite längre utvecklad än den som presenteras i rapporten,<br />
framför allt när det gäller webbgränssnittet.<br />
Verkligen intressant att notera är att komponenten även<br />
användes i en systemuppbyggnad som bygger på DCOM.<br />
Detta visar att om en väl utvecklad och <strong>genom</strong>tänkt<br />
komponent skapas, kan denna användas i flera olika<br />
tillämpningar. Detta är ett <strong>av</strong> de viktigaste målen med<br />
komponentifieringar. Kan komponenten användas i flera olika<br />
tillämpningar ökar <strong>tillgänglighet</strong>en hos det ursprungliga<br />
systemet markant.<br />
Om man tittar på de uppsatta målen för examensarbetet (se<br />
2.2 Målbeskrivning) så har dessa uppnåtts till någonstans<br />
mellan nivå fyra och fem. Exempelsystemet är implementerat<br />
och kan tas i bruk, men finns för tillfället bara tillgängligt för<br />
ansvariga hos Telia AB. Det finns alltså i skarp miljö, men<br />
används inte annat än för att visa att möjligheten till<br />
komponentifiering och <strong>tillgänglighet</strong> via ett webbgränssnitt<br />
finns. Detta kommer säkert att ändras i framtiden och<br />
systemet, visserligen antagligen i mer utvecklad version,<br />
kommer att användas istället för det <strong>existerande</strong> stationära<br />
systemet.<br />
Nedan ges en återkoppling till uppsatta mål (se 2.2<br />
Målbeskrivning):<br />
1. Undersökning och utredning <strong>av</strong> tillgängliga tekniker.<br />
Genomförd.<br />
2. Delar <strong>av</strong> systemet simulerat. Uppnått <strong>genom</strong><br />
prototyputveckling.<br />
3. Några delar <strong>av</strong> systemet implementerat som <strong>av</strong>sett.<br />
Uppnått.
Utvärdering och förbättringsförslag<br />
4. De flesta delarna <strong>av</strong> systemet fungerar som <strong>av</strong>sett.<br />
Uppnått.<br />
5. Ett demonstrationsexemplar i skarp miljö. Uppnått med<br />
restriktionen att systemet är tillgängligt endast för vissa<br />
ansvariga på Telia AB enligt ovan.<br />
8.3 Erfarenheter<br />
En mängd erfarenheter har erhållits under examensarbetets<br />
gång. Framför allt inom Windowsprogrammering och då<br />
speciellt inom området COM och DCOM. Personligen tycker<br />
jag att DCOM-delen var intressant.<br />
Innan arbetet påbörjades hade jag använt Microsoft Visual<br />
Studio 6.0, men inte alls på samma nivå som nu krävdes.<br />
Utvecklingsmiljöns interaktion med resten <strong>av</strong><br />
operativsystemet är imponerande, speciellt möjligheten att<br />
debugga komponenter och DLL-filer. En bra debugger gör<br />
utvecklingsarbetet mycket lättare och resultaten blir<br />
följaktligen bättre.<br />
Även webbutvecklingen har varit intressant och lärorik. Här<br />
har ASP, XML, XSL, XSLT och IIS varit grunden. Mina<br />
erfarenheter inom dessa områden har tidigare varit<br />
begränsade. Under arbetets gång har dock kunnandet inom<br />
dessa områden ökat.<br />
Det som gjort arbetet relativt enkelt är, förutom strukturen på<br />
det ursprungliga systemet, att mängden dokumentation som<br />
finns att tillgå inom alla dessa områden är stor. Microsoft<br />
Developer Network (MSDN) har använts flitigt, både via<br />
Internet och via den varianten som installeras lokalt på<br />
utvecklingsdatorn. Om inte önskad information funnits där<br />
har diverser nyhetsgrupper använts, framför allt via Google<br />
Diskussionsgrupper [27].<br />
77
9 Begreppslista<br />
Begreppslista<br />
Följande begrepp och förkortningar används i rapporten.<br />
Dessa är speciellt viktiga för förståelsen <strong>av</strong> texten.<br />
ADO/ADODB – ActiveX Data Objects (DataBase)<br />
Programmeringsmodell från Microsoft som innehåller olika<br />
typer <strong>av</strong> gränssnitt för datahantering. Exempel på ett sådant<br />
gränssnitt är just ADODB.<br />
COM – Component Object Model<br />
Microsofts standard för komponenter [6]. Modellen bygger på<br />
ett s.k. Object Remote Procedure Call (se ORPC) lager <strong>genom</strong><br />
vilket metodanrop kan göras. Viktigaste delen i modellen är<br />
IDL-filen.<br />
CSS - Cascading Stylesheets<br />
En stylesheet-standard som kan användas tillsammans med<br />
HTML.<br />
DCOM – Distributed Component Object Model<br />
En utökning <strong>av</strong> COM som möjliggör distribuerade<br />
komponenter.<br />
DCOMCNFG – DCOM Config<br />
Ett verktyg, som ingår i Microsoft Windows [13], för att<br />
konfigurera komponenter (COM/DCOM) när det gäller<br />
rättigheter att skapa och använda dessa.<br />
Debug<br />
Översatt till svenska betyder debug <strong>av</strong>lusa. Vad man gör är att<br />
man med hjälp <strong>av</strong> en s.k. debugger kontrollerar koden <strong>genom</strong><br />
att köra sitt program kodrad för kodrad. Oftast finns en<br />
debugger tillgänglig i utvecklingsmiljön.<br />
Debugger<br />
Verktyget som används för att steg för steg köra sitt program<br />
och hitta fel. Följer oftast med utvecklingsmiljön.<br />
DLL – Dynamic Linked Library<br />
Dessa bibliotek är vanligt förekommande i operativsystem<br />
som ingår i Microsoft Windows-familjen. Biblioteken är<br />
kompilerade och länkade enheter som innehåller<br />
funktionalitet. De kan importeras och användas <strong>av</strong> andra<br />
program. Man kan länka in biblioteken statiskt eller<br />
dynamisk.<br />
79
80<br />
Begreppslista<br />
Dynamisk länkning<br />
Färdiga programbibliotek länkas inte in i den exekverbara<br />
enheten. Denna innehåller istället referenser till biblioteken.<br />
Biblioteken finns alltså inte inuti den exekverbara enheten,<br />
utan laddas vid behov.<br />
GUID – Globally Unique Identifier<br />
Ett identitetsnummer som används för att exempelvis<br />
identifiera gränssnitt (IID) för olika komponenter. Detta<br />
nummer genereras <strong>genom</strong> att väga in diverse faktorer vilket<br />
medför att två gränssnitt inte kan få samma identitet.<br />
HTML – Hyper Text Markup Language<br />
Standard för att presentera webbsidor i en webbläsare.<br />
Innehåller ett antal s.k. taggar (tags) för att presentera<br />
informationen som man vill. Det finns flera versioner <strong>av</strong><br />
HTML, standardiserade <strong>av</strong> W3C [10].<br />
IDL – Interface Definition Language<br />
Det gränssnitt som finns tillgängligt för att kommunicera med<br />
komponenten specificeras med hjälp <strong>av</strong> detta språk.<br />
Definitionen kan ses som ett kontrakt mellan klienten<br />
(användaren) och serveren (komponenten) och återfinns i en<br />
s.k. IDL-fil.<br />
IID – Interface Identifier<br />
En instans <strong>av</strong> GUID som används för att identifiera ett<br />
gränssnitt (interface).<br />
Interface<br />
Gränssnitt <strong>genom</strong> vilket kommunikation mellan exempelvis<br />
komponenter kan ske.<br />
J<strong>av</strong>aRMI – J<strong>av</strong>a Remote Method Invocation<br />
J<strong>av</strong>astandard för distribuerade objekt och komponenter.<br />
J<strong>av</strong>aScript<br />
Scriptspråk för att hantera händelser på en webbsida på<br />
klientsidan.<br />
Klipp<br />
Det <strong>existerande</strong> systemet som används för att exemplifiera<br />
problemen och lösningar vid komponentifiering (se 3.1, Det<br />
<strong>existerande</strong> systemet).<br />
Kompilator<br />
Program som används för att översätta den textbaserade<br />
programkoden till maskinkod. Kompilatorn kontrollerar även
Begreppslista<br />
syntaxen hos källkoden och ger felmeddelanden om fel skulle<br />
förekomma i denna. Varje kompilator är konstruerad för att ta<br />
hand om ett visst programspråk.<br />
Kompilera<br />
Översätta den textbaserade källkoden till maskinkod i form <strong>av</strong><br />
s.k. objektfil. Om fel skulle förekomma i källkoden kommer<br />
inte denna att översättas till maskinkod.<br />
Länkningsprogram, länkare<br />
Program för att sätta samman de olika delarna, objektfilerna,<br />
till ett körbart program. Länkaren producerar en enda enhet,<br />
en exekverbar fil eller ett bibliotek.<br />
MFC – Microsoft Foundation Class Library<br />
Bibliotek som består <strong>av</strong> klasser, globala funktioner, globala<br />
variabler och macro. Med dessa kan man utföra diverse<br />
operationer i Windows, exempelvis rita fönster, effektivt<br />
hantera strängar m.m.<br />
Objektfil<br />
Den fil som kompilatorn producerar. Filen innehåller<br />
översättningen <strong>av</strong> källkoden i form <strong>av</strong> objektkod.<br />
ODBC – Open DataBase Connectivity<br />
Programmeringsgränssnitt för att göra det möjligt för<br />
applikationer att koppla upp sig mot databaser, o<strong>av</strong>sett format,<br />
och ställa frågor (queries) till dessa.<br />
RPC – Remote Procedure Call<br />
Metodanrop från en process till en annan. Den anropande<br />
processen verkar som klient, medan den andra verkar som<br />
server.<br />
Runtime<br />
Den tid under vilken exekvering <strong>av</strong> en komponent eller<br />
program varar.<br />
SCM – Service Control Manager<br />
SCM fungerar som en central träffpunkt för alla<br />
aktiveringsförfrågningar <strong>av</strong> komponenter. Varje maskin som<br />
stöder COM har en egen lokal SCM som skickar vidare<br />
förfrågningar till SCM på andra maskiner om det är frågan om<br />
distribuerade komponenter.<br />
Statisk länkning<br />
Färdiga moduler, bibliotek, länkas in i programmet vid<br />
81
82<br />
Begreppslista<br />
länkningstillfället. Biblioteket blir då inkapslat i den<br />
exekverbara enheten.<br />
Stylesheet<br />
En fil bestående <strong>av</strong> en definition på hur informationen i ett<br />
webbdokument ska presenteras. Man kan styra färger,<br />
indentering mm. Används ofta tillsammans med XML, då<br />
koden ska följa XSL-standard. Det finns även en standard<br />
som heter CSS.<br />
XML – eXtensible Markup Language<br />
En standard utvecklad <strong>av</strong> The World Wide Web Consortium<br />
(W3C) [10]. XML [11] möjliggör att presentera information<br />
på ett bestämt sätt <strong>genom</strong> att man specificerar ett slags träd<br />
där man bygger upp sina datatyper. Man presenterar sedan<br />
informationen med hjälp <strong>av</strong> ett speciellt språk tillsammans<br />
med ett s.k. stylesheet.<br />
XSL - eXtensible Stylesheet Language<br />
En stylesheet-standard som används tillsammans med XML.<br />
Se även CSS.
10 Referenser<br />
Referenser<br />
Följande informationskällor har använts under<br />
examensarbetet. I de flesta fallen är det materialet hämtat från<br />
Internet och därför anges ett extra datum i referensen. Detta<br />
datum anger då referensen fortfarande var tillgänglig. I några<br />
referenser har viss information utelämnats då denna inte finns<br />
tillgänglig.<br />
Referenserna har följande format:<br />
[nummer] Författare (datum). Titel. Institution. Länk, datum<br />
senast tillgänglig.<br />
[1] Microsoft Developer Network Home, MSDN Home.<br />
http://www.msdn.microsoft.com/, 2001-09-10.<br />
[2] The Object Management Group, OMG.<br />
http://www.omg.com/, 2001-09-10.<br />
[3] P. Emerald Chung, Yennun Huang, Shalini Yajnik m.fl.<br />
DCOM and CORBA Side by Side, Step By Step, and<br />
Layer by Layer. Bell Laboratories, Lucent<br />
Technologies, Murray Hill, New Jersey m.fl.<br />
http://www.cs.wustl.edu/~schmidt/submit/Paper.html,<br />
2001-09-10.<br />
[4] Sun Microsystems. http://www.sun.com/, 2001-09-10.<br />
[5] Microsoft Visual Studio Home Page.<br />
http://msdn.microsoft.com/vstudio/, 2001-09-14.<br />
[6] The Component Object Model.<br />
http://msdn.microsoft.com/library/default.asp?url=/library/enus/com/com_757w.asp,<br />
2001-09-27.<br />
[7] Active Server Pages (General).<br />
http://msdn.microsoft.com/library/default.asp?url=/nhp/defaul<br />
t.asp?contentid=28000522, 2001-09-14.<br />
[8] Microsoft Scripting Technologies.<br />
http://msdn.microsoft.com/scripting/, 2001-09-14.<br />
[9] Microsoft Visual SourceSafe Home Page.<br />
http://msdn.microsoft.com/ssafe/default.asp, 2001-09-14.<br />
[10] The World Wide Web Consortium (W3C).<br />
http://www.w3.org/, 2001-09-14.<br />
83
84<br />
Referenser<br />
[11] Extensible Markup Language (XML).<br />
http://www.w3.org/XML/, 2001-09-14.<br />
[12] Microsoft Corporate Web Site.<br />
http://www.microsoft.com/ms.htm, 2001-09-23.<br />
[13] Windows Family Home Page.<br />
http://www.microsoft.com/windows/default.asp, 2001-09-<br />
23.<br />
[14] Don Box (juni 1999). Essential COM.<br />
[15] JScript.<br />
http://msdn.microsoft.com/library/default.asp?url=/library/enus/script56/html/js56jsoriJScript.asp,<br />
2001-10-08.<br />
[16] VBScript.<br />
http://msdn.microsoft.com/library/default.asp?url=/library/enus/script56/html/vtoriVBScript.asp,<br />
2001-10-08.<br />
[17] Internet Explorer Home Page.<br />
http://www.microsoft.com/windows/ie/default.asp, 2001-10-<br />
08.<br />
[18] HTML Home Page. http://www.w3.org/MarkUp/, 2001-<br />
10-08.<br />
[19] The Extensible Stylesheet Language (XSL).<br />
http://www.w3.org/Style/XSL/, 2001-10-08.<br />
[20] Microsoft Visual Studio: Microsoft Visual Studio<br />
.NET – Next Generation.<br />
http://msdn.microsoft.com/vstudio/nextgen/default.asp, 2001-<br />
10-08.<br />
[21] Windows Web Services (IIS).<br />
http://microsoft.com/technet/treeview/default.asp?url=/technet<br />
/prodtechnol/iis/Default.asp, 2001-10-08.<br />
[22] XML Core.<br />
http://msdn.microsoft.com/library/default.asp?url=/nhp/Defau<br />
lt.asp?contentid=28000438, 2001-10-08.<br />
[23] Doxygen homepage.<br />
http://www.stack.nl/~dimitri/doxygen/, 2001-11-01.<br />
[24] Microsoft Office – PowerPoint Home Page.<br />
http://www.microsoft.com/office/powerpoint/default.htm,<br />
2001-11-02.<br />
[25] Dr Richard Grimes (1998). Professional ATL COM<br />
Programming.
Referenser<br />
[26] Microsoft Web Application Stress Tool.<br />
http://webtool.rte.microsoft.com/, 2001-11-13.<br />
[27] Google Diskussionsgrupper. http://groups.google.com/,<br />
2002-03-28.<br />
85
A. COM/DCOM<br />
Appendix A – COM/DCOM<br />
Avsnittet innehåller en kort introduktion till COM/DCOM.<br />
Framför allt handlar det om COM eftersom DCOM endast är<br />
en utökning med COM som grund.<br />
Informationen är tagen ur [14] och [25].<br />
Det bör påpekas att de komponenter som skapades under<br />
komponentifieringen <strong>av</strong> Klipp var enkla på så sätt att<br />
komponenten existerade s.k. in-process. För mer information<br />
om detta se A.2, Arkitekturen hos COM/DCOM.<br />
A.1 Allmänt om COM/DCOM<br />
COM står för ”Component Object Model” och är alltså en<br />
modell för hur programkomponenter ska se ut. DCOM står för<br />
”Distributed Component Object Model”. Framför allt<br />
utvecklas komponenterna i programspråken C++ och Visual<br />
Basic, men man kan även använda andra språk som klarar <strong>av</strong><br />
att bygga upp pekarstrukturer och att anropa funktioner med<br />
hjälp <strong>av</strong> pekare. Modellen är därför helt plattformsoberoende.<br />
Klient<br />
Klient<br />
Figur 13. Generell bild över COM. Server är själva komponenten.<br />
Det finns speciellt en viktig del i modellen och det är det<br />
gränssnitt (interface) som ligger som grund för varje<br />
komponent. Gränssnittet är det som syns utåt och möjliggör<br />
användning <strong>av</strong> den funktionalitet som finns inuti<br />
komponenten. När det gäller gränssnitt så finns det ett antal<br />
speciellt viktiga sådana (se A.3, Gränssnittet, och A.3.1,<br />
Viktiga gränssnitt i COM/DCOM):<br />
• IUnknown<br />
Gränssnitt<br />
Gränssnitt<br />
Gränssnittspekare<br />
Gränssnittspekare<br />
Server Server<br />
Klass<br />
Klass<br />
Metod Metod 1<br />
1<br />
Metod Metod 2<br />
2<br />
...<br />
...<br />
87
88<br />
Appendix A – COM/DCOM<br />
• IClassFactory<br />
• IDispatch<br />
Nedan, se A.3, Gränssnittet, ges en beskrivning <strong>av</strong> gränssnitt<br />
enligt COM/DCOM.<br />
A.2 Arkitekturen hos COM/DCOM<br />
Som nämndes ovan skapades komponenter som var s.k. inprocess-komponenter<br />
under komponentifieringen <strong>av</strong> Klipp.<br />
Dessa existerade i form <strong>av</strong> DLL-servrar, i DLL-filer. Man kan<br />
även skapa komponenter som fungerar som fristående EXEservrar,<br />
kallade local eller out-of-process servers.<br />
Arkitekturen hos dessa två skiljer sig åt <strong>genom</strong> att in-processservrar<br />
kan användas direkt utan att något annat än DLL-filen<br />
för servern finns tillgänglig. Detta ser då ut som i figuren<br />
ovan (Figur 13). För en out-of-process server ser arkitekturen<br />
ut enligt figuren nedan (Figur 14).<br />
Client<br />
Client<br />
COM<br />
COM<br />
COM<br />
COM<br />
Klient Client<br />
Client<br />
COM<br />
COM<br />
COM<br />
COM<br />
Klient Komponent<br />
Komponent Component<br />
Component<br />
run-time run-time run-time run-time run-time run-time run time<br />
run-time run-time run-time run-time run-time run-time run time<br />
Security<br />
Security<br />
Provider<br />
Provider<br />
LPC<br />
LPC<br />
DCE DCE RPC<br />
RPC<br />
Security<br />
Security<br />
Provider<br />
Provider<br />
LPC<br />
LPC<br />
DCE DCE RPC<br />
RPC<br />
Figur 14. COM-arkitekturen för out-of-process server.<br />
I figuren ovan syns servern i den högra delen och klienten i<br />
den vänstra. Det som betecknas ”Sequrity Provider” är de<br />
delar som tar hand om säkerheten för komponenten (se A.5,<br />
Säkerhet). ”DCE RPC” står för Distributed Computing<br />
Environment Remote Procedure Call och har hand om<br />
uppslagningen och anrop <strong>av</strong> metoderna i komponenten. LPC<br />
står för Local Procedure Call och har hand om<br />
kommunikationen mellan processerna. Klienten och servern<br />
exekverar lokalt på samma dator.<br />
Ett mål med de olika arkitekturerna är att detta ska vara helt<br />
transparent för användarna <strong>av</strong> komponenten. Det skiljer inget<br />
i hur man skapar instanser <strong>av</strong> serverobjekten eller hur man<br />
använder dessa. Vilken modell man använder beror på i<br />
vilken omgivning komponenten skall användas.
Appendix A – COM/DCOM<br />
Arkitekturen för DCOM ser ut ungefär som COMs out-ofprocess<br />
servrar. LPC är utbytt mot en protokollstack och<br />
mellan klienten och servern sker kommunikationen med hjälp<br />
<strong>av</strong> DCOM Network Protocol enligt nedan (Figur 15).<br />
Client<br />
COM<br />
Client<br />
COM<br />
COM<br />
Client<br />
COM<br />
COM<br />
COM<br />
Klient Client<br />
COM<br />
Client<br />
COM<br />
COM<br />
Client<br />
COM<br />
COM<br />
COM<br />
Klient Komponent<br />
Komponent Component<br />
Component<br />
run-time run-time run-time run-time run time<br />
run-time run-time run-time run-time run time<br />
Security<br />
Security<br />
Provider<br />
Provider<br />
Protocol Protocol Stack<br />
Stack<br />
A.3 Gränssnittet<br />
DCE DCE RPC<br />
RPC<br />
Security<br />
Security<br />
Provider<br />
Provider<br />
DCOM DCOM Network Network Protocol<br />
Protocol<br />
Protocol Protocol Stack<br />
Stack<br />
DCE DCE RPC<br />
RPC<br />
Figur 15. Arkitektur DCOM<br />
Gränssnittet är det som ligger till grund för hela<br />
komponenten. Utan gränssnittet skulle en komponent vara<br />
helt oanvändbar eftersom det är gränssnittet som gör det<br />
möjligt att utföra metodanrop m.m. in i komponenten. För att<br />
kunna referera till ett gränssnitt måste ett unikt id för varje<br />
gränssnitt genereras. Detta id kallas GUID, Globally Unique<br />
Identifier, och är ett 128-bitars tal. Det är garanterat att vara<br />
unikt både i tid och i rum. Gränssnittet definieras i en s.k.<br />
IDL-fil, Interface Definition Language. Denna fil kompileras<br />
med hjälp <strong>av</strong> en IDL-kompilator, MIDL.EXE. Under det här<br />
examensarbetet användes ”Microsoft MIDL Compiler<br />
Version 5.01.0164” som kommer som en del <strong>av</strong> Microsoft<br />
Visual Studio 6.0 [5]. När en IDL-fil kompileras skapas ett<br />
antal filer enligt nedan (Figur 16).<br />
89
90<br />
MinCOM.h<br />
MinCOM.h<br />
MinCOM.h<br />
MinCOM .h<br />
C/C++<br />
C/C++<br />
Typdefinitioner<br />
Typdefinitioner<br />
MinCOM_P.c<br />
MinCOM_P.c<br />
MinCOM_P.c<br />
MinCOM _P.c<br />
Marshalerns<br />
Marshalerns<br />
definitioner<br />
definitioner<br />
Appendix A – COM/DCOM<br />
MinCOM.IDL<br />
MinCOM.IDL<br />
MinCOM.IDL<br />
MinCOM .IDL<br />
MIDL.EXE<br />
MIDL.EXE<br />
MinCOM_I.h<br />
MinCOM_I.h<br />
MinCOM_I.h<br />
MinCOM _I.h<br />
GUID<br />
GUID<br />
Definitioner<br />
Definitioner<br />
DLLDATA.c<br />
DLLDATA.c<br />
Marshalerns<br />
Marshalerns<br />
serverkod<br />
serverkod<br />
Figur 16. Filer som skapas <strong>av</strong> IDL-kompilatorn<br />
De filer som behövs för att använda komponenten är<br />
MinCOM.h, som innehåller ”C/C++ Typdefinitioner”, och<br />
MinCOM_I.h, som innehåller ”GUID Definitioner”. Dessa<br />
filer innehåller tillräckligt med information för att skapa<br />
instanser <strong>av</strong> komponenten, så länge denna är registrerad och<br />
tillgänglig i det operativsystem där den ska användas.<br />
Filerna MinCOM_P.c och DLLDATA.c används vid s.k.<br />
marshaling (se A.8, Marshaling).<br />
Under varje gränssnitt finns en eller flera klasser som<br />
implementerar funktionaliteten som definierats i IDL-filen.<br />
Dessa klasser behöver inte finnas tillgängliga för användning<br />
<strong>av</strong> komponenten. Detta betyder alltså att implementationen <strong>av</strong><br />
komponenten är helt skild från gränssnittet och inte alls synlig<br />
för den som vill använda komponenten.<br />
A.3.1 Viktiga gränssnitt i COM/DCOM<br />
MinCOM.TLB<br />
MinCOM.TLB<br />
MinCOM.TLB<br />
MinCOM .TLB<br />
Tokenbaserad Tokenbaserad IDL-fil IDL-fil IDL-fil IDL fil<br />
För För Visual Visual Basic, Basic, J<strong>av</strong>a J<strong>av</strong>a mm.<br />
mm.<br />
Det finns ett antal speciellt viktiga gränssnitt i COM/DCOM,<br />
som nämnts ovan. Nedan beskrivs dessa kort tillsammans med<br />
en listning <strong>av</strong> IDL-filen för vart och ett.
IUnknown<br />
Appendix A – COM/DCOM<br />
Det här gränssnittet ligger till grund för alla andra gränssnitt.<br />
Alla gränssnitt som skapas MÅSTE ärva från IUnknown.<br />
Gränssnittet innehåller de tre viktigaste metoderna för hela<br />
COM/DCOM:<br />
• QueryInterface (REFIID riid, void **ppv)<br />
• AddRef (void)<br />
• Release (void)<br />
Se listning nedan (Listning 7).<br />
QueryInterface<br />
Metoden används under exekveringen (runtime) för att ta reda<br />
på typer och metoder i gränssnittet. Den kan jämföras med<br />
C++ inbyggda operator dynamic_cast, som används för att<br />
utföra typkonvertering under exekveringen.<br />
AddRef<br />
Metoden används för att notifiera objektet, som används för<br />
att implementera komponenten, att en ny gränssnittspekare<br />
(interface pointer) har skapats. Under exekveringen <strong>av</strong> en<br />
komponent finns det en räknare som indikerar hur många<br />
gränssnittspekare som skapats. Metoden ökar denna räknare<br />
med ett. Räknaren ligger till grund för minneshanteringen. Så<br />
länge räknaren har ett värde större än noll existerar det pekare<br />
till gränssnittet och komponenten måste finnas i minnet. Så<br />
fort räknaren antar värdet noll frigörs minnet som<br />
komponenten använder.<br />
Release<br />
Det här är motsatsen till AddRef. Metoden minskar räknaren,<br />
som håller reda på antalet gränssnittspekare, med ett. Skulle<br />
räknaren anta värdet noll frigörs det minne som komponenten<br />
allokerar (se AddRef).<br />
[<br />
]<br />
local,<br />
object,<br />
uuid(00000000-0000-0000-C000-000000000046),<br />
pointer_default(unique)<br />
91
92<br />
interface IUnknown<br />
{<br />
}<br />
Appendix A – COM/DCOM<br />
typedef [unique] IUnknown *LPUNKNOWN;<br />
HRESULT QueryInterface(<br />
ULONG AddRef();<br />
ULONG Release();<br />
IClassFactory<br />
[in] REFIID riid,<br />
[out, iid_is(riid)] void **ppvObject);<br />
Listning 7. Gränssnittet IUnknown<br />
Gränssnittets viktigaste uppgift är att skapa instanser <strong>av</strong><br />
COM/DCOM-objekt. Detta görs med metoderna<br />
CreateInstance eller RemoteCreateInstance. Metoderna<br />
LockServer och RemoteLockServer anropas internt <strong>av</strong> COM<br />
när s.k. out-of-process activation används (se A.4.1,<br />
Aktivering (activation) och A.6, Process/trådmodell<br />
(threading model)). Notera att det här gränssnittet ärver från<br />
IUnknown (se Listning 8).<br />
[<br />
]<br />
local,<br />
object,<br />
uuid(00000001-0000-0000-C000-000000000046)<br />
interface IClassFactory : IUnknown<br />
{<br />
typedef [unique] IClassFactory * LPCLASSFACTORY;<br />
[local]<br />
HRESULT CreateInstance(<br />
[in, unique] IUnknown * pUnkOuter,<br />
[in] REFIID riid,<br />
[out, iid_is(riid)] void **ppvObject);<br />
[call_as(CreateInstance)]<br />
HRESULT RemoteCreateInstance(<br />
[local]<br />
[in] REFIID riid,<br />
[out, iid_is(riid)] IUnknown ** ppvObject);
}<br />
Appendix A – COM/DCOM<br />
HRESULT LockServer([in] BOOL fLock);<br />
[call_as(LockServer)]<br />
HRESULT __stdcall RemoteLockServer([in] BOOL fLock);<br />
IDispatch<br />
Listning 8. Gränssnittet IClassFactory<br />
IDispatch används för att tillåta att objekt används från<br />
exempelvis VBScript eller JScript. Gränssnittet måste till för<br />
att stödja funktionalitet i de interpretativa språken som<br />
scriptspråken tillhör.<br />
Metoden GetTypeInfo returnerar en beskrivning <strong>av</strong><br />
gränssnittet och GetTypeInfoCount returnerat 1 om en sådan<br />
beskrivning finns, annars 0.<br />
GetIDsOfNames returnerar s.k. DISPIDs, id för metoderna i<br />
gränssnittet, och Invoke används för att anropa en metod.<br />
Notera att det här gränssnittet ärver från IUnknown (se<br />
Listning 9).<br />
[<br />
]<br />
object,<br />
uuid(00020400-0000-0000-C000-000000000046)<br />
interface IDispatch : IUnknown {<br />
typedef struct tagDISPPARAMS {<br />
[size_is(cArgs)] VARIANTARG * rgvarg;<br />
[size_is(cArgs)] DISPID * rgdispidNamedArgs;<br />
UINT cArgs;<br />
UINT cNaedArgs;<br />
} DISPPARAMS;<br />
HRESULT GetTypeInfoCount([out] UINT * pctinfo);<br />
HRESULT GetTypeInfo([in] UINT iTInfo,<br />
HRESULT GetIDsOfNames(<br />
[in] LCID lcid,<br />
[out] ITypeInfo ** ppTInfo);<br />
[in] REFIID riid,<br />
[in,size_is(cNames)] LPOLESTR * rgszNames,<br />
[in] UINT cNames,<br />
[in] LCID lcid,<br />
[out,size_is(cNames)] DISPID * rgid);<br />
93
94<br />
}<br />
Appendix A – COM/DCOM<br />
HRESULT Invoke( [in] DISPID id,<br />
A.4 Klasser/objekt<br />
[in] REFIID riid,<br />
[in] LCID lcid,<br />
[in] WORD wFlags,<br />
[in, out] DISPPARAMS * pDispParams,<br />
[out] VARIANT * pVarResult,<br />
[out] EXCEPINFO * pExcepInfo,<br />
[out] UINT* puArgErr);<br />
Listning 9. Gränssnittet IDispatch<br />
I COM/DCOM måste det finnas ett s.k. klassobjekt (class<br />
object). För varje klass som ingår i ett gränssnitt finns ett<br />
klassobjekt som implementerar funktionaliteten hos de olika<br />
metoderna. Klassobjektet fungerar som en metaklass för en<br />
given implementation och metoderna som implementeras här<br />
fungerar som statiska medlemsmetoder i C++. För att komma<br />
åt funktionaliteten i en komponent går man via detta<br />
klassobjekt.<br />
A.4.1 Aktivering (activation)<br />
Klassobjektet måste aktiveras på något sätt, innan man kan<br />
använda metoderna. Detta kallas activation och kan göras på<br />
tre sätt:<br />
• Klienten ber komponenten att allokera eller binda<br />
klassobjektet för en given klass.<br />
• Klienten ber komponenten att skapa en ny instans <strong>av</strong> en<br />
klass baserat på klass-id, CLSID.<br />
• Klienten ber komponenten att väcka ett redan skapat<br />
objekt baserat på objektets tillstånd.<br />
Första modellen är nödvändig för att kunna använda<br />
komponenten, medan de två andra är optimeringar <strong>av</strong> den<br />
första.<br />
Alla tre aktiveringsmodellerna använder SCM, Service<br />
Control Manager. Modellerna kallas aktiveringsprimitiver,<br />
activation primitives, och ser ut enligt nedan.
Appendix A – COM/DCOM<br />
CoGetInstanceFromFile<br />
CoCreateInstanceEx<br />
Figur 17. SCM och de tre aktiveringsprimitiverna<br />
Som syns i figuren ligger CoGetClassObject som grund för de<br />
andra två, som nämnts ovan. CoGetClassObject ser ut enligt<br />
nedan:<br />
HRESULT CoGetClassObject(<br />
Service Control Manager<br />
(SCM)<br />
CoGetClassObject<br />
[in] REFCLSID rclsid, // vilket klassobjekt?<br />
[in] DWORD dwClsCtx, // lokalitet?<br />
[in] COSERVERINFO *pcsi, // värd/säkerhetsinfo<br />
[in] REFIID refiid, // vilket interface?<br />
[out, iid_is(riid)]void **ppv); // objektspekare<br />
Listning 10. Definitionen <strong>av</strong> CoGetClassObject<br />
Första argumentet pekar ut vilket klassobjekt som ska<br />
aktiveras. Det andra argumentet, dwClsCtx, talar om var<br />
objektet finns, alltså om det är ett inprocess-, out-of-process-<br />
eller off-host-objekt. Argumentet *pcsi är en pekare till en<br />
struktur som innehåller information om värden och säkerhet.<br />
Argumentet gör det möjligt för klienten att bestämma vilken<br />
maskin som ska aktivera objektet samt konfigurera säkerheten<br />
för objektet när det gäller att överföra information till och från<br />
detta (se vidare om säkerhet A.5, Säkerhet). Fjärde<br />
argumentet är id för klassen som definierar klassobjektet. Det<br />
sista argumentet är en pekare till objektet som ska aktiveras.<br />
Objektet kommer att läggas där denna pekare visar och man<br />
kan sedan med hjälp <strong>av</strong> denna komma åt metoder och attribut<br />
hos objektet.<br />
95
96<br />
A.5 Säkerhet<br />
Appendix A – COM/DCOM<br />
Den första versionen <strong>av</strong> COM brydde sig inte om något vad<br />
gäller säkerhet. Detta ändrades dock när Microsoft [12]<br />
släppte operativsystemet Windows NT 4.0 [13]. Med ökad<br />
säkerhet kunde man låta vilken maskin som helst på ett<br />
nätverk använda komponenter på andra maskiner.<br />
Säkerheten i COM delas upp i tre områden:<br />
• Autenciering<br />
• Åtkomstkontroll<br />
• Hantering <strong>av</strong> s.k. tokens<br />
Säkerheten inom COM är ett mycket stort område, vilket gör<br />
att dessa endast beskrivs kort. Avsnitten är till för att ge en<br />
liten inblick i begreppen, inte någon ingående kunskap om<br />
alla olika inställningar eller metoder att sköta om dessa.<br />
A.5.1 Autenciering<br />
Autenciering hanterar kontroller <strong>av</strong> vem som använder<br />
komponenten. Är användaren den han/hon uppger sig vara?<br />
Denna kontroll kan ske med hjälp <strong>av</strong> olika protokoll eller<br />
paket. Dessa är:<br />
• RPC_C_AUTHN_NONE – Ingen autenciering<br />
• RPC_C_AUTHN_DCE_PRIVATE – privat DCEnyckel<br />
(används ej)<br />
• RPC_C_AUTHN_DCE_PUBLIC – publik DCE-nyckel<br />
(används ej)<br />
• RPC_C_AUTHN_DEC_PUBLIC – Digital Equipment<br />
(används ej)<br />
• RPC_C_AUTHN_WINNT – Windows NT LAN<br />
Manager-autenciering<br />
• RPC_C_AUTHN_GSS_KERBEROS – Kerberos<br />
• RPC_C_AUTHN_MQ – Microsoft Message Queue<br />
• RPC_C_AUTHN_DEFAULT – Standardautenciering<br />
Som syns i listan ovan finns det ett antal olika paket för<br />
autenciering. Vilka paket som stöds beror på vilket<br />
operativsystem som används. I Windows NT 4.0 stöds endast<br />
RPC_C_AUTHN_WINNT (NTLM) medan i NT 5.0
Appendix A – COM/DCOM<br />
(Windows 2000) finns stöd för åtminstone NTLM och<br />
Kerberos. Detta gäller så länge inga 3:e-parts-paket<br />
installeras. Varje komponent kan konfigureras för att använda<br />
olika autencieringsnivåer eller paket. DCE RPC och COM<br />
stöder sex nivåer på autenciering. Dessa varierar från att ingen<br />
kontroll förekommer till full kryptering <strong>av</strong> all kommunikation<br />
mellan komponent och användare, enligt nedan.<br />
• (RCP_C_AUTHN_LEVEL_DEFAULT)<br />
• RPC_C_AUTHN_LEVEL_NONE<br />
• RPC_C_AUTHN_LEVEL_CONNECT<br />
• RPC_C_AUTHN_LEVEL_CALL<br />
• RPC_C_AUTHN_LEVEL_PKT<br />
• RPC_C_AUTHN_LEVEL_PKT_INTEGRITY<br />
• RPC_C_AUTHN_LEVEL_PKT_PRIVACY<br />
Nivåerna är ordnade från låg till hög nivå, där en högre nivå<br />
innebär att alla nivåer lägre antas fungera korrekt.<br />
RPC_C_AUTHN_LEVEL_NONE innebär att ingen kontroll<br />
görs, RPC_C_AUTHN_LEVEL_CONNECT innebär att<br />
kontroll görs vid första metodanropet.<br />
A.5.2 Åtkomstkontroll<br />
Åtkomstkontrollen är uppdelad i två delar, rättigheter i<br />
samband med start <strong>av</strong> serverprocess samt åtkomsträttigheter.<br />
Den första kontrollen används för att se vem som har<br />
rättigheter att starta en serverprocess när anrop görs till SCM<br />
(se A.4.1, Aktivering (activation)). Åtkomsträttigheter innebär<br />
kontroll <strong>av</strong> vilka som har rättigheter att använda objekt i<br />
serverprocessen när en sådan startats. Båda typerna kan ställas<br />
in med hjälp <strong>av</strong> verktyget DCOMCNFG.EXE, medan det bara<br />
är åtkomsträttigheterna som kan ställas in vid runtime. Den<br />
senare kontrollen görs gentemot värden som ligger sparade i<br />
Windowsregistret.<br />
A.5.3 Hantering <strong>av</strong> tokens<br />
I Windows NT har alla processer en s.k. ”access token”, som<br />
innehåller säkerhetsattributen för processen. Denna token<br />
skapas när en process initieras och innehåller bland annat<br />
information om användare, användarens s.k. ”NT security<br />
97
98<br />
Appendix A – COM/DCOM<br />
identifier (SID)”, listan med grupper användaren tillhör etc.<br />
Med hjälp <strong>av</strong> dessa tokens håller COM reda på vem eller vilka<br />
som har rättigheter att utföra operationer med komponenterna,<br />
processerna och objekten som ingår i modellen.<br />
A.6 Process/trådmodell (threading model)<br />
Att välja process- eller trådmodell, engelskans threading<br />
model, för en komponent är inte alltid lätt. Innan man<br />
bestämmer detta måste man ta ett beslut om komponenten ska<br />
vara DLL-server eller en EXE-server, vilket är nära besläktat<br />
med in-process- eller out-of-process-komponenter enligt ovan<br />
(se A.2, Arkitekturen hos COM/DCOM, och A.4.1,<br />
Aktivering (activation)). Det finns fyra olika modeller att<br />
välja mellan när det gäller threading models:<br />
• Single<br />
• Apartment<br />
• Free<br />
• Both<br />
Dessa skiljer sig åt när det gäller prestanda och trådsäkerhet.<br />
Modellerna beskrivs kort nedan.<br />
Vilken modell man väljer beror helt och hållet på var och hur<br />
komponenterna ska användas. Olika modeller är bra i olika<br />
tillämpningar.<br />
A.6.1 Single-threading<br />
Som namnet antyder är det en enda huvudtråd som är<br />
inblandad i hanteringen <strong>av</strong> objekt <strong>av</strong> den här typen. Alla anrop<br />
till objekten är serialiserade <strong>genom</strong> en enda tråd, vilket gör att<br />
de behandlas i den följd de kommer in. Modellen<br />
rekommenderas inte när det gäller komponenter som ska<br />
användas från exempelvis ASP-script via ett webbgränssnitt,<br />
eftersom single-threaded-komponenter inte kan hantera<br />
många klienter samtidigt. Resultatet <strong>av</strong> detta kan vara s.k.<br />
dead-lock, klienttrådarna väntar på varandra i all oändlighet,<br />
en låsning.
A.6.2 Apartment-threading<br />
Appendix A – COM/DCOM<br />
Den här modellen används som standardmodell om man<br />
väljer att göra en EXE-server med hjälp <strong>av</strong> ATL COM<br />
AppWizard i Visual C++. Alla objekten på servern skapas<br />
inom en s.k. STA, Single Threaded Apartment. Denna<br />
egenskap åskådliggörs enklast med hjälp <strong>av</strong> en figur (Figur<br />
18).<br />
Klient<br />
Klient<br />
Klient<br />
Klient<br />
Klient<br />
Server<br />
STA<br />
Objekt<br />
Objekt<br />
Objekt<br />
Objekt<br />
Objekt<br />
Figur 18. Apartment-threading model i EXE-server<br />
Här ser vi fem klienter som har skapat varsitt objekt på<br />
servern. Dessa objekt existerar i en och samma STA. Anropen<br />
är även här serialiserade och behandlas alltså i den ordning de<br />
inkommer till servern. Detta kan resultera i att klienttrådar<br />
låser. Sådana här objekt kan användas från ASP-script om<br />
instanserna existerar under det att webbsidan genereras, alltså<br />
inte för objekt som existerar under en hel webbsession.<br />
Om servern är <strong>av</strong> DLL-typ kommer en STA skapas för varje<br />
instans <strong>av</strong> objekten och problemet med serialiserade<br />
metodanrop försvinner, vilket gör att man slipper låsta<br />
klienttrådar. Figuren nedan (Figur 19) åskådliggör utseendet<br />
på modellen.<br />
99
100<br />
Klient<br />
Klient<br />
Klient<br />
Klient<br />
Klient<br />
A.6.3 Free-threading<br />
Appendix A – COM/DCOM<br />
Server<br />
STA<br />
Objekt<br />
STA<br />
Objekt<br />
STA<br />
Objekt<br />
STA<br />
Objekt<br />
STA<br />
Objekt<br />
Figur 19. Apartment-threading model i DLL-server<br />
En server med en free-threading modell ser ut ungefär som<br />
apartment-threaded server, men objekten exekverar i en s.k.<br />
MTA, Multi Threaded Apartment. Figuren nedan (Figur 20)<br />
åskådliggör modellen.
Klient<br />
Klient<br />
Klient<br />
Klient<br />
Klient<br />
Appendix A – COM/DCOM<br />
Figur 20. Free-threading model<br />
Här syns att alla objekt exekverar helt skilda från varandra<br />
och att inga metodanrop från en klient låser andra klienter.<br />
Varje metodanrop från en klient till ett objekt skapar en RPCtråd.<br />
Man kan tycka att den här modellen är den man bör<br />
använda, men det rekommenderas att man inte använder den i<br />
komponenter som ska användas från ASP-script i Microsoft<br />
IIS [21].<br />
A.6.4 Both-threading<br />
RPC<br />
trådar<br />
Server<br />
MTA<br />
Objekt<br />
Objekt<br />
Objekt<br />
Objekt<br />
Objekt<br />
Modellen innehåller både en MTA och en STA. Det krävs<br />
alltså att man implementerar hantering <strong>av</strong> båda fallen. Detta<br />
kan vara tidsödande eftersom man oftast inte behöver stöd för<br />
båda modellerna i sina komponenter.<br />
A.7 Arbetsfördelningsmodeller för DCOM<br />
DCOM innebär att man distribuerar sina komponenter till<br />
olika maskiner. Man kan utnyttja det här till att lägga likadana<br />
101
102<br />
Appendix A – COM/DCOM<br />
komponenter på många maskiner och sedan fördela arbetet<br />
mellan dessa komponenter enligt olika modeller. Fördelen<br />
med att fördela arbetet är att man <strong>av</strong>lastar enskilda maskiner<br />
vid tungt arbete.<br />
Det finns två huvudmodeller för detta:<br />
• Statisk fördelning<br />
• Dynamisk fördelning<br />
Modellerna beskrivs nedan (se A.7.1, Statisk fördelning<br />
(Static Load Balancing), och A.7.2, Dynamisk fördelning<br />
(Dynamic Load Balancing)).<br />
A.7.1 Statisk fördelning (Static Load Balancing)<br />
Som namnet antyder bestäms vilket arbete som ska utföras på<br />
vilka maskiner <strong>genom</strong> en statisk tilldelning. Man kan<br />
exempelvis dela in klienterna i grupper där varje grupp<br />
använder komponenten på en egen maskin. Detta kan ge en<br />
sned arbetsfördelning om många klienter ur en och samma<br />
grupp skulle behöva komponenten samtidigt.<br />
Det som talar för statisk arbetsfördelning är att<br />
konfigureringen är enkel. Från och med Windows 2000 kan<br />
man centralisera detta, medan man i Windows NT 4.0 kan<br />
använda sig <strong>av</strong> exempelvis en databas eller en fil som ligger<br />
på något för klienterna känt ställe.<br />
Man kan även sköta fördelningen med en s.k. Referral<br />
Component, som beroende på klientens identitet kan välja<br />
server. Det som gör en sådan komponent effektiv är att den<br />
kan skapa en direktkoppling till servern och returnera den till<br />
klienten. Referral Component är sedan helt frikopplad från<br />
resten <strong>av</strong> kommunikationen mellan klient och server.<br />
Modellen fungerar bra när man kan förutse belastningen på<br />
komponenterna.<br />
A.7.2 Dynamisk fördelning (Dynamic Load Balancing)<br />
Den här modellen väljer dynamiskt vilken server en klient ska<br />
koppla upp sig mot. Vilken server som aktiveras bestäms <strong>av</strong><br />
en Referral Component. Man kan exempelvis välja den server<br />
med den, för tillfället, lägsta belastningen (se Figur 21). Vilka<br />
kriterier man använder vid val <strong>av</strong> server är upp till den som<br />
implementerar systemet. Med den här modellen blir systemet
Klient<br />
Appendix A – COM/DCOM<br />
flexibelt och om en server skulle krascha skulle inte det<br />
märkas på samma sätt som vid statisk arbetsfördelning.<br />
1. Klienten vill ha en koppling<br />
A.8 Marshaling<br />
3. Kopplingen returneras till klienten<br />
2. Referral Component kontaktar<br />
”bästa” distribuerade komponent<br />
Referral Component<br />
Figur 21. Användning <strong>av</strong> “Referral Component”<br />
Komponent<br />
Komponent<br />
Komponent<br />
Komponent<br />
Komponent<br />
Komponent<br />
Marshaling är den procedur som har hand om packning och<br />
sändning <strong>av</strong> det data som ska skickas mellan komponenterna<br />
och klienterna. Eftersom marshaling är ett invecklat område<br />
kommer det inte att beskrivas i detalj. Man behöver oftast inte<br />
bry sig om detta eftersom marshaling ingår i COM/DCOMarkitekturen.<br />
På mottagarsidan, detta kan vara både server och klient<br />
eftersom klienten skickar metodanrop till servern med eller<br />
utan parametrar, kommer marshalern att ta emot data och<br />
packa upp det. Proceduren kallas unmarshaling och är<br />
omvänd marshaling-procedur.<br />
För en mer ingående beskrivning <strong>av</strong> marshaling, läs [14] och<br />
[25].<br />
103
104<br />
A.8.1 VARIANT<br />
Appendix A – COM/DCOM<br />
Egenskaperna för marshaling gör att inte alla typer <strong>av</strong> data<br />
kan skickas <strong>genom</strong> gränssnittet. Proceduren sköts <strong>av</strong> en s.k.<br />
marshaler och denna måste veta storlek och struktur på den<br />
data som ska packas och skickas. En marshaler klarar <strong>av</strong> att<br />
hantera datatyper som ryms i strukturen VARIANT.<br />
Utseendet på strukturen ser ut enligt nedan:<br />
typedef struct tagVARIANT {<br />
VARTYPE vt;<br />
unsigned short wReserved1;<br />
unsigned short wReserved2;<br />
unsigned short wReserved3;<br />
union {<br />
Byte bVal; // VT_UI1.<br />
Short iVal; // VT_I2.<br />
long lVal; // VT_I4.<br />
float fltVal; // VT_R4.<br />
double dblVal; // VT_R8.<br />
VARIANT_BOOL boolVal; // VT_BOOL.<br />
SCODE scode; // VT_ERROR.<br />
CY cyVal; // VT_CY.<br />
DATE date; // VT_DATE.<br />
BSTR bstrVal; // VT_BSTR.<br />
DECIMAL FAR* pdecVal; // VT_BYREF|VT_DECIMAL.<br />
IUnknown FAR* punkVal; // VT_UNKNOWN.<br />
IDispatch FAR* pdispVal; // VT_DISPATCH.<br />
SAFEARRAY FAR* parray; // VT_ARRAY|*.<br />
Byte FAR* pbVal; // VT_BYREF|VT_UI1.<br />
short FAR* piVal; // VT_BYREF|VT_I2.<br />
long FAR* plVal; // VT_BYREF|VT_I4.<br />
float FAR* pfltVal; // VT_BYREF|VT_R4.<br />
double FAR* pdblVal; // VT_BYREF|VT_R8.<br />
VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.<br />
SCODE FAR* pscode; // VT_BYREF|VT_ERROR.<br />
CY FAR* pcyVal; // VT_BYREF|VT_CY.<br />
DATE FAR* pdate; // VT_BYREF|VT_DATE.<br />
BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.<br />
IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.<br />
IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
};<br />
};<br />
Appendix A – COM/DCOM<br />
SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.<br />
VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.<br />
void FAR* byref; // Generic ByRef.<br />
char cVal; // VT_I1.<br />
unsigned short uiVal; // VT_UI2.<br />
unsigned long ulVal; // VT_UI4.<br />
int intVal; // VT_INT.<br />
unsigned int uintVal; // VT_UINT.<br />
char FAR * pcVal; // VT_BYREF|VT_I1.<br />
unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.<br />
unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.<br />
int FAR * pintVal; // VT_BYREF|VT_INT.<br />
unsigned int FAR * puintVal; // VT_BYREF|VT_UINT.<br />
Listning 11. Strukturen på VARIANT<br />
Överst i strukturen ovan (Listning 11) finns ett fält, VARTYPE<br />
vt, som identifierar vilken typ som kapslas in. Värdet på<br />
VARTYPE vt är kombinationer <strong>av</strong> konstanter enligt<br />
kommentarsdelarna i unionen i strukturen. Eftersom<br />
VARIANT är en väldefinierad struktur vet marshalern hur<br />
den ska behandla sådana utan att behöva bry sig om vad som<br />
egentligen gömmer sig inne i VARIANT. Variabeltyperna<br />
som stöds är de som finns i unionen. Här syns exempelvis<br />
IUnknown och IDispatch. Eftersom alla gränssnitt i COM<br />
ärver från något <strong>av</strong> dessa två kan pekare till olika gränssnitt<br />
skickas <strong>genom</strong> gränssnittet. Detta är kraftfullt och har<br />
utnyttjats i exempelsystemet som implementerats under<br />
examensjobbet.<br />
För en mer ingående beskrivning <strong>av</strong> strukturen VARIANT läs<br />
exempelvis [1].<br />
105
Appendix B – Microsoft IIS och DCOMCNFG<br />
B. Microsoft IIS och DCOMCNFG<br />
Innan prototyputvecklingen kunde påbörjas uppkom stora<br />
problem med att få användningen <strong>av</strong> komponenter från ASPsidor<br />
att fungera. Därför har detta appendix kommit till, för att<br />
underlätta installationen <strong>av</strong> Microsoft IIS och inställningarna i<br />
DCOMCNFG.<br />
B.1 Microsoft IIS<br />
Med installationen <strong>av</strong> Microsoft IIS kommer två stycken<br />
användare, IUSR_DATORNAMN och IWAM_DATORNAMN.<br />
Som framgår <strong>av</strong> namnen beror dessa <strong>av</strong> namnet på datorn, på<br />
vilken IIS installeras.<br />
IUSR_DATORNAMN är en användare för anonym access <strong>av</strong><br />
resurser inom IIS. Användaren ingår i gruppen Gäster eller<br />
Guests om engelsk version <strong>av</strong> IIS/Windows används. Inga<br />
inställningar behöver ändras på detta användarkonto. Ändra<br />
INTE lösenordet för användaren.<br />
IWAM_DATORNAMN (WAM står för Web Application<br />
Management) är en användare för IIS om nya processer ska<br />
aktiveras från ett webbscript eller liknande. Även detta konto<br />
ingår i gruppen Gäster eller Guests. Samma sak gäller för<br />
detta konto, som för IUSR-kontot beskrivet ovan, d.v.s. att<br />
inga inställningar behöver ändras.<br />
Man kan med dessa två konton begränsa åtkomsten <strong>av</strong><br />
webbsidor på sin server, men detta bör man istället begränsa<br />
<strong>genom</strong> att konfigurera IIS på annat sätt.<br />
IIS konfigureras via en applikation, Internet Information<br />
Services, som återfinns på kontrollpanelen (Control Panel).<br />
Från denna kan man skapa nya s.k. virtuella bibliotek, som<br />
fungerar som mappningar till de verkliga biblioteken på<br />
servern. Roten för webbservern ligger oftast på<br />
”C:\Inetpub\wwwroot”. Om man går in i denna katalog via en<br />
webbläsare inloggad som administrator kan man konfigurera<br />
webbservern via ett webbgränssnitt. Som standard fungerar<br />
detta endast från den dator som IIS är installerad på. Detta kan<br />
107
108<br />
Appendix B – Microsoft IIS och DCOMCNFG<br />
dock ställas om för att göra det möjligt att konfigurera sin<br />
webbserver från en annan dator.<br />
Om man skapar ett virtuellt bibliotek på sin server behöver<br />
inga inställningar ändras för att få script och<br />
komponentanvändning via script att fungera.<br />
B.2 DCOMFNG<br />
Detta verktyg används för att konfigurera hur COM och<br />
DCOM ska användas. Oftast behöver inga inställningar<br />
ändras, men man bör kontrollera exekveringsrättigheterna<br />
under säkerhetsinställningar. Dessa ska vara inställda så att<br />
både IUSR_DATORNAMN och IWAM_DATORNAMN har<br />
rättigheter att exekvera komponenter på servern. Det var<br />
framför allt detta som skapade problem och förvirring under<br />
inledningen <strong>av</strong> prototyputvecklingen. För att undvika problem<br />
med detta i framtiden återfinns tre figurer nedan (Figur 1,<br />
Figur 1 och Figur 1), som visar hur det ska se ut under två <strong>av</strong><br />
inställningsflikarna. Observera att dessa är från en engelsk<br />
version <strong>av</strong> IIS/Windows.
Appendix B – Microsoft IIS och DCOMCNFG<br />
Figur 22. Inställningar i DCOMCNFG, flik 2.<br />
109
110<br />
Appendix B – Microsoft IIS och DCOMCNFG<br />
Figur 23. DCOMCNFG. Klicka på “Edit Defaults”.<br />
Figur 24. Exekveringsrättigheterna för COM/DCOM.<br />
Att konfigurera IIS och COM/DCOM är inte helt trivialt. För<br />
IIS finns ett stort antal inställningar att göra. Dessa är inte helt
Appendix B – Microsoft IIS och DCOMCNFG<br />
självklara och dokumentationen är ganska knapphändig. Man<br />
bör vara mycket försiktig med detta eftersom det inte finns<br />
någon möjlighet att återställa till standardinställningar utan att<br />
installera om hela IIS.<br />
111