Building WorkFlow Solutions with Windows SharePoint Services
Patrick Tisseghem ( MVP SharePoint Portal Server 2003 U2U

  

Managing Partner U2U .NET Development Training and Services MVP SharePoint Portal Server My work?
 

SharePoint Development Workshops Community Work
   

EMEA Ascend Trainings
 

SmartPart CAML Query Builder SharePoint Application Blocks Blog – Office smart client Trainings Portal Boot camps and Workshops

   

Workflow out of the box – Is it enough? Creating a custom workflow solution SharePoint Workflow Application Block (SWAB) Summary

Workflow out of the box

Covers only the basic content approval steps How it works

 

Turn on content approval at the level of the document library or form library Appoint users the role of approvers Submissions will not be visible until approver comes in and approves or rejects No parallel or serial approval routes No actions available

 

What do we miss?
   

Serial or parallel approval routes Dynamic list of approvers Notifying approvers via emails Richer support for supplying comments when approving or rejecting Tracking and logging of the workflow steps

Creating a Custom WorkFlow Solution

 

Quick overview of classes within the WSS object model we will use Preparing the SharePoint-enabled virtual server Creating a document library event handler

  

Signing the assembly and deployment in the GAC Attaching the assembly to the document library Testing and debugging

.NET class library implementing the IListEventSink interface Adding our code

Sample we will work out
1 2


Speaker Document Library


.NET Assembly

5 6 9 7 4

Reviewers Document Library
8 12


Reviewers List

.NET Assembly




Public Document Library

Object Model Refresher
   

SPSite SPWeb SPList SPDocumentLibrary

   

SPListItem SPFolder SPFileCollection SPFile

Time to get into the code…

Preparing our Virtual Server
    

SharePoint Central Administration Configure Virtual Server Settings Select your Virtual Server Virtual Server General Settings Turn on Event Handlers

Creating the Event Handler

Normal .NET Class Library
 

Set Reference to Microsoft.SharePoint.dll

C# or VB.NET Take care of your namespace

Implement IListEventSink
 

OnEvent member to implement SharePoint provides you context information through the SPListEvent type argument Common properties we will use

Type, Site, PropertiesAfter, URLAfter

using System; using Microsoft.SharePoint; namespace Advisor.WorkFlow.Demo { public class SpeakerDocHandler: IListEventSink { public void OnEvent(SPListEvent listEvent) { } } }

Checking Type of Event and Item Metadata


Note: your code gets notified after the event has fired Use PropertiesAfter to check value of column
if((listEvent.Type==SPListEventType.Update) && (listEvent.PropertiesAfter["Status"].ToString()=="Ready For Review")) { }

Checkin, Checkout, Copy, Delete, Insert, Invalid, Move, Update, UnCheckout

Lookup Reviewer

Two possibilities here
 

Object model drill-down CAML query

SPWeb web = listEvent.Site.OpenWeb("/advisor"); SPList list = web.Lists["Reviewers"]; SPUser reviewer = null; foreach(SPListItem item in list.Items) { if(item.ID==Convert.ToInt32(listEvent.PropertiesAfter["Track"])) { string[] reviewerTmp = item["Reviewer"].ToString().Split(';'); int reviewerID = int.Parse(reviewerTmp[0]); reviewer = web.Users.GetByID(reviewerID); } }

Lookup Reviewer

CAML Query

SPQuery class Build your query in a WYSIWYG way Helper class to execute query
U2U.SharePoint.CAML.Server.Helper caml = new U2U.SharePoint.CAML.Server.Helper(camlFile,track) DataTable tbl = caml.ExecuteQuery();

U2U CAML Query Builder Utility
 

CAML Query Builder Utility

Free tool available from

Sending the Email
 

Reviewers can subscribe to alerts Programmatically sending the email
 

System.Web.dll System.Web.Mail namespace

if(reviewer!=null) { SmtpMail.SmtpServer = SMTPServer; SmtpMail.Send(fromEmail, reviewer.Email,"Presentation to review", "A new presentation is ready for your review"); }

Copying Document and Updating MetaData

Using UrlAfter property of SPListEvent to quickly grab the SPFile object
web.Lists.IncludeRootFolder=true; SPList reviewerLib = web.Lists["Reviewer Library"]; SPFile doc = web.GetFile(listEvent.UrlAfter);

Ways of copying or moving

SPFile.CopyTo method

web.Lists.IncludeRootFolder=true; SPList reviewerLib = web.Lists["Reviewer Library"]; SPFile doc = web.GetFile(listEvent.UrlAfter); doc.CopyTo(reviewerLib.RootFolder.Url + "/" + doc.Name,true);

SPFile.MoveTo method

Copying Document and Updating MetaData



Part of the auditing information is overwritten with CopyTo and MoveTo Your code is executed with the account of the worker process! Read the file content and add a new SPFile object manually to the SPFileCollection of the destination folder


SPFolder fld = reviewerLib.RootFolder; SPFileCollection files = fld.Files; files.Add(fld.Url + "/" + doc.Name, doc.OpenBinary(), doc.Author, doc.ModifiedBy, doc.TimeLastModified, doc.TimeCreated);

Copying Document and Updating MetaData
 

Use the Item collection Don’t forget the Update() method call
doc.Item["Status"] = "Currently in Review"; doc.Item.Update();

Deploying the Event Handler

Strong name the assembly
 

Deploy the assembly in the GAC
 

Create a public/private keypair using sn.exe Point to snk file within assemblyinfo file in project Drag and drop Gacutil.exe /i

  

Use fixed version number IISReset is required to test latest copy C# can use postbuildevent in VS.NET

Activating the Event Handler
 

Advanced settings of document library Avoid typing mistakes

Use .NET Reflector (

Full Strong Name Full Class Name

Exceptions and Debugging

SharePoint user is not confronted with unhandled exceptions Developers need to consult application log in event viewer to get description of exception Use VS.NET to attach to ASP.NET worker process that runs your code and set breakpoints

Things to be aware of

  

Event-handlers can only be attached to document and form libraries, not to lists Code runs asynchronously in new thread Events are notified after the action has occurred Code is executed with account of the application pool
  

Impersonation within code (P/Invoke) Execute your code in COM+ application Execute your code in a Web Service

WorkFlow Lite
 

Available for free on GotDotNet Doing the same things we have done but in a more configurable, generic manner

Workflow Application Block
Document Library Event Handler XML

SharePoint Site SharePoint Doc.Lib.

Workflow Engine

SharePoint Doc.Lib.


Library Event Handlers are a great way to extend the functionality of a SharePoint document library or form library

 

Learn the object model before you start Think about re-usability (e.g. WorkFlow Lite approach) Many third-party solutions are available
   

Not only workflow, also e.g. version pruning, providing undelete functionality, …

K2 WorkFlow Captaris Teamplate Skelta WorkFlow Nintex SmartLibrary

ADVISOR LIVE Web Update Page

This session WILL NOT have updates.

Thank you!
Please remember to fill out your evaluation.