28.09.2013 Views

Ökad tillgänglighet av existerande programvara genom ...

Ökad tillgänglighet av existerande programvara genom ...

Ökad tillgänglighet av existerande programvara genom ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!