ALS310

Building WorkFlow Solutions with Windows SharePoint Services
Patrick Tisseghem (patrick@u2u.net) MVP SharePoint Portal Server 2003 U2U

AdvisorEvents.com

Me.About()
  

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 – http://blog.u2u.info/patrick Office smart client Trainings Portal Boot camps and Workshops

AdvisorEvents.com

Agenda
   

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

AdvisorEvents.com

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
AdvisorEvents.com

Limitations
 

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

AdvisorEvents.com

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

AdvisorEvents.com

Sample we will work out
1 2

Speakers

Speaker Document Library

3

.NET Assembly

5 6 9 7 4

Reviewers Document Library
8 12

Reviewers
11

Reviewers List

.NET Assembly

10

13

Everyone

Public Document Library

AdvisorEvents.com

Object Model Refresher
   

SPSite SPWeb SPList SPDocumentLibrary

   

SPListItem SPFolder SPFileCollection SPFile

AdvisorEvents.com

Time to get into the code…

AdvisorEvents.com

Preparing our Virtual Server
    

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

AdvisorEvents.com

Creating the Event Handler

Normal .NET Class Library
 

Set Reference to Microsoft.SharePoint.dll

C# or VB.NET Take care of your namespace

AdvisorEvents.com

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) { } } }

AdvisorEvents.com

Checking Type of Event and Item Metadata

SPListEventType

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

AdvisorEvents.com

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); } } AdvisorEvents.com

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
 

AdvisorEvents.com

CAML Query Builder Utility

Free tool available from http://www.u2u.info/sharepoint

AdvisorEvents.com

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"); }

AdvisorEvents.com

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
AdvisorEvents.com

Copying Document and Updating MetaData

Problem:

Reason:

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

Solution:

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

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();

AdvisorEvents.com

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

Notes
  

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

Activating the Event Handler
 

Advanced settings of document library Avoid typing mistakes

Use .NET Reflector (www.aisto.com)

Full Strong Name Full Class Name

AdvisorEvents.com

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

AdvisorEvents.com

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

AdvisorEvents.com

WorkFlow Lite
 

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

AdvisorEvents.com

Workflow Application Block
Document Library Event Handler XML

SharePoint Site SharePoint Doc.Lib.

Workflow Engine

SharePoint Doc.Lib.

AdvisorEvents.com

Summary

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

AdvisorEvents.com

ADVISOR LIVE Web Update Page

AdvisorEvents.com/cmt0506p.nsf/w/cmt0506ud

This session WILL NOT have updates.

AdvisorEvents.com

Thank you!
Please remember to fill out your evaluation.

AdvisorEvents.com