• No results found

Kalendersynkronisering med Microsoft Sync Framework

N/A
N/A
Protected

Academic year: 2021

Share "Kalendersynkronisering med Microsoft Sync Framework"

Copied!
55
0
0

Loading.... (view fulltext now)

Full text

(1)

Kalendersynkronisering med Microsoft Sync

Framework

Goran Pavicic

EXAMENSARBETE 2010

DATATEKNIK

(2)

Kalendersynkronisering med Microsoft Sync

Framework

Calendar synchronization With Microsoft Sync

Framework

Goran Pavicic

Detta examensarbete är utfört vid Tekniska Högskolan i Jönköping inom ämnesområdet informationsteknik. Arbetet är ett led i den treåriga

högskoleingenjörsutbildningen. Författaren svarar själv för framförda åsikter, slutsatser och resultat.

Handledare: Christer Thörn Omfattning: 15 poäng Datum:

(3)

Abstract

The main aim of this project is to implement an application that synchronizes a calendar in Outlook with a certain calendar on a SharePoint server. The goal is to enable calendar sharing through one interface amongst users in different corporations. Microsoft Sync Framework was selected as the environment in which the synchronisation algorithm was to be developed. The main task lies in developing the two synchronisation providers, which represent each data

source during a synchronisation session. They build a layer that separates Microsoft Sync Framework from the complexity of the data sources. Methods for transferring data amongst the two data sources and keeping metadata up to date are two additional tasks that the synchronisation providers are responsible for. The solution is deployed as an “add in” in Outlook.

(4)

Sammanfattning

Huvuduppgiften med detta projekt är att skapa en applikation som

synkroniserar Outlooks kalender med SharePoint server. Målet är att kunna se flera användares Outlook kalender i ett och samma gränssnitt trots att de är organisatoriskt åtskilda och från olika företag. För att lösa synkronisering används Microsoft Sync Framework. Huvuddelen av arbetsbördan består i att utveckla två leverantörer som representerar respektive datakälla under en synkroniseringssession. Leverantörerna utgör ett lager mellan Microsoft Sync Framework och datakällorna. De tillhandahåller metoder för att överföra objekt mellan datakällorna, samt ser till att metadatat reflekterar ändringarna i

datakällan. Applikationen levereras i form av ett tillägg till Outlook.

Nyckelord

(5)

Innehållsförteckning

Figurförteckning ... 5

1

Inledning ... 6

1.1 BAKGRUND ... 6 1.2 SYFTE OCH MÅL ... 6 1.3 AVGRÄNSNINGAR ... 7 1.4 DISPOSITION ... 7

2

Teoretisk bakgrund ... 8

2.1 .NET ... 8 2.1.1 CLR ... 9 2.1.2 Garbage Collector ... 11 2.1.3 Klassbibliotek ... 11 2.1.4 C# ... 11 2.2 OBJEKTORIENTERAD PROGRAMUTVECKLING ... 12

2.2.1 Objekt och Klasser ... 12

2.2.2 Arv ... 13 2.3 XML ... 14 2.3.1 Element ... 14 2.3.2 XML-attribut ... 14 2.4 SHAREPOINT ... 15 2.4.1 Vad är Sharepoint ... 15

2.4.2 Sharepoint Web Services ... 16

2.5 CAML ... 16

2.5.1 CAML Queries ... 17

2.5.2 CAML Query Builder ... 18

2.6 MICROSOFT SYNC FRAMEWORK [12] ... 19

2.6.1 Komponenter [19] ... 20 2.6.2 Metadata ... 20 2.6.3 Exempel ... 21 2.7 UTVECKLINGSMODELL ... 24

3

Genomförande ... 26

3.1 INLEDNING ... 26 3.2 UTVECKLINGSMILJÖ ... 26 3.3 UTVECKLING... 28 3.3.1 Övergripande bild ... 28 3.3.2 Exempel – Filsynkronisering ... 30

3.3.3 Sharepoint och Outlook Provider ... 31

3.3.4 Inline vs. Asynkron... 32

3.3.5 Metoder för asynkron uppdatering av metadata ... 33

3.3.6 ID ... 35

3.3.7 Outlook och Calendar ... 35

3.3.8 OutlookAddin4 ... 37

3.4 DATAFLÖDE ... 41

4

Resultat ... 42

4.1 INSTALLATION ... 42

(6)

5

Slutsats och diskussion ... 46

5.1 FRAMTIDA ARBETE ... 47

6

Referenser ... 48

7

Sökord ... 50

(7)

Figurförteckning

FIGUR 1:HUVUDDELAR I SYSTEMET ... 7

FIGUR 2:C# KOMPILERING [7] ... 10

FIGUR 3:OBJEKTORIENTERINGENS TRE HÖRNPELARE ... 12

FIGUR 4:KLASSEN FORDON OCH TVÅ INSTANSER ... 13

FIGUR 5:ARV AV KLASSEN FORDON ... 13

FIGUR 6:EXEMPEL PÅ SITE COLLECTION [17] ... 15

FIGUR 7:EXEMPEL PÅ EN SITE ... 15

FIGUR 8:CAMLQUERY BUILDER [22] ... 18

FIGUR 9:VERSIONER ÄR METADATA FÖR VARJE OBJEKT SOM DELTAR I SYNKRONISERINGEN ... 21

FIGUR 10:SYNKRONISERING MELLAN DATAA OCH DATAB ... 21

FIGUR 11:DATABASER MED TILLHÖRANDE METADATA INNAN SYNKRONISERING ... 22

FIGUR 12:DATABASERNA OCH METADATA EFTER SYNKRONISERING ... 22

FIGUR 13:DATABASER OCH METADATA EFTER EN KONFLIKT.KNOWLEDGE FÖR DATAA ÄR (A5,B3) OCH (A4,B6) FÖR DATAB... 23

FIGUR 14:UTVECKLINGSMILJÖN OCH DE VIRTUELLA DATORERNA ... 28

FIGUR 15:ITERATIV UTVECKLING [21] ... 25

FIGUR 16:ÖVERSIKTSBILD SOM VISAR HUVUDKOMPONENTERNA I APPLIKATIONEN ... 29

FIGUR 17:METODER SOM ANROPAS AV MSF ... 32

FIGUR 18:OUTLOOK MENY ... 38

FIGUR 19:FORMULÄRET DÄR ANVÄNDAREN ANGER INSTÄLLNINGAR FÖR SYNKRONISERING ... 39

FIGUR 20:EXEMPEL PÅ UTSKRIFT UNDER EN SYNKRONISERINGSSESSION ... 41

FIGUR 21:INSTALLATIONSFILERNA ... 43

FIGUR 22:EN OMSTART KRÄVS ... 43

FIGUR 23:TILLÄGGET INSTALLERAT ... 44

FIGUR 24:LYCKAD INLOGGNING ... 45

(8)

1 Inledning

1.1 Bakgrund

Denna examensrapport handlar om implementeringen av en

synkroniseringslösning. Examensarbetet är det slutliga arbete som utförs inom det treåriga högskoleingenjörprogrammet Datateknik med inriktning

informationsteknik på Jönköping Tekniska Högskola.

Detta arbete utförs i samarbete med Webdivision AB. Webdivision AB är ett ungt företag som jobbar med programvara som tjänst med internet som

leveransplattform. De jobbar med Microsoft Sharepoint som bas för många av deras lösningar. Webdivision AB finns i Nässjö och Linköping.

Examensarbetet har utförts i samarbete med Nässjö-kontoret.

Outlook är ett välbekant verktyg som används av många företag för mail, kalenderplanering och som samarbetsverktyg. Sharepoint är ett relativt nytt verktyg från Microsoft som vuxit kraftigt på senare tid och som syftar till att underlätta informationshanteringen och samarbete inom företag. Sharepoint erbjuder möjligheten att skapa gemensamma arbetsytor inom en grupp för att samla information på ett och samma ställe. Det är ett kraftfullt verktyg med vilket man på kort tid kan skapa avancerade funktioner, såsom dokumentarkiv, forum och bloggar. Uppdraget bestod i att implementera en skräddarsydd applikation som synkroniserade Outlooks huvudkalender med en kalender i Sharepoint. Målet är att kunna se flera användares Outlook-kalender i ett och samma gränssnitt trots att de är organisatoriskt åtskilda och från olika företag. Detta för att kunna ha tillgång till en projektgrupps medlemmars kalendrar på en projekt-plats. Figur 1 visar en övergripande bild över de olika delarna i system.

1.2 Syfte och mål

Målet med detta examensarbete är att utveckla en prototyp som synkroniserar Outlooks huvudkalender med en bestämd kalender i SharePoint. Applikationen ska uppfylla följande krav:

1. Tvåvägs synkronisering med Sharepoint

2. Kompatibelt med Outlook 2003/2007 och äldre versioner 3. Flexibel hantering av användaruppgifter

(9)

Figur 1: Huvuddelar i systemet

1.3 Avgränsningar

Projektet baserar sig på Microsofts .Net-ramverk och applikationen skrivs i C#. Huvudsyftet med projektet är inte att utveckla en fullfjädrad

synkroniseringslösning mellan Sharepoint och Outlook utan att skapa en stabil prototyp som därefter kan byggas på med ytterligare funktionalitet efter

önskemål. Efter samråd med uppdragsgivaren bestämdes att ingen

programmering skulle ske direkt på Sharepoint-servern då risken fanns att eventuella buggar påverkade prestandan på hela servern. Därmed ska all kommunikation mellan Outlook-klienten och Sharepoint endast ske via de fördefinierade Webservices som finns i Sharepoint.

1.4 Disposition

Teoretisk bakgrund

I detta avsnitt behandlas kort de tekniker och verktyg som används i projektet för att även den oinvigde ska ha möjlighet att förstå de övriga delarna i

rapporten.

Genomförande

Under detta avsnitt redovisas metoderna som använts för att lösa problemen. Här tas nackdelarna och fördelarna upp med den valda metoden.

Resultat

I detta kapitel ges övergripande bild av slutprodukten och hur applikationen används.

Slutsats och diskussion

I detta avsnitt görs en allmän reflektion kring uppdraget. Här resoneras kring förbättringar som göras i framtida versioner av programmet.

Microsoft Sync Framework

(10)

2 Teoretisk bakgrund

I detta avsnitt behandlas de mest väsentliga tekniker som använts i

utvecklingsarbetet. Ämnena behandlas endast ytligt och avsnittet är avsett att kort informera läsaren om de verktyg och tekniker som legat till grund för utvecklingsarbetet. Följande ämnen kommer att behandlas i kapitlet:

 .Net

 Objektorienterad utveckling

 Sharepoint

 XML

 Microsoft Sync Framework

.NET är den utvecklingsplattform som används i det här projektet och som egentligen hela projektet bygger på. För arbete mot .Net valdes

programmeringsspråket C#. Eftersom C# är ett objektorienterat

programmeringsspråk kommer även applikationen implementeras enligt den objektorienterade utvecklingsmodellen. Sharepoint är en av huvuddelarna i projektet. Det är en av de två datakällor som ska synkroniseras. All

kommunikation med Sharepointservern sker via Webservices. För

informationsöverföring mellan Sharepoint och applikationen används CAML och XML. Microsoft Sync Framework används för att realisera

synkroniseringsalgoritmen.

2.1 .NET

.Net lanserades år 2000 och är Microsofts ramverk som möjliggör utveckling av Windows applikationer, Web applikationer och Webservices med en uppsjö olika programmeringsspråk och tekniker utan att programmeraren behöva ta hänsyn till detaljer såsom minneshantering och andra lågnivådelar. [20] En av huvudpunkterna med .Net är att ramverket är oberoende av

programmeringsspråk. C# och VB.Net är de två vanligaste

programmeringsspråken för programmering mot .Net, även om andra tekniker kan användas är de inte lika vanliga. På senare tid har ett stort antal språk anpassats för att fungera ihop med .Net, däribland Python och COBOL1.

(11)

.Net ramverket består av två huvudkomponenter [5] : 1. Common Language Runtime (CLR)

2. Class Library

2.1.1 CLR

CLR (Common Language Runtime) är grunden i .Net ramverket och ansvarar för att ladda och exekvera programmet. CLR hanterar:

1. Minnet 2. Trådar 3. Undantag 4. Skräpinsamling

samtidigt som det eftersträvar stabilitet och säkerhet. CLR gör det möjligt för komponenter utvecklade i olika språk att interagera. Exempelvis kan en klass utvecklad i ett visst programmeringsspråk anropas och härledas från en applikation skriven i ett annat språk. [6] Detta är möjligt då kompilatorn använder CTS (Commontype system) för att definiera typer. CTS definierar datatypernas struktur, hur de används i minnet samt deras beteende. Syftet med CTS är att uppnå portabilitet mellan olika programmeringsspråk.

Språkoberoendet i .Net möjliggörs av att den kod som är skriven i till exempel C# eller VB.net inte direkt omvandlas till maskinkod (kod som exekveras av CPU:n) utan konverteras i ett mellanled till ett s.k. generiskt högnivåspråk vid namn CIL (Common Intermediate Language) och lagras i en .NET assembly.

CLI kompileras till plattformsspecifik kod först när den används. Förutom själva koden lagrar en .Net assembly även den metadata som beskriver

datatyperna som finns i CLI-koden. Exempelvis kan metadata beskriva vilka metoder och vilka typer som är implementerade i en klass. CLR behöver enbart tolka CIL-koden och behöver inte ta hänsyn till den ursprungliga koden. När filen sedan används på en viss dator kompileras den av JIT (Just-In-Time) kompilatorn som är en del av CLR. [8]Detta innebär att den slutgiltiga koden kan vara olika beroende på vilken dator den exekveras. När JIT-kompilatorn översätter CLI-instruktioner till maskinkod cachas2 dessa i minnet. Första gången en metod anropas till exempel PrintText(), kompileras CLI-koden till maskinkod. När samma metod anropas igen behöver den då inte kompileras utan körs direkt från cachen. [10] .Net ramverket finns även tillgängligt för handhållna enheter, om än med något färre funktioner som kör en JIT-kompilator anpassad för enheter med begränsade resurser.

2 Cache innebär att saker som används ofta, lagras på en lättåtkomlig plats, för att underlätta åtkomsten

(12)

.Net tillhandahåller även ett verktyg (NGEN) som möjliggör kompilering till maskinkod innan programmet exekveras. Detta steg utförs endast på den dator som slutligen kommer exekvera programmet eftersom datorns egenskaper (minne, processor) tas till hänsyn vid kompileringen. Fördelen med att använda NGEN är att starten vid exekvering tar mindre tid. [9]

Under exekveringen kompileras enbart de metoder som anropas och inte hela filen. Nästa gång samma metod anropas behöver den inte återigen kompileras. Även efter exekveringen fortsätter CLI kontrollera programmet. Figur 2 visar ett exempel på hur C# kod konverteras till maskinkod.

Figur 2: C# kompilering [7]

(13)

2.1.2 Garbage Collector

En av fördelarna med .Net är minneshanteringen. Felaktig hantering av minne är en av de främsta orsakerna till buggar och säkerhetshål i program. .Net befriar programmeraren från ansvaret att manuellt hantera minnet. Detta sköts per automatik av skräpinsamlaren (Garbage Collector) som håller alla öppna objekt under uppsikt och avgör vilka som inte behövs. En viktig anmärkning är att skräpinsamlaren enbart hanterar minnet. Om programmet använder andra resurser måste detta tas till hänsyn och resurserna frigöras av programmeraren. Skräpinsamlaren samlar inte heller objekt som refereras av pekare förrän de har frigjorts.

2.1.3 Klassbibliotek

Klassbiblioteket som är den andra huvuddelen i .Net ramverket är en omfattande objektorienterad samling återanvändbara

klasser/funktioner/metoder som .Net-kompatibla språk kan dra nytta av. Den innehåller metoder för att hantera trådar, I/O, grafiska objekt, interaktion med andra externa enheter. Till exempel finns det metoder för att underlätta arbete mot databaser, hantering av XML-dokument och webbprogrammering.

Biblioteket är uppdelat i hierarkiskt uppbyggda namnrymder (Namespaces) där

System är överst.

2.1.4 C#

C# är ett programmeringsspråk som är baserat på C++ och Java. Det har utvecklats av två Microsoft-ingenjörer, Andreas Hjelsberg och Scott Wiltamuth3 [20]. C# innehåller stöd för strukturerad, objektorienterad, och komponentbaserad programmering. C# innehåller nyckelord för att deklarera nya klasser, metoder och egenskaper samt stöd för att tillämpa inkapsling, arv och polymorfism vilket man kan förvänta sig av ett modernt objektorienterat programmeringsspråk. Klassdefinitioner kräver inte separata headerfiler. C# innehåller också stöd för delegater vilket gör det möjligt att anropa metoder indirekt. Liknande funktionalitet finns i C++ där man har möjlighet att anropa medlemsfunktioner med hjälp av pekare. Delegater används ofta i Windows-programmering för att knyta metoder till händelser.

3

(14)

2.2 Objektorienterad programutveckling

Objektorientering har på senare tid blivit en allt vanligare utvecklingsmodell som stöds av de flesta större programmeringsspråk däribland C#, C++ och Java. Den objektorienterade modellen utgår från de objekt som ingår i ett system snarare än de funktioner som ska utföras. Den traditionella synen på datorprogram brukar kallas för det funktionsorienterade synsättet medan den objektorienterade modellen uppfattar ett datorprogram som en modell av verkligheten. Objektorienterad programutveckling består i huvudsak av tre hörnpelare vilka visas i nedanstående figur.

Figur 3: Objektorienteringens tre hörnpelare

2.2.1 Objekt och Klasser

Objekt är de modeller som representerar verkligheten vilka programmet manipulerar för att utföra en viss uppgift. Objekten har en unik identitet och kan nås via deras namn eller pekare som hänvisar till objektet. Objekt har två typer av egenskaper, attribut och operationer.

Attribut anger objektets tillstånd som kan förändras under exekveringen. Vanligen kapslas attributen in och är inte åtkomliga utifrån och kan enbart ändras av objektets metoder. Detta sätt att dölja information för utomstående är utmärkande för objektorienterad programmering.

Den andra egenskapen, operationer även kallade metoder, är procedurer som objektet använder för att hantera attributen eller utföra andra funktioner. Precis som med attribut är det vanligt att metoder kapslas in.

Metoder och attribut kan deklareras som private, public eller protected. Dessa nyckelord anger hur öppna klassens egenskaper är för omgivningen.

En klass är en mall som beskriver hur objekt med samma uppbyggnad och

(15)

Figur 4: Klassen Fordon och två instanser

I ovanstående figur visas en UML-representation av klassen Fordon med attributen Längd, Bredd, Vikt samt metoderna Kör(), Bromsa(), Sväng(). Bil och

Buss är instanser/objekt av klassen Fordon.

2.2.2 Arv

Arv innebär att man använder en redan definierad klass när en ny klass skapas. Man utgår från den tidigare klassens egenskaper och lägger till nya egenskaper. Därmed är det möjligt att återanvända tidigare konstruerade objekt modifiera dess egenskaper och anpassa dem till den aktuella klassen. Den härledda

klassen ärver alla basklassens attribut och metoder. Genom arv bygger man upp en logisk hierarki mellan klasserna. Vissa programmeringsspråk som

exempelvis C++ tillåter multipelt arv vilket innebär att en klass kan härledas från flera basklasser.

Figur 5: Arv av klassen Fordon

I figur 5 visas ett UML-diagram över en arvshierarki. De lägst stående klasserna i arvshierarkin (Personbil, Lastbil) ärver alla egenskaper från Fordon-klassen.

(16)

2.3 XML

XML (eXtensible Markup Language) är regelverk för strukturering av data. XML-kodad data innehåller förutom själva datat även beskrivning av data vilket möjliggör för externa program att tolka och behandla data. XML

skapades och underhålls av W3C och är ett svar på de begränsningar som finns i HTML och SGML vid överföring av dokument med avancerad struktur över nätet [1]. Styrkan med XML som uppmärkningsspråk är dess utbyggbarhet (eng. extensible) vilket innebär att användaren själv kan skapa nya element och egenskaper vilket inte är möjligt i HTML. XML kan ses som ett metadata-språk för att beskriva uppmärkningsspråk [1]. I grund och botten är XML

strukturerade textdokument och kan skapas med ett enkelt textverktyg som exempelvis Notepad. .Net erbjuder ett antal klasser och verktyg som underlättar arbetet med XML bl.a. klasserna XmlReader och XmlWriter för hantering av XML-strömmar.

2.3.1 Element

XML-dokument är uppbyggda av element i hierarkisk ordning. Element definieras av en start- och en sluttagg. Starttaggen består av ett namn omgivet av vinkelparanteser medan sluttaggen utöver detta även innehåller ett

snedstreck. I nedanstående exempel är Namn ett element.

Den text som står mellan start och sluttagen är själva datat. I det här fallet en enkel textsträng men det kan även bestå av andra element s.k. underelement. I följande exempel är Student ett rotelement som har tre underelement

2.3.2 XML-attribut

Ett XML-attribut är ett värde som anges i XML-elementets starttagg och det innehåller ytterligare information om elementet.

<Namn>Adam</Namn>

<Student>

<Namn>Adam</Namn>

<Adress>Storgatan 17</Adress> <Mail>adam@gmail.com</Mail> </Student>

(17)

2.4 Sharepoint

2.4.1 Vad är Sharepoint

Sharepoint är ett samlingsnamn på en lösning utvecklade av Microsoft som syftar till att underlätta informationsdelning inom organisationer. Sharepoint är som utvecklingsplattform öppen för tredjepartslösningar. Utvecklare har

möjlighet att förbättra redan existerande funktioner eller skapa egna

skräddarsydda lösningar. Sharepoint bygger på Internet information Services.

Den förlitar sig på IIS4 att ta hand om HTTP anrop till port 80. Sharepoint kräver dessutom en SQL-server. Varje Sharepointserver antas vara del av en

farm, bestående av en eller flera servrar som tillhandahåller

Sharepoint-funktionalitet till användarna. I dess enklaste form består en farm av en server med IIS och en SQL-databas. Sharepoint består av hierarkiskt uppbyggda siter

(figur 7). En site är en behållare för information som lagras i form av listor eller dokumentbibliotek. Siten är dessutom en webbapplikation med ett

anpassningsbart UI. Alla siter är en del av en ”site collection” (figur 6).

Figur 6: Exempel på site collection [17]

Figur 7: Exempel på en site

4 IIS är en serverkomponent från Microsoft som erbjuder internetbaserade tjänster såsom HTTP-server

(18)

2.4.2 Sharepoint Web Services

Sharepoint erbjuder ett stort utbud av webservices vilka används för att få åtkomst till Sharepoint-information från fjärrklienter.

Sharepoints webservices anropas på samma vis som vanliga webservices[18]. En referens skapas till Sharepointservern, därefter används referensen som vilken annan namnrymd. För att kunna anropa webservicemetoder måste

användaren vara inloggad. En webservice som använts i det här projektet är List

webservice. Det används för göra insättningar eller hämta data från listor. En

lista kan t.ex. vara en kalender.

När en referens skapats till Webservice anges sedan användaruppgifterna

GetList metoden används för att hämta data från en lista vars GUID anges som

parameter när metoden anropas.

Metoden returnerar ett CAML-fragment.

2.5 CAML

CAML (Collaborative Application Markup Language) är ett XML-baserat språk som används för att bygga och anpassa webbsidor som baseras på

Sharepoint [2]. Dess funktionalitet kan i vissa avseenden även liknas vid SQL. CAML består av ett antal scheman som används för olika ändamål. View

Schemat används för layout och utformning av en sida medan Query Schemat

används för att skicka förfrågningar till Sharepoint och hämta data. CAML-schemat definieras och beskrivs i ett XML-dokument som lagras på Sharepoint servern och finns i:

Local_Drive:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\TEMPLATE\XML [3]

CAML används:

 I programkod, där CAML queries, skickas till de metoder som anropas i antingen Objektmodellen eller via Webservices

 Bygga upp Sharepoint Webbsidor

lService.Credentials = newNetworkCredential(“username”,”password”);

(19)

2.5.1 CAML Queries

Sharepoint erbjuder ett antal olika sätt att hämta data från SharePoint listor till exempel via SharePoint Objektmodell, SharePoint WebServices och

Powershell [4]. I det här projektet används enbart de metoder som erbjuds via Webservices. Därmed kommer alla förfrågningar och datahämtning ske via Webservices. En CAML- förfrågan innehåller precis som andra XML-baserade språk ett rotelement, Query. Utöver detta kan även två andra element anges,

OrderBy och Where, men dessa kan utelämnas. OrderBy anger att de data som

returneras på en viss förfrågan ska sorteras i angiven ordning. Här anges vilka fält som ska sorteras och i vilken ordning.

I ovanstående exempel sorteras fälten först i stigande ordning enligt ”Adress”. Därefter avtagande enlig ”Years” och slutligen i avtagande ordning enligt

”Location”. Fieldref-elementetsyftar på det fält i listan för vilket förfrågan är

avsedd att exekveras. Name-attributet anger fältets namn, men det skulle likväl fungera att använda ID-attributet för att specificera ett fält enligt dess GUID.

Where-elementeti en CAML query kan liknas vid en ”SQL SELECT” förfrågan

och fungerar precis som en sådan, d.v.s. det används för att filtrera data enligt vissa kriterier. I nedanstående Where-förfrågan anges en Geq (Greater or equal) operator, fältnamnet som förfrågan avser, och värdet. (En sammanfattning av operatorerna finns i bilaga 1)

Value-elementet anger värdet för kriteriet. I elementets attribut markeras vilken

typ av data värdet hanteras som. I det här exemplet är det ett nummer. Fler än ett filtervärde kan anges genom att använda And och Or element.

<Query> <Where> <Geq>

<FieldRef Name="Age"/>

<Value Type="Number">25</Value> </Geq>

</Where> </Query>

<OrderBy>

<FieldRef Name="Adress"/>

<FieldRef Name="Years" Ascending="FALSE"/> <FieldRef Name="Location"/>

</OrderBy>

<Query> <Where> <Or> <Neq>

<FieldRef Name="Status"></FieldRef> <Value Type="Text"></Value>

</Neq> <IsNull>

<FieldRef Name="Status"></FieldRef> </IsNull>

</Or> </Where> </Query>

(20)

2.5.2 CAML Query Builder

CAML Query Builder är ett verktyg som är till stor hjälp då man skapar och

testar CAML Queries. Den ger användaren möjlighet att ansluta till Sharepoint-servern antigen via objekt modellen eller Webservices och skapa queries enligt WYSIWYG. Nedanstående bild visar enkelheten i att använda CAML Query Builder

(21)

2.6 Microsoft Sync Framework [12]

Microsoft Sync Framework (härefter MSF) är en synkroniseringsplattform från

Microsoft som möjliggör koordinering av data från olika källor. Med MSF har utvecklare möjlighet att bygga fullständiga ekosystem som integrerar

applikationer och datakällor oberoende av nätverksprotokoll eller datatyp. MSF

är utbyggbart för att hantera alla typer av data, såsom SQL-databaser, filer, nätverksresurser och mobila enheter, oberoende av protokoll över vilket data överförs. Utöver detta erbjuds verktyg för roaming och hantering av data i offline-miljö vilket gör det möjligt för användare att arbeta mot en lokal kopia under den tid de inte är uppkopplade.

MSF har inbyggd funktionalitet för att hantera:

Fel i applikationen – Om applikationen eller datakällan havererar under en synkroniseringssession eller om det uppstår andra hinder som

nätverksfördröjningar, finns det risk att data korrumperas. MSF kan återhämta sig från dessa missöden.

Nätverksavbrott – MSF hanterar eventuella nätverksavbrott som kan tänkas uppstå under en synkroniseringssession.

Konflikthantering – Om ett och samma objekt ändras ”samtidigt” på två eller fler källor uppstår en konflikt (mer om konflikthantering i avsnitt 2.6.4.1)

En av de viktigaste aspekterna med MSF är möjligheten att använda

egenutvecklade synkroniseringsleverantörer (eng. synchronizationprovider). En leverantör är en komponent som ingår i synkroniseringssessionen och

representerar datakällan som synkroniseras. Leverantören fastställer vilka

ändringa som skett i data samt applicerar ändringar från de andra datakällorna.

(22)

2.6.1 Komponenter [19]

MSF består av följande komponenter:

MSF Runtime – SDK, tillåter utvecklare att använda de existerande leverantörer som följer med MSF eller skapa egna.

Metadata verktyg – MSF skeppas med en inbyggd Microsoft CE SQL server samt de verktyg som krävs för att lagra och hantera metadata.

Inbyggda leverantörer – Följande datakällor har inbyggt synkroniseringsstöd i MSF:

o ADO.NET - För synkronisering av databaser o Filer – För synkronisering av filer och kataloger o FeedSync – För synkronisering av RSS-strömmar.

2.6.2 Metadata

Metadata beskrivs ofta som ”data om data”. Metadata kan exempelvis vara det

senaste ändringsdatumet för en fil eller datumet då filen skapades. Om filen innehåller data så är de två ovan nämnda egenskaperna just ”data om data” d.v.s. metadata. MSF använder metadata för att hålla reda på tillståndet för varje objekt som synkroniseras. Plattformen erbjuder en fulländad lösning för

hantering av metadata. Om så krävs finns möjlighet att utveckla en egen metadatastruktur som kan användas i MSF. Metadata kan delas in i tre kategorier:

Versioner (eng. versions) – versioner är information som associeras med varje enskilt objekt som deltar i synkroniseringen. Versionsdata

markerar var och när ett objekt skapats eller när det senast ändrades. Det innehåller även ett unikt ID för varje objekt. Ett objekt kan t.ex. vara en rad i en databas eller som i det här projektet en bokning i en kalender där varje objekt måste ha ett unikt ID. En ”version” består av två

egenskaper, ”creation version”, som anger var och när objektet skapades samt en ”update version” som anger var och när objektet ändrats. Var och

en av dessa två egenskaper innehåller två komponenter:

o Tick Count - Ett värde som identifierar varje enskild ändring Detta värde ökas för varje gång ett nytt objekt skapas eller ändras. o Replica ID – Identifierar den datakälla där ändringen genomfördes. En sammanfattning av en versions olika komponenter visas i Figur 9.

(23)

Figur 9: Versioner är metadata för varje objekt som deltar i synkroniseringen

Kunskap (eng. knowledge) - Är en sammanfattning av de ändringar som

skett i en datakälla. Knowledge består av datakällans ID samt det senaste

Tick count”-värdet. ”Knowledge” används av MSF för att upptäcka

ändringar och konflikter.

Gravstenar (eng. tombstones) - Innehåller information om objekt som

raderats från datakällan. De innehåller ett ID, deletion version, och

creation version.

2.6.3 Exempel

Detta avsnitt är tänkt att ge en generell bild över hur MSF ”tolkar” metadata för att avgöra vilka ändringar som ska appliceras på datakällorna. Nedanstående figur visar de komponenter som ingår i ett system som ska synkroniseras.

Figur 10: Synkronisering mellan DataA och DataB

MSF DataA-Provider DataB-Provider DataA Metadata DataB Metadata DataA DataB Destination Källa Update version Creation version ID Tick Count Replica ID Tick Count Replica ID

(24)

I följande exempel beskrivs hur synkronisering går till. För enkelhetens skull antar vi att två databaser (DataA och DataB) ska synkroniseras. DataA initierar synkroniseringen vilket innebär att DataA är källan och DataB är destinationen. Objekten som synkroniseras är raderna i tabellen vilket illustreras i figur 11. Varje rad har ett unikt ID-nummer i databasen.

Figur 11: Databaser med tillhörande metadata innan synkronisering

Knowledge (en sammanfattning av de ändringar som en datakälla är medveten

om) är för DataA = A4, där A är ett unikt ID för datakällan och 4 är ”tick count”-värdet. DataB=B3. Under synkroniseringen skickar DataB sin knowledge

till DataA. Med hjälp av denna information upptäcks de ändringar som

destinationen inte är medveten om och därefter skickas ändringarna från källan till destinationen. Destinationen använder metadata för att avgöra vilka objekt i DataA som den själv inte är känner till. Här upptäcks också eventuella

konflikter. Därefter begär destinationen de faktiska objekten (raderna) från källan. I det här fallet begärs raderna med ID-nummer 1 och 2. Destinationen sätter in ändringarna i databasen och uppdaterar metadatat. För att uppdatera DataA med ändringar är tillvägagångssättet detsamma fast då byter destination och källa plats. Efter en fullständig synkronisering har både DataA och DataB Knowledge = A4B3, d.v.s. de är synkroniserade. Se figur 12.

(25)

2.6.3.1 Konflikter

Om vi fortsätter på föregående exempel där båda databaserna är synkroniserade och antar att en och samma rad (rad 1) uppdateras i båda databaserna då uppstår en konflikt. Figur 13 visar databaserna och metadatat vid en konflikt.

1. DataB skickar knowledge till DataA.

2. Källan (DataA) behandlar informationen och beräknar de ändringar som ska skickas till destinationen. Den märker även att destinationen inte är medveten om den ändring som skett vid ”tick count” 5 på rad 1.

3. DataB behandlar informationen som skickats från källan och numrerar dess egna ändringar. Nu framgår det att samma rad även uppdaterats i den lokala databasen och det existerar två ändringsversioner för samma rad, A5 och B6. Konflikten har upptäckts.

4. Följande metoder erbjuds för att lösa konflikter a. Källan vinner

b. Destinationen vinner c. Hoppa över ändring d. Slå samman ändringarna e. Spara konflikten

Figur 13: Databaser och metadata efter en konflikt. Knowledge för DataA är (A5, B3) och (A4,B6) för DataB.

(26)

2.7 Utvecklingsmodell

Utvecklingsprocessen i det här projektet påminner närmast om den s.k. Iterativa

utvecklingsmodellen [15].

Den iterativa utvecklingsmodellen bygger på att endast en del av

funktionaliteten implementeras och testas för varje iteration. Varje iteration går igenom hela utvecklingsprocessen, till skillnad från den traditionella

vattenfallsmodellen där varje steg i utvecklingsmodellen endast utförs en gång.

Figur 15 visar den iterativa utvecklingsmodellen.

Nackdelen med vattenfallsmodellen är att förstudien definierar hur slutresultatet kommer bli [13]. Även om noga förstudier görs är det omöjligt att förutse vilka problem som kan uppstå under utvecklingen. Vattenfallsmodellen är helt enkelt för stel för att hantera förändringar.

Vattenfallsmodellen var direkt olämplig i det här projektet då jag vid projektets början varken var fullt insatt i Outlook-programmering eller Sharepoint.

Projektet var mer av ett utforskande slag och revideringar i planeringen och design förekom under hela utvecklingsprocessen. De främsta fördelarna med iterativ utveckling:

Möjliggör ändringar av krav under projektets gång - utökningar av kravspecifikationen under utvecklingen kan vara frustrerande och tidskrävande. Vid iterativ utveckling kan tillägg av funktionalitet ske på ett tidigt stadium.

Designfel upptäcks och korrigeras lättare – fel i applikationen upptäcks i ett tidigt skede eftersom de är enklare att hitta och åtgärda.

Feedback från uppdragsgivaren – uppdragsgivaren har möjlighet att testa lösningens delar under utvecklingen och komma med feedback.

Integration av funktionalitet sker löpande – att integrera de olika komponenterna först i slutet av projektet kan innebära att delar av applikationen måste skivas om. Detta kan i vissa fall motsvara upp till 40 % av det totala arbetet [14].

(27)

Projektets karaktär gjorde det möjligt att skapa och testa funktionalitet utanför huvudprogrammet. Till exempel skapades en klass för hantering av

kalenderinformation i Outlook separat och efter omfattande tester av klassens metoder kunde den inkorporeras i huvudprogrammet. På så vis byggdes programmets funktionalitet ut för varje iteration.

(28)

3 Genomförande

Det här avsnittet beskriver hur arbetet utförts, hur jag gått tillväga för att uppfylla kraven som ställts på applikationen och lösa de problem som uppstått under utvecklingsarbetet.

3.1 Inledning

De första kontakterna med uppdragsgivaren togs via mail. Här diskuterades projektet i allmänna drag, vad som skulle utföras och vilka förutsättningarna var. Uppdragsgivaren förklarade företagets nisch samt deras målsättningar med projektet. Uppdragsgivaren gav även en allmän introduktion i Sharepoint, vilket var till mycket nytta vid tidpunkten då Sharepoint var för mig ett helt obekant och outforskat område.

Vid ett senare tillfälle bestämdes en första träff där det i detalj diskuterades vad som skulle utföras samt vilka verktyg som fanns till förfogande. Vid det här tillfället erhölls en klar bild av uppdraget. Därefter följde en mer teknisk diskussion där tänkbara designmodeller behandlades . Uppdragsgivaren var mycket väl insatt i ämnet och var till stor hjälp vid de större designdragen. Efter det första mötet sammanställdes en preliminär kravspecifikation som godkändes av uppdragsgivaren och handledaren och som låg till grund för anmälan om examensarbete.

Vid slutet av projektet bestämdes ytterligare en träff. Här diskuterades den senaste versionen av programmet samt ändringar och tillägg som skulle göras. Huvuduppgiften med projektet var att bygga en stabil prototyp för

synkronisering mellan Outlook och Sharepoint, funktionalitet skulle därefter läggas till efter behov. Utveckling och förbättring av programmet kommer fortsätta även efter examensarbetets slut.

3.2 Utvecklingsmiljö

Under utvecklingsarbetet krävdes en Sharepointserver mot vilken applikationen kunde designas och testas. Uppdragsgivaren erbjöd en avskild domän mot deras Sharepointserver mot vilken applikationen kunde testas. Tillräcklig behörighet lämnades för åtkomst till servern via webbgränssnittet för att kunna utföra alla de funktioner som egentligen behövdes, skapa listor, hämta data och sätta in data. Av förklarliga skäl begränsades åtkomst till de allra känsligaste

funktionerna på servern. Detta och faktumet att jag inte hade direkt åtkomst till huvudservern för att genomföra eventuella ändringar var avgörande för beslutet att sätta upp en egen virtuell Sharepointserver.

(29)

Vmware Workstation 6.5.1 valdes som virtualiseringslösning då detta för tillfället är ett av de främsta programmen inom området. VMware kan emulera hårdvara för att exempelvis montera ISO-filer som CD-ROM enheter i den virtuella miljön eller .vmk-filer för hårddiskar. VMware gör det möjligt för de virtuella datorerna att få åtkomst till nätverket, antigen genom NAT men de kan även konfigureras för att erhålla egna IP-adresser. Office 2007 installerades på en av de virtuella maskinerna som skulle fungera som testdator för exekvering av applikationen. Efter installationen av de komponenter som krävdes för att exekvera Outlook applikationen i den virtuella testdatorn, togs en s.k.

Snapshot” av datorn. ”Snapshot” i VMware gör det möjligt att återgå till ett

tidigare stadium i en virtuell dator. Detta verktyg var till stor hjälp då de första versionerna av programmet testades vilka bl.a. hade ett antal buggar som medförde att programmet var svårt att radera från systemet. Med hjälp av ”Snapshots” återställdes den virtuella datorn till skedet då datorn var

nyinstallerad. På så vis kunde varje version av applikationen testas utan att de gamla versionerna inverkande. Sammanlagt skapades tre virtuella datorer:

1. Windows 2003, Sharepoint, MS SQL-server 2. Windows XP – MS SQL-server

3. XP – klient

Detta gav full tillgång till Sharepointservern för att utföra eventuella ändringar, fullständiga användarrättigheter och extremt korta svarstider. Installation av SP och annan nödvändig mjukvara fungerade problemfritt. Figur 14 visar

utvecklingsmiljön.

Visual Studio 2008, var det självklara valet av utvecklingsmiljö. Det är ett av de smidigaste verktygen för utveckling i .Net miljö. Den senaste versionen innehåller dessutom VSTO5 (Visual Studio Tools for Office).

5

(30)

3.3 Utveckling

I detta avsnitt behandlas de tekniska aspekterna av projektet, de problem som uppstått samt hur dessa har lösts.

Min huvuduppgift har varit att utveckla metoder som MSF använder för att sätta in, uppdatera och radera objekt i Outlook respektive Sharepoint samt upprätthålla metadatabaser som representerar objekten i datakällorna.

3.3.1 Övergripande bild

I nedanstående bild, figur 16, presenteras huvudkomponenterna som ingår i programmet samt deras respektive ändamål. I efterföljande avsnitt kommer delar av huvudkomponenterna behandlas mer ingående.

2,8 GHz 1 GB Windows Server 2003 SP MS SQL 2005 IIS 192.168.0.109 2,8 GHz 512 MB Windows XP MS SQL 2005 Office 2007 192.168.0.110 2,8 GHz 512 MB Windows XP 192.168.0.111

Intel Core 2 Quad 2,8 GHz 4GB RAM

Windows Vista Visual studio 2008 VMware Workstation 6.5.1

(31)

OutlookAddin4 – Sköter interaktionen med användaren, presenterar ett formulär för användaren, tar emot och behandlar indata från användaren. Den innehåller två hjälpklasser som sparar användaruppgifter till registret och överför metadatafilerna till Sharepointservern.

MySyncProviderOU/ MySyncProviderSP – De två leverantörer (eng.

providers) som representerar respektive datakälla (Outlook och Sharepoint) i

en synkroniseringssession.

Outlook/Calendar – Två hjälpklasser som representerar en bokning i

respektive kalender. De innehåller metoder för att skapa, hämta, uppdatera och radera bokningar i Outlook och Sharepoint-kalendern.

Outlook - Den ena datakällan som ska synkroniseras. Sharepoint – Den andra datakällan.

OU Metadata/ SP Metadata – Metadata för varje datakälla som ingår i synkroniseringen sparas i form av två filer. Metadatat representerar objekten som finns i datakällorna. MSF använder metadata för att avgöra vilka objekt som ska skapas, uppdateras och raderas.

OutlookAddin4 Sync Agent MySyncProviderOU MSF Runtime MSF Runtime MySyncProviderSP Sync Session OU Metadata SP Metadata Outlook Share-point Outlook Calendar

(32)

De två synkroniseringsleverantörerna ”kommunicerar” med varandra under en synkroniseringssession. De är anslutna till en ”Sync agent” som dirigerar

synkroniseringen.”Sync agent” är ansvarig för att initiera och upprätthålla sessionen. I agenten definieras även vilken datakälla som är källan respektive destinationen. I det här projektet är Outlook-kalendern alltid källan och Sharepoint-kalendern

destinationen. Under en synkroniseringssession är dataflödet alltid enkelriktat d.v.s. de två leverantörerna kan inte arbeta samtidigt. En leverantör (källan) skickar ändringar och den andra leverantören (destinationen) applicerar ändringarna.

3.3.2 Exempel – Filsynkronisering

Vi ska först se ett exempel på hur synkronisering av två kataloger fungerar med hjälp av den inbyggda leverantören för filsynkronisering. Den inbyggda leverantören möjliggör med enbart ett par rader kod synkronisering av filer, kataloger, underkataloger på NTFS, FAT och SMB filsystem.

Ovanstående exempel innehåller de komponenter som illustreras i figur 16 och som behövs för en lyckad synkronisering

static void Main(string[] args) {

// FilesyncProvidern initieras

FileSyncProvider kalla = new FileSyncProvider(Guid.NewGuid(), "c:\\katalog1"); FileSyncProvider destination = new FileSyncProvider(Guid.NewGuid(), "c:\\katalog2");

//SynckAgenten skapas

SyncOrchestrator SyncAgent = new SyncOrchestrator();

//I SyncAgenten anges vilken datakälla som är källan och vilken som är destinationen

SyncAgent.LocalProvider = kalla; SyncAgent.RemoteProvider = destination; //Synkronisering Initieras SyncAgent.Synchronize(); }

(33)

3.3.3 Sharepoint och Outlook Provider

Det som gör MSF flexibelt och utbyggbart är möjligheten att skapa egna leverantörer (providers). Leverantörerna fungerar som ett interface för att dölja den underliggande datakällans komplexitet för MSF. För att kunna

synkronisera andra datakällor, förutom de tre som har inbyggt stöd i MSF, krävs en specialanpassad provider.

En leverantörs uppgifter beror på dess tillstånd under synkroniseringen: Destination:

1. Tillhandahåller den lokala datakällans knowledge

2. Ta emot en förteckning av ändringar från källan 3. Upptäcka konflikter

4. Applicera ändringar på den lokala datakällan Källa:

1. Avgör med hjälp av destinationens knowledge de ändringar som behöver skickas till destinationen

2. Skickar förteckning över ändringarna till destinationen

3.3.3.1 Implementering

Det rekommenderade sättet att skiva en egen provider är att implementera

(override) metoder från tre klasser i MSF [16].

1. KnowledgeSyncProvider

2. IChangeDataRetriever (interface)

3. INotifyingChangeApplierTarget (interface)

Ovanstående exempel visar klassdefinitionerna för leverantörerna.

publicclassMySyncProviderSP : KnowledgeSyncProvider, IChangeDataRetrieverINotifyingChangeApplierTarget

{…

publicclassMySyncProviderOU : KnowledgeSyncProvider, IChangeDataRetriever,INotifyingChangeApplierTarget

(34)

Under en vanlig synkroniseringssession anropar MSF följande metoder som ska finnas tillgängliga i den egenutvecklade providern:

Metodnamn Anropas

Uppgift

BeginSession

Båda Informerar providern om att en synkroniseringssession startar

GetSyncBatchParameters

Destination Returnerar knowledge

GetChangeBatch

Källan Avgör med hjälp av destinationen knowledge de ändringar som behöver skickas till destinationen

ProcessChangeBatch

Destination Upptäcker konflikter och applicerar ändringar

LoadChangeData

Källan Skickar de faktiska objekten

SaveItemChange

Destination Objekten sparas i datakällan

StoreKnowledgeForScope

Destination Sparar den nuvarande knowledge

EndSession

Båda Informerar providern om att en synkroniseringssession avslutas

Figur 17: Metoder som anropas av MSF

3.3.4 Inline vs. Asynkron

Innan en synkroniseringssession påbörjas måste vi fastställa att de ändringar som gjorts i datakällan även reflekteras i dess metadata. Det finns två sätt att spåra ändringar och applicera dessa på metadatat.

Inline: Används i de tillämpningar där det är smidigt att lägga till funktionalitet

som uppdaterar metadatat samtidigt som ändringar görs i själva datakällan. Detta kan t.ex. göras i databaser där det är möjligt att med hjälp av ”triggers

uppdatera metadatat i samma skede som en rad ändras. Detta är det enklaste och säkraste sättet att spåra ändringar, däremot är det sällan implementerbart.

(35)

Asynkron: I den här metoden sker uppdateringar i metadata skilt från

ändringarna i datakällan. En separat funktion söker igenom datakällan efter ändringar och uppdaterar metadatat därefter innan synkroniseringssessionen initieras. Metoden används i de fall där det inte är möjligt att uppdatera

metadatat samtidigt som objektet ändras. Det enklaste sättet att spåra ändringar asynkront är att spara tillståndet för ett objekt efter varje synkronisering och sedan jämföra det med objektet innan nästa synkroniseringssession påbörjas Denna metod tillämpas i projektet för att spåra ändringar i Outlook-kalendern och Sharepoint-kalendern. Även om inline-metoden skulle kunna tillämpas i Outlook med events är det omöjligt att implementera något liknande i

Sharepoint med enbart Webservices. Därmed bestämdes att asynkron-uppdatering av metadata skulle användas.

Det har funnits idéer om att använda en funktion som med korta mellanrum kontrollerar om det skett några ändringar i Sharepoint-kalendern. Med denna funktion skulle en inline-liknande metod för uppdatering av metadat kunna tillämpas. För tillfället används enbart den asynkrona metoden vilket kan komma att ändras i framtida versioner av programmet.

3.3.5 Metoder för asynkron uppdatering av metadata

Utöver de metoder som MSF kräver (Figur 17), har de två leverantörerna som implementerats ytterligare tre metoder för att hantera asynkron-uppdatering av metadata.

 SaveLastSyncTime() - Sparar tidpunkten då den senaste synkroniseringen genomfördes

 GetLastSyncTime() – Hämtar tidpunkten då den senaste synkroniseringen genomfördes

 UpdateMetadataStoreWithChanges() – Uppdaterar metadatat

3.3.5.1 UpdateMetadataStoreWithChanges()

Metoden anropas innan varje synkroniseringssession initieras och den

upptäcker om ändringar skett i datakällan efter den senaste synkroniseringen. Exempelvis kan nya bokningar ha lagts till i kalendern, bokningar kan ha ändrats eller tagits bort och dessa ändringar ska även representeras i metadatat. Metoden går efter följande steg:

1. En extern hjälpmetod anropas och hämtar en lista (Dictionary) bestående av ID nummer och det senaste

uppdateringsdatumet för bokningar i kalendern som är högst

en vecka gamla (vi synkroniserar endast den senaste veckans bokningar och framåt).

(36)

2. Alla objekt i metadatabasen markeras som raderade.

3. Om ett ID nummer finns i listan men inte i metadatabasen innebär det att en ny bokning skapats i kalendern. Detta måste då markeras i metadatabasen.

4. Om ett ID nummer finns i listan och i metadatabasen och dess senaste ändringsdatum är efter senaste synkroniseringen innebär det att en uppdatering skett. Därmed måste metadatats

changeversion ändras.

5. Om ett ID nummer finns i listan och i metadatabasen men dess senaste ändringsdatum är äldre än den senaste synkroniseringen innebär det att inga ändringar skett efter senaste

synkroniseringen. Rapportera att objektet fortfarande ”lever”.

6. Alla återstående objekt i metadatabasen kvarstår som raderade (se steg 1).

Det uppstår ett problem när absoluta tidsstämplar används i ovanstående metod. Vi tar för givet att den lokala datorns och Sharepointserverns systemklockor är synkroniserade vilket i de flesta fall inte är riktigt. Detta kan medföra

förödande konsekvenser för synkroniseringen. Problemet löstes genom att ta hänsyn till den tidsskillnad som finns mellan den lokala datorn och Sharepoint-servern när SaveLastSyncTime()anropas.

ItemMetadata MetaDataObjekt = _metadata.FindItemMetadataById(ID); if (MetaDataObjekt == null)

{

MetaDataObjekt = _metadata.CreateItemMetadata(ID, newSyncVersion(0, _metadata.GetNextTickCount())); MetaDataObjekt.ChangeVersion = MetaDataObjekt.CreationVersion;

_metadata.SaveItemMetadata(MetaDataObjekt); }

if (_calendarId.Value.CompareTo(GetLastSyncTime()) > 0) {

MetaDataObjekt.ChangeVersion = newSyncVersion(0, _metadata.GetNextTickCount()); _metadata.SaveItemMetadata(MetaDataObjekt);

}

_ metadata.DeleteDetector.ReportLiveItemById(ID); _metadata.DeleteDetector.MarkAllItemsUnreported();

(37)

3.3.6 ID

För att kunna spåra ett objekt som deltar i synkronisering mellan två datakällor måste objektet kunna identifieras med ett unikt globalt ID-nummer. Det innebär att vi vid insättning av en ny rad i en Sharepoint lista ska kunna ange ID numret för raden. Detta är dock inte möjligt då Sharepoint för varje ny rad automatisk skapar ett ID nummer. Vi har därmed ingen möjlighet att själva bestämma ID-numret. Problemet löstes genom att skapa ett gömt fält (SQLID) i kalenderlistan som används för att lagra det globala ID-numret. Varje rad i kalendern består därmed av två ID-nummer, det som används internt av Sharepoint och det globala som används vid synkronisering.

Vid första synkroniseringen kontrolleras om SQLID finns, annars skapas det automatisk.

På samma vis skapas en ”Itemproperty” vid namn SQLID2 för varje bokning som finns i Outlook kalendern. Varje objekt i kalendern innehåller de vanliga egenskaperna såsom ”Ämne”, ”Beskrivning”och ”Starttid”. Outlook erbjuder möjlighet att lägga till ytterligare egenskaper med hjälp av Add-metoden för varje objekt.

3.3.7 Outlook och Calendar

Outlook och Calendar är två hjälpklasser till MySyncProviderOU respektive

MySyncProviderSP och ansvarar för all informationsöverföring mellan datakällorna. Klasserna fungerar som ett lager mellan leverantörerna och datakällornas komplexitet. De utför grundläggande operationer såsom skapa, hämta, uppdatera och ta bort bokningar från Outlook respektive Sharepoint kalendern. (I bilaga 2 visas en sammanfattning av klassernas egenskaper)

ndNewFields.InnerXml = "<Method ID='1'>

<Field Type='Text' Hidden='TRUE' DisplayName='SQLID' FromBaseType='TRUE'/> </Method>";

lService.UpdateList(listName, ndProperties, ndNewFields, null, null, null);

(38)

3.3.7.1 Outlook

Create() – Skapar en ny bokning i Outlooks huvudkalender. Klassens

egenskaper överförs till den nya bokningens motsvarigheter.

dsffsdfsdfdshgjghjghjghj

Update() – Uppdaterar en bokning med ett visst ID-nummer. Här används den

inbyggda funktionen Find() för att hitta bokningen baserat på ID-numret.

Delete() – Raderar en bokning från Outlooks kalender baserat på SQLID. publicvoid Create()

{

AppointmentItem oAppointment= null;

oAppointment = (AppointmentItem)MyApplicationInstance.CreateItem(OlItemType.olAppointmentItem); oAppointment.ItemProperties.Add("SQLID2", OlUserPropertyType.olNumber, true, true);

oAppointment.ItemProperties["SQLID2"].Value = m_SQLID; oAppointment.Subject = m_Title; oAppointment.Body = m_Description; oAppointment.Location = m_Location; oAppointment.Start = m_EventDate; oAppointment.End = m_EndDate; oAppointment.Location = m_Location;

oAppointment.Sensitivity = OlSensitivity.olNormal;

oAppointment.ReminderMinutesBeforeStart = ReminderMinutesBeforeStart; oAppointment.Save();

oAppointment = null; }

publicvoid Update() {

AppointmentItem oAppointment2 = (AppointmentItem)oItems.Find("[SQLID2] = '" + m_SQLID + "'"); if (oAppointment2 != null) { oAppointment2.Subject = m_Title; oAppointment2.Body = m_Description; oAppointment2.Location = m_Location; oAppointment2.Start = m_EventDate; oAppointment2.End = m_EndDate; oAppointment2.Location = m_Location; oAppointment2.ReminderSet = false;

oAppointment2.Sensitivity = OlSensitivity.olNormal;

oAppointment2.ReminderMinutesBeforeStart = ReminderMinutesBeforeStart; oAppointment2.Save(); } oItems = null; oAppointment2 = null; }

publicvoid Delete() {

Items oItems = MyCalendarItem.Items;

AppointmentItem oAppointment2 = (AppointmentItem)oItems.Find("[SQLID2] = '" + m_SQLID + "'"); oAppointment2.Delete();

oItems = null; oAppointment2 = null; }

(39)

3.3.7.2 Calendar

Create() – Skapar en bokning i Sharepointkalendern. Webservicemetoden,

UpdateListItems tar emot ett XML-dokument med instruktioner.

Delete() – Raderar en bokning från Sharepointkalendern. Här anropas en

hjälpmetod för att konvertera objektets SQLID till ID numret som används i Sharepoint kalendern.

3.3.8 OutlookAddin4

OutlookAddin4 är den del av applikationen som binder samman alla

komponenter. OutlookAddin4 initierar synkroniseringen och interagerar med användaren. Dess huvuduppgifter är:

 Presentera UI för användaren och hantera input.

 Ladda/Spara inloggningsuppgifter

publicvoid Create() {

StringBuilder sb = newStringBuilder();

sb.Append("<Method ID=\"1\" Cmd=\"New\">"); sb.Append("<Field Name=\"ID\">New</Field>");

sb.Append("<Field Name=\"SQLID\">"+m_SQLID+"</Field>"); sb.Append("<Field Name=\"Title\">" + m_Title + "</Field>");

sb.Append("<Field Name=\"EventDate\">" + m_EventDate + "</Field>"); sb.Append("<Field Name=\"EndDate\">" + m_EndDate + "</Field>"); sb.Append("<Field Name=\"Description\">" + m_Description + "</Field>"); sb.Append("<Field Name=\"Location\">" + m_Location + "</Field>");

sb.Append("<Field Name=\"Reminder\">" + ReminderMinutesBeforeStart.ToString() + "</Field>"); sb.Append("</Method>");

XmlDocument xDoc = newXmlDocument(); XmlElement xBatch = xDoc.CreateElement("Batch"); xBatch.InnerXml = sb.ToString();

lService.UpdateListItems(listName, xBatch);

}

publicvoid Delete() {

StringBuilder sb = newStringBuilder();

sb.Append("<Method ID=\"1\" Cmd=\"Delete\">"); sb.Append("<Field Name=\"ID\">");

sb.Append(this.SQLIDtoID()); sb.Append("</Field>"); sb.Append("</Method>");

XmlDocument xDoc = newXmlDocument(); XmlElement xBatch = xDoc.CreateElement("Batch"); xBatch.InnerXml = sb.ToString();

lService.UpdateListItems(listName, xBatch);

(40)

 Kontrollera inloggningsuppgifter

 Ladda upp/ner metadata

 Initiera synkroniseringsloopen

3.3.8.1 UI

Under det första mötet med uppdragsgivaren diskuterades i vilket form applikationen skulle tillämpas. Alternativen som granskades var att

programmet skulle köras som ett separat program, en tjänst i Windows eller ett tillägg (Addin) i Outlook. Men efter att utvärderat alternativen ansågs det lämpligast att implementera programmet i form av ett tillägg till Outlook då tanken är att programmet ska uppfattas som en utökning av Outlooks

funktionalitet snarare än ett separat program.

För att underlätta åtkomsten till applikationen placerades en knapp (Sync) i Outlooks menyrad. Se figur 18.

Figur 18: Outlook Meny

Då programmet startas anropas följande funktion som skapar knappen i menyn. Knappen binds till ett event som anropar en funktion för att visa Formuläret som visas i figur 19.

privatevoid CreateButton() {

firstButton = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); firstButton.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;

firstButton.Caption = "Sync"; firstButton.Tag = "Sync";

firstButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonClick); }

(41)

Figur 19: Formuläret där användaren anger inställningar för synkronisering

I formuläret som visas anger användaren adressen till Sharepointservern, inloggningsuppgifterna och andra inställningar gällande synkroniseringen. Ett önskemål från uppdragsgivaren var att implementera en ”kom ihåg mig”-funktion som sparar inloggningsuppgifterna efter att användaren loggat in. Det ansågs lämpligast att spara användaruppgifterna i registret och det var

uppenbart att uppgifterna behövde krypteras. Ett problem som uppstår vid kryptering och dekryptering av data är att det behövs en krypteringsnyckel vilket urholkar själva syftet med ”kom ihåg mig”-funktionen.

Ovanstående funktion krypterar känsligt data. Som krypteringsnyckel används den inloggade användarens ”Användarprofil”. På så vis försäkras att enbart denna användare sedan kan dekryptera det sparade datat från registret, dessutom behöver användaren inte hålla reda på en krypteringsnyckel.

byte[] encryptedData =

(42)

3.3.8.2 Synkronisering

Användaruppgifterna kontrolleras mot Sharepointservern och om dessa stämmer anropas en metod som laddar ner metadatafilerna från

Sharepointservern till C:\. Därefter skapas en ny tråd i vilken

synkroniseringsloopen körs. I nedanstående exempel ser vi hur leverantörerna MySyncProviderOU, och MySyncProviderSP används. UpdateMetadataStoreWithChanges() anropas

för respektive leverantör för att uppdatera metadatabaserna med de senaste ändringarna innan synkroniseringssessionen startar. För att loopen inte ska blockera hela programmet körs den i en egen tråd.

MySyncProviderOU outlookP = newMySyncProviderOU("OutlookP", OUMetadata);

MySyncProviderSP sharepointP = newMySyncProviderSP(lService, listName, "sharepointP", SPMetadata); while (!_shouldStop)

{

outlookP.UpdateMetadataStoreWithChanges(); sharepointP.UpdateMetadataStoreWithChanges(); SyncOrchestrator agent = newSyncOrchestrator(); agent.LocalProvider = outlookP;

agent.RemoteProvider = sharepointP;

agent.Direction = SyncDirectionOrder.DownloadAndUpload; agent.Synchronize();

Thread.Sleep(Sleeptime); }

(43)

3.4 Dataflöde

Ett besvärande och hämmande problem för förståelsen för hur MSF samverkar med de egenimplementerade metoderna är att inte kunna följa dataflödet

genom hela programmet. I de flesta egenutvecklade applikationer är det möjligt att med hjälp av Visual Studios Debug-verktyg ”stega sig igenom”

applikationen och följa exekveringen från start till slut men i det här fallet är det inte möjligt att ”debugga” och följa exekveringen i MSF-Runtime. För att överkomma detta hinder har utskrifter placerats i klassernas metoder för att på så vis någorlunda kunna följa exekveringen. Nedanstående figur visar exempel på utskrifter under synkroniseringen.

(44)

4 Resultat

Utvecklingsarbetet har resulterat i en stabil och lätthanterlig ”Addin” i Outlook som möjliggör tvåvägs synkronisering mellan Outlooks huvudkalender med en angiven kalender i Sharepoint. All interaktion med programmet sker direkt från Outlook då det ansågs viktigt att applikationen uppfattades som en utökning av Outlooks funktionalitet snarare än ett separat program.

Applikationen är uppbyggd av olika delar som samarbetar för att utföra uppgiften. Huvudidén med det nuvarande programmet är att den ska fungera som en stabil och utbyggbar plattform för att i framtiden kunna lägga till nya komponenter och utöka synkroniseringsalgoritmen till att även inkludera andra delar av Outlook, t.ex. ”Kontakter”.

Under utvecklingen har ett antal verktyg används. För att kunna installera och köra programmet på en dator krävs att de komponenter som används i

applikationen finns tillgängliga på värddatorn. Följande komponenter krävs för att kunna installera och köra programmet:

 Windows Installer 3.1

 .Net Framework 3.5

 2007 Microsoft Office Primary Interop Assemblies

 SQL Server Compact 3.5

 Visual Studio Tools for the Office 3.0 Runtime

 MSF – Services / Runtime

4.1 Installation

För att förenkla installationsprocessen för slutanvändaren används Microsofts

ClickOnce-teknik som smidigt installerar programmet och de komponenter som

krävs. Det slutgiltiga programmet levereras i form av en installationsfil ihop med ett par kataloger som visas i figur 21. ”2007 Microsoft Office Primary Interop Assemblies” och ” MSF – Services/Runtime” är de två filer som levereras tillsamman med installationsprogrammet. De övriga komponenterna laddas ner från nätet vilket gör att installationsfilerna har en sammanlagd storlek på strax under 10 MB.

(45)

Figur 21:Installationsfilerna

När användaren startar ”setup.exe” påbörjas installationen,

Installationsprocessen är enkel och intuitiv och användaren klickar sig fram genom installationen som i vilket annat program som helst.

En del av de komponenter som krävs laddas ner automatiskt.

”Windows Installer 3.1” kräver en omstart av dator. Efter omstart fortsätter installationen automatiskt vilket visas i nedanstående bild.

(46)

4.2 Användning av tjänsten

När Outlook startar så startas även tilläget automatiskt (figur 23).

Figur 23: Tillägget installerat

Användaren anger adressen till Sharepointservern, användarnamnet och lösenordet. Dessa uppgifter behöver endast anges en gång därefter sparas de i registret om användaren önskar så. Enligt överenskommelse med

uppdragsgivaren synkroniserar Outlook-kalendern med en kalender i Sharepoint vars namn baseras på användarnamnet. I ovanstående exempel kommer applikationen synkronisera mot en kalender i Sharepoint vid namn ”goran”.

Om felaktiga användaruppgifter anges eller det saknas en kalender som heter ”goran” i Sharepoint underrättas användaren.

Användaren anger hur ofta synkroniseringen ska ske, vart 5,10,20 eller 30 minut. Här anges också hur konflikter ska hanteras. Vid en konflikt kan

användaren välja att behålla den ändring som skett i Sharepointkalendern eller Outlookkalender. Ett tredje alternativ är att behålla båda ändringarna.

Efter inloggning och lyckad synkronisering visas tidsskillnaden mellan den lokala datorn och Sharepointservern samt när den senaste synkroniseringen genomfördes i det nedersta vänstra hörnet. I figur 24 visas formuläret efter inloggning.

(47)

Figur 24: Lyckad inloggning

Efter att ha loggat in har användaren möjlighet att spara inloggningsuppgifterna i krypterad form i registret (figur 25). De laddas in automatiskt nästa gång programmet startas.

References

Related documents

We introduce the concept of an entry which provides necessary information regarding the resource and the metadata for successful management in SCAM.. With this definition it is

► Antal frågor i enkäten: 37 st (en och samma fråga kan inkludera upp till 15 olika bedömningspunkter) Enkäten integrerades som en länk i ett mailutskick till webbpanelen, och

By reactivating experimental filmmaker Peter Kubelka’s concept sync event and its aesthetic realisation in Unsere Afrikareise (Our Trip to Africa, Peter Kubelka, 1966) the

Två informanter förklarade även att det finns många olika vägar in i de kriminella gängen och ytterligare en informant menade att vissa gäng rekryterar mycket

Den andra frågeställningen handlar om vilken inställning aktörerna har till att vidareutveckla samverkan och vilka drivkrafter som de anser vara viktiga för att utveckla

Ett vanligt exempel på skrivbordskontroll kan vara att skatteverket reagerar på ett före- tag som redovisat ovanligt stor ingående moms en period. Skatteverket gör då en

• Alfa- , beta- och gammastrålning kallas gemensamt för joniserande strålning. • Om det händer i kroppen kan jonerna bilda

Bara för att Tobago är ett naturreservat så betyder inte det att turismen som bedrivs på Tobago av till exempel Apollo bidrar till hållbar utveckling, framför allt inte om de