Saturday, May 8, 2010

Making your SharePoint 2010 Applications ECM Aware (Part One)

SharePoint 2010 has many new Enterprise Content Management (ECM) features. Document sets, which give you the ability to aggregate documents into a cohesive set based on common metadata attributes. “In Place” records management, giving users the ability to declare a document located anywhere as a record and apply corporate policies to that document.  “Document ID” service, which applies a unique ID to all documents which can be used to locate that document within a site collection. Finally, the “Content Organizer” which enables companies to centrally apply rules to incoming documents so they can be routed to the appropriate document libraries within a site collection.

This multi-part series will explain how you can use new and existing coding techniques to enable your SharePoint applications to take advantage of these new SharePoint ECM capabilities. The series will illustrate both server side and client side code to accomplish this.

The Content Organizer

The content organizer feature in SP2010 allows administrators to set up routing rules based on content types and metadata to organize incoming documents. This feature entails the use of a “drop off library” where incoming documents are submitted and evaluated using the rules.  So if your application submits documents to a document library then you must determine if the site collection is using a content organizer and whether the document library is a target of a content organizer rule. Once this determination has been made you must then upload your document to the “drop off library” so it can be routed correctly. The first thing your application must determine is if the content organizer is enabled and if users are allowed to bypass the “drop off library” . These settings can be seen in “Content Organizer Settings” under “Site Administration” in “Site Settings”.

Below is a server side code which determines if the content organizer is enabled and if it is being enforced. The code uses the Microsoft.Office.Policy.dll and the new EcmDocumentRoutingWeb class. You want to first determine if content organizing is being enforced for a particular SharePoint site. The code will check the “client_routerEnforceRouting” SPWeb property. Once this is determined that the user does not have the option to override the drop off library, then the second piece of code determines if the document library is a target of a content organizer rule. If the code determines it is, then the third piece of code will return the url to the “drop off library” so you can submit the document there.

public static bool IsContentOrganizerEnforcedForWeb(string webUrl)
{

            bool enforced = false;

            using (SPSite site = new SPSite(webUrl))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    if (web.Properties.ContainsKey("client_routerEnforceRouting"))
                    {
                        object enforce = web.Properties["client_routerEnforceRouting"];
                        if (enforce.ToString().Equals(bool.TrueString,
                            StringComparison.OrdinalIgnoreCase))
                            enforced = true;
                    }

                }

            }

            return enforced;

}

 

public static bool IsContentOrganizerEnforcedForLibrary(string webUrl, string libraryName)
{

            bool enforced = false;

            if (IsContentOrganizerEnforcedForWeb(webUrl))
            {

                using (SPSite site = new SPSite(webUrl))
                {
                    using (SPWeb web = site.OpenWeb())
                    {
                        EcmDocumentRoutingWeb edrw =
                            new EcmDocumentRoutingWeb(web);

                        enforced =
                            edrw.RoutingRuleCollection.IsTargetLibrary("/" + libraryName);

                    }

                }

            }

            return enforced;

}

 

public static string GetDropOffLibraryUrl(string webUrl)
{

           string dropOffUrl = string.Empty;

           using (SPSite site = new SPSite(webUrl))
           {
               using (SPWeb web = site.OpenWeb())
               {
                   EcmDocumentRoutingWeb edrw =
                       new EcmDocumentRoutingWeb(web);

                   dropOffUrl = edrw.DropOffZoneUrl;
               }

           }

           return dropOffUrl;

}

 

The Content Organizer and remote applications

The previous code will work with web parts or asp.net applications running on a SharePoint server. However, you may have a desktop application not running on a SharePoint server or a silverlight application that requires you to access SharePoint remotely. If this is the case, then you can use a combination of the SharePoint client object model and the Official web service to accomplish the same thing. The first example of code uses the Microsoft.SharePoint.Client.dll which enables you to access a subset of the SharePoint server object model remotely. It basically does the same thing as the previous IsContentOrganizerEnforedForWeb method.

public static bool IsContentOrganizerEnforced(string webUrl)
{

           bool enforced = false;

           ClientContext context =
               new ClientContext(webUrl);

           Web web = context.Web;
           context.Load(web);

           PropertyValues pv = web.AllProperties;
           context.Load(pv);
           context.ExecuteQuery();

           if (pv.FieldValues.ContainsKey("client_routerenforcerouting"))
           {
               object enforce = pv.FieldValues["client_routerenforcerouting"];
               if (enforce.ToString().Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase))
                   enforced = true; 
           }

           return enforced;

}

This code would be called first to determine if the content organizer is being enforced. In order to determine if the document library is a target of content organizer rule and get the url to the “drop off library”, then you can call the the Official web service’s GetFinalRoutingDestinationFolderUrl method. It takes the target document library’s full url along with a file name, for example, “http://basesmc2008/shared documents/whatever.txt” and will return either “http://basesmc2008/shared documents/whatever.txt” if it is not a target or “http://basesmc2008/dropofflibrary/whatever.txt” (localized) if it is a target. The strange thing is, the method needs a complete url to an item or document for it to work. This was a change from RC to RTM.

public static string GetDropOffLibraryUrll(string documentLibraryUrl)
{
            official.RecordsRepository rr = new official.RecordsRepository();
            rr.Url = "http://basesmc2008/_vti_bin/officialfile.asmx";
            rr.UseDefaultCredentials = true;
            official.DocumentRoutingResult dr =
                rr.GetFinalRoutingDestinationFolderUrl(null, null, documentLibraryUrl);

            string url = dr.Url;
            return url;

}

This all can be accomplished the same way with a silverlight application by just using the Microsoft.SharePoint.Silverlight.dll along with the Official web service. The only change is the code must be called asynchronously.

So now you have all the code you need to make your applications “Content Organizer” aware and to make sure you upload your documents to the appropriate document library, so your application can participate in a company’s taxonomy rules.

In the next part of this multi-part post I will explain how you can determine if a document is part of a document set and how to add a document to a document set in SharePoint 2010.

2 comments:

Anonymous said...

Thanks !

Christopher Scolt said...

Hi Steve,

First of all, Great Article! Secondly, are you aware of how a document can be submitted to the drop off library via object model code?

Post a Comment