AdvisorEvents.com Building WorkFlow Solutions with Windows SharePoint Services Patrick Tisseghem...

29
AdvisorEvents.com Building WorkFlow Solutions with Windows SharePoint Services Patrick Tisseghem ([email protected] ) MVP SharePoint Portal Server 2003 U2U ALS310

Transcript of AdvisorEvents.com Building WorkFlow Solutions with Windows SharePoint Services Patrick Tisseghem...

AdvisorEvents.com

Building WorkFlow Solutions with Windows SharePoint Services

Patrick Tisseghem ([email protected])MVP SharePoint Portal Server 2003U2U

ALS310

AdvisorEvents.com

Me.About()

Managing Partner U2U .NET Development Training and Services MVP SharePoint Portal Server

My work? SharePoint Development Workshops Community Work

SmartPart CAML Query Builder SharePoint Application Blocks Blog – http://blog.u2u.info/patrick

EMEA Ascend Trainings 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

Limitations No parallel or serial approval routes No actions available

AdvisorEvents.com

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

.NET class library implementing the IListEventSink interface

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

AdvisorEvents.com

Sample we will work out

Speakers

SpeakerDocument Library

1

2

PublicDocument Library

ReviewersDocument Library

6

.NET Assembly3

Reviewers

List

4

Reviewers

7

5

.NET Assembly

8

11

10

12

Everyone

13

9

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 C# or VB.NET Take care of your namespace

Set Reference to Microsoft.SharePoint.dll

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 Checkin, Checkout, Copy, Delete, Insert, Invalid,

Move, Update, UnCheckout 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")){}

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

U2U CAML Query Builder Utility 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();

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

Ways of copying or moving SPFile.CopyTo method

SPFile.MoveTo 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);

web.Lists.IncludeRootFolder=true;SPList reviewerLib = web.Lists["Reviewer Library"];SPFile doc = web.GetFile(listEvent.UrlAfter);

AdvisorEvents.com

Copying Document and Updating MetaData

Problem: Part of the auditing information is overwritten

with CopyTo and MoveTo Reason:

Your code is executed with the account of the worker process!

Solution: 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);

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 Create a public/private keypair using sn.exe Point to snk file within assemblyinfo file in project

Deploy the assembly in the GAC 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

SharePoint SiteSharePoint Site

SharePoint Doc.Lib.SharePoint Doc.Lib.

SharePoint Doc.Lib.SharePoint Doc.Lib.

Workflow EngineWorkflow Engine

XMLXMLDocument Library Event HandlerDocument Library Event Handler

AdvisorEvents.com

Summary

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

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

Learn the object model before you start Think about re-usability (e.g. WorkFlow Lite

approach) Many third-party solutions are available

K2 WorkFlow Captaris Teamplate Skelta WorkFlow Nintex SmartLibrary

AdvisorEvents.com

ADVISOR LIVE Web Update Page

AdvisorEvents.com/cmt0506p.nsf/w/cmt0506ud

This session WILL NOThave updates.

AdvisorEvents.com

Thank you!

Please remember to fill out your evaluation.