Posts Tagged ‘SharePoint’
Thursday, June 25th, 2009



Following on from my rant response yesterday about the more negative views from the SharePoint community my reading this morning was so much more positive.

Unit Testing Workflows

In my response to a question from Aaron Weiker I said that I would like to see much more guidance and investigation into the way we approach Unit Testing workflows in SharePoint,  so it was great to find Richard Fennell is doing a lot of work in this area.  I have been working with Typemock Isolator, CThru and SilverUnit testing recently (post coming) and was very interested to see that Richard had picked up this whilst looking for a possible solution to the challenges of Unit Testing SharePoint workflows; something I have to confess I had not even considered.

I’m looking forward to seeing where Richard gets with this and also the use of Fit/Fitness, although I’m personally not a big fan of the way tables are used to define the tests.

Integration Testing SharePoint from MSTest

Having been a bit behind with my reviews of the latest Codeplex P&P project I missed the discussion with Francis on how they found a use for Typemock Isolator to do Integration tests.

The code is really very very simple,  many will be glad to hear, and deals with the places where your code makes a call to SPContext.Current or SPFarm.Local.

The simple ideas really are the best ones.

As you can see,  a few small steps for testing but big steps for SharePoint testing and a demonstration that in general the SharePoint community is committed to improving the way solutions are developed.

Tuesday, June 23rd, 2009



Just read a post by Sahil Malik where he gives his reasons for saying

TDD + SharePoint 2007? Well - screw it! Not worth it IMO.

The reason for his statement is that he sees the actual C# code developed as being a very small % of the total SharePoint project and the effort to do this as not worth the return when you consider the project costs overall.

The problem is, like so many people, he is getting TDD mixed up with doing good development.  He dismisses TDD because it is harder to do in SharePoint because of the API.  It’s not TDD that makes it harder,  it being able to isolate the API and design testable code that is harder.

If you listened to the SharePoint Podshow I did with Eric Shupps we were in agreement that what actually mattered was that you developed good quality code,  that you had the processes in place to enable code reviews, unit testing, integration testing, and the like, that all go together to ensure the code you do develop for your SharePoint solutions is Enterprise ready.

I hold my hands up, I do talks on TDD and SharePoint.  I don’t do this because I think that everyone should do this on day one,  I do it because people have used SharePoint as an excuse to not doing quality development.  The comment ‘we can’t do unit testing because we are using SharePoint’ has been common among development teams,  other just don’t do unit testing anyway so it never even cropped up.   So if I can demonstrate the you can go all the way and actually code your solution using a technique like TDD then this argument no longer holds water.

What the question should be

Quality Development and SharePoint, is it worth doing?

And the answer to that is a big Hell Yes!

And if your happen to use TDD to write some of that quality code, then that’s good too.

The key thing to remember is that you need to make a judgement call about the value; in Sahil’s defence he did mention this.  What I can’t take is that he adopts the ’screw it’ stance before he even starts. This to me is a much of a problem as the people at the other end of the spectrum that think you can ONLY code using TDD.

Thursday, June 4th, 2009



There has been a noticeable increase in the amount of people now blogging and tweeting about SharePoint in Education, or more accurately the Microsoft Learning Gateway platform.  Having posted a number of articles on the subject and having started the Education Special Interest group on SUGUK I thought it time I posted about some of this content.

The first an probably the most important change is the work Alex Pearce has done in rescuing what was really a failed attempt by Microsoft to promote MLG and re launch the http://www.learninggateway.net/ site and launch the Learning Gateway User Group

What is the Learning Gateway User Group?
This community site is here for you.  A place where you can share your personal experiences with the Learning Gateway.  You may just have Microsoft SharePoint as your Learning Gateway and you want to show off the work you have done, or you are a school and you want to talk about all the great ways students and teachers and working together, enriching the learners.

There are a number of bloggers who have moved their blogs to the site and we are starting to see some great posts on there.

To really kick start this drive Alex and Richard Willis (SalamanderSoft) have organised the first conference dedicated to the Microsoft Learning Gateway.

mlgconf_logo

It is promising to be the best education SharePoint event this year for both technical and non-technical staff. Whether you are a Network Manager, VLE Co-ordinator or Head Teacher you will find this conference an opportunity to learn from industry recognised experts speaking about the technical best practice of the Learning Gateway and how to get your staff, pupils and parents engaged and secure. In addition you’ll be able to network with your peers and see how others are pushing forward their Gateway.

There are some great speakers lined up for the event including 5 MVPs in SharePoint and Exchange with the Keynote by Steve Beswick, Directory of Education at Microsoft.

SharePoint in Education

Mike Herrity, from Twynham School, has launched a fantastic blog where he is really sharing his experiences in working with SharePoint in Education.   Unlike myself who tends to work on the larger projects with local authorities and partners Mike is an Assistant Head Teacher so really does talk about what it’s like in the school.

http://sharepointineducation.com/

As I find more great resources I will add then to this post,  if you blog or tweet on the Microsoft Learning Gateway please add a comment below with a link.

Friday, May 15th, 2009



If your the only member of the team is it really worth going through the same agile development process that you would in a team of eight?

Isn’t it quicker to just crack open Visual Studio and start coding?   After all your the customer so you know what you want right?   You not going to have to deal with any of the social complexities that conspire against you. You’re going have the hottest of communication with the dev team,  the dev and test roles will have an interment knowledge and the scrum master won’t really have to do anything as there is not going to be any blockers on this project.

Right?

So I started down this path and before I knew it I had some weird project created with bits of code and SharePoint artefacts but not really seeming to make any progress.   I was easily distracted by other things and didn’t really have a feel for how long it would take and when I could say I was done.

STOP!

What was I doing!  I spend my time trying to help people develop better, to take small steps and sometimes big steps to help produce better software..   why was I not practicing what I preached?

I stopped!

Deep breath, deleted all the rubbish I can previously created and got back to basics.

The Team

I have a team,  the fact that some (in this case all) of the roles were done by the same person was ok; that happens often in agile teams.

Design

Yes, you heard me right here.  Eric Shupps would be proud of me :).   I’m not going to jump into Visual Studio and crank out code starting [TestFixture] I need to do some design work first, even though this application is going to be small I still need to put in the time on the upfront design.  I need to think through the solution at a high level.

Here I used the opportunity to try out the great Balsamiq application,  which I stumped up the $79 license fee for and download the desktop version.

Blurred out Balsamiq Design

I’ve deliberately blurred the image but you get the idea of what the mock ups look like, and these take only a matter of minutes to produce.  Definately something you should consider if your currently trying to do this in Visio or heaven forbid cranking out HTML mockups.

The few UI based mockups actually helped me to understand how the application would work for the end user, which in turn provided a clear vision for the way the solution would be developed.

User Stories

I didn’t need to do any remote collaboration on the User Stories so I was able to get back to basics and use one of the white boards in my office as the task board.   I wrote the user stories out on post-it notes and added them to the board along with rough estimates for each one.

image

Here you can see I’m using a very common step of status on my task board

Backlog - This is where I add all stories that came out of the design,  they are all user focused with nothing specific about the implementation.  No stories like ‘Use jQuery to make it nice’  these are user stories.  If I think of something while i’m coding or testing, or even having a beer I can just write it to a post-it and stick it on the backlog.

Sprint - I like Scrum so adopt a Scrum Esq. style to my process.  The sprint will be where I put the stories I plan to do next.  The amount is based on the estimate and also the sprint length.   In this project I’m doing stupily short sprints of 2 days each.

In Progress - When I pick off a story to work on it goes in here,  if you’ve ever looked at the Kanban approaches your looking to keep this ‘In Progress’ to a defined level.  I like to try and move things through to ‘Done’ before picking off new stories.

Verify - When I think it’s been coded properly and dev tested I move the story here.   Verify is where I would validate the code on another environment - i.e. a non-dev box,  one with multiple web front ends.  At this point I also look at introducing some form of automation for both the build/deployment and also the acceptance testing.

Done - This is when it is really really done,  there is nothing left to do, no documentation, no tests or tweaks,  the code is production ready.

Sprint 1 - Day 1

Having selected the user stories for the sprint it was time to setup my dev project and get some of the foundations in place.   If you follow me on twitter you will know that I previously spent time producing a decent SharePoint development Virtual Machine so it was very quick for me to roll out the few things I needed to get going.   A SharePoint team site in which I could spike and test my code,  a VS2008 solution and class library project in which to start cranking out some code.

At the end of Day 1 my board looked like this:

image

One of the stories I felt was ready for verification and another I was making good progress on.   At this point I had nothing ‘Done’ my burndown in the morning would look a bit sad,  but that’s OK that is often the case at the start of a project or sprint.  I also don’t at this point have a verification setup so this is going to slow me down a bit on Day 2.

Day 1 has been good,  I have the basic project structure defined.   I was able to build a WSP with the SharePoint features I needed to complete the first story and was able to deploy and test this on my dev machine.

People that have read my blog or seen me talk at conferences and user groups know that I am very keen on doing things right; I like to see Unit Tests and better still I want to see people at least trying Test Driven Development.   However at the end of Day 1 I was yet to write a single line of C# code, neither in test form or production code.   So did I really do development on day one?

Well I think I did, only the language used was XML and a little bit of CAML and for these items I do not know of any way, that makes sense, to unit test.  I often think that the XML we define as part of SharePoint projects are more inline with doing configuration,  we are just setting up SharePoint using a specific configuration and the testing for this should naturally falls into the integration space and will be picked up during verification.   That is not to say as a developer I do not validate it,  I need to ensure that it works as expected in my environment before I can move it over to the Verify column and it’ is the job of the tester to make sure this happens.  For this project the tester (me) was adamant that it all worked as they didn’t want to have to waste time on silly errors.

Interesting Test

One thing that I will be having to do with this project is fit it around real work, the sort that helps to keep food on the table sort of work.   This means that the sprints although 2 days in length the elapsed time may be significantly longer.  I know that this will impact on the velocity as I will lose some of the momentum during these breaks, however the benefit I have from adopting a more defined process is that it will be significantly easier for me to pick up the project.   Imaging if I had to go back to the mess of code I had originally created after a weeks break!

I’m really interested to see if my agile development with a team of one really does make a significant impact on the way I develop the code, on the time it takes to complete it and on the quality of the solution created at the end.

Find out what happens on Day 2.

Monday, May 4th, 2009



Being an advocate of SharePoint as an application platform I looked long and hard for a decent implementation of a Scrum and have always been found wanting.  I have seen simple examples where any power user could set things up but found the lack of any Burndown charts meant you lost probably the most important part of Scrum - the visibility.

I have found that VersionOne is one of the best products on the market, although it has a lot of options which tends to put off new teams.

For those that use Team Foundation Server your probably going to head towards the Scrum for Team System developed by Conchango.  I’ve not used this in anger so am unable to comment on how well it works however this solution is not really a SharePoint specific solution as it requires you to make the commitment to using Team Foundation Server.

Bil Simser did a good post on scrum tools,  although its nearly 3 years old still has some good links.   Again however the tools are not specifically SharePoint.

Why the SharePoint Obsession?

SharePoint is the collaboration tool of choice, companies have deployed it and it is being used with varying degrees of success.  People have become familiar with the how to add items to a list, how to upload documents into a document library and for the more advanced how to build engaging dashboards.

What is the biggest thing you get from adopting scrum?  ‘Visibility’

What do you need to encourage to make Scrum work?  ‘Collaboration’

SharePoint is the natural platform choice on which to build a Scrum tool.

Introducing Project Aberdovey

As with all good development teams I think it is right that your development project should have a name,  and in keeping with some big companies in the Seattle area 21apps uses place names.   Aberdovey, or as it’s spelt in Welsh Aberdyfi, has probably one of the best beaches in the UK and is located 50 miles west of the office.

Put simply, Project Aberdovey is a Scrum tool for SharePoint.

There are a few aims for the project:

  1. Produce a fantastic Scrum tool built on SharePoint
  2. Develop the solution using agile techniques including TDD
  3. Dogfood the solution as soon as possible - what better way to develop the right solution
  4. Open development - I want to give feedback on the challenges but also welcome your input

I will be looking for ways to give people visibility,  I am looking at codeplex as an option but welcome any suggestions.

Tuesday, March 10th, 2009



SharePointPopShowLogoEver wondered if it was possible to do Test Driven Development on SharePoint projects?   Have you been reading the blog posts and white papers here at 21apps.  Got involved in the debate with Eric Shupps?

The SharePoint Pod Show team finally tracked me, Andrew Woodward, down for a series of in depth interviews late one night during the MVP Summit 2009.   The Pod Show is broken into 3 parts with Rob Foster asking about the basics of Test Driven Development and SharePoint;  Eric Shupps, the SharePoint Cowboy, asks about the value TDD provides to the Enterprise and finally Spencer Harbar asks the challenging questions about how TDD helps reduce the risks to the enterprise by adopting TDD.

Hopefully you will agree that some of the myths around TDD have been dispelled by these insightful SharePoint Pod Shows.   I encourage you all to sign up for the European Best Practices SharePoint Conference in London, 4th to 6th April 2009, where we hope to continue the discussion around this challenging topic.

Don’t forget to sign up to the legendary SharePint once again organised by the Andrew Connell.

Finally, in the words of Spencer Harbar (sorry Eric no pictures of Spence!)

image

Tuesday, February 24th, 2009



As development practices around the SharePoint platform mature the demands for better quality and better performing solutions are being made.  Gone are the days when Enterprises will accept that the Roll-Up Web Part they purchased will not scale beyond a few site collections.  A knowledge of the platform and defensive coding alone will not cut the mustard, the need for a holistic approach to your development practices will be the only way to achieve success.  In this blog post I am focusing on one specific technique, code profiling, and using the excellent Red Gate ANTS Profiler.

Disclaimer:  Red Gate ANTS Profiler is a paid for application.  There are other products on the market that do code profiling including Visual Studio.  The reason for using ANTS in this post is due to the ease with which you can get up an running and the quality of the user experience.  I recommend you set aside a day to look at the profiling in Visual Studio and then a few hours to get that much further with ANTS.

Software Performance Analysis - Wikipedia

In software engineering, performance analysis, more commonly today known as profiling, is the investigation of a program’s behavior using information gathered as the program executes (i.e. it is a form of dynamic program analysis, as opposed to static code analysis). The usual goal of performance analysis is to determine which sections of a program to optimize - usually either to increase its speed or decrease its memory requirement (or sometimes both).

As the quote says this technique is specifically aimed at the optimization of code; the tools enable the developer to quickly target the areas of code that need optimization and lead to an improved return for the effort. (seems strange saying ROI when talking about dev techniques, but this is really what it is).

Getting started

Red Gate provide a 14 day trial, so you can try before you buy.  The latest release, version 4.3 as at the time of writing, has made some great improvements over the 4.1 version - most notably the removal of the need to stop all the IIS web sites listening on port 80 :).

As you would expect this post will focus on profiling SharePoint code, I’m going to use the Magic 8 ball application developed for my TDD session at the Best Practices SharePoint Conference in San Diego.

More details on Test Driven SharePoint development can be in the Agile section of this site.

Environment

The environment that I will do the testing is a typical SharePoint developers Virtual Machine.

  1. Windows 2008 Server (32bit)
  2. Visual Studio 2008
  3. Microsoft Office SharePoint Server 2007
  4. SQL Server 2005

As this is running on Windows 2008 I will be testing against IIS7.   The requirements are identical for Windows 2003 and IIS 6.0

Installation

Download ANTS Profiler and install, not too many options to worry about here.

image

Luckily for my first run through the team have provided a technical paper on installing, using and getting ANTS Profiler to work with SharePoint, How to profile a SharePoint 2007 Site Collection.  There were a few things in here that I prefer not to do,  I will document what I do below and will pass this back - I’m not criticizing, there’s no way I would even attempt to write a Profiler so mucho respect from me to the Red Gate team

Configuration

We are looking for the ability to profile any site collection within a Web Application.  This involves getting the account used for the associated application pool, giving it some additional rights and then configuring the ANTS services to use this account.

Web Application

Depending on your development machine configuration you will have a number of web applications configured in SharePoint, the configuration below should be reasonably familiar to most of you.

image

The key here is to identify the web application (IIS Website) as we need to get the account name from the associated Application Pool.

Load IIS Manager, select the web application and chose Basic Settings from the Actions menu on the right.  This will show the associated application pool as below.

image

Select the Application Pools from the connections menu, choose the application pool identified in the previous step and click advanced settings.  This will give you a properties screen showing the account we need to work with.

image

In this case 21apps\svc-intranet-ap - if you have a local installation this may be set to Local System in which case the steps below may not be required.   I recommend that dev’s don’t have a default install as you really need to understand how SharePoint is setup to undertake any large scale developments.

Web.Config

In IIS 6 days you would need to edit the web.config file to set the application into debug mode.   In IIS 7 the common ASP.NET configuration options have been promoted to the IIS console.  With the web application still selected click on the .NET Compilation option and change the Debug behaviour to True and click Apply.

image

Like all good SharePoint developers you will be working with WSS_Minimal trust settings or a custom policy file.  To do profiling however you will need to set the Trust level to Full.  Again IIS 7 provides a UI or you can edit it manually.

image

It is possible to run the code without setting a Full trust level, but you need to remove the .pdb files and will lose the ability to profile the lines of code.  Which is sort of the point of profiling!  If you don’t set Full trust you will get an error like the one below when loading a web part

Web Part Error: An error has occurred.

Show Error Details
Hide Error Details 

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)
  at System.Activator.CreateInstance(Type type)
  at Microsoft.SharePoint.WebPartPages.SPWebPartSerializer.get_DefaultControl()
  at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.SerializedWebPart..ctor(SPWebPartManager webPartManager, XmlNamespaceManager xmlnsManager, Byte[] sharedData, Byte[] userData, String[] links, Type type, SPWeb spWeb)
  at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Deserialize(SPWebPartManager webPartManager, XmlNamespaceManager xmlnsManager, Byte[] userData, Byte[] sharedData, String[] links, Type type, SPWeb spWeb)
  at Microsoft.SharePoint.WebPartPages.SPWebPartManager.CreateWebPartsFromRowSetData(Boolean onlyInitializeClosedWebParts)

[VerificationException: Operation could destabilize the runtime.]

Services

ANTS runs as two services

  1. ANTS Memory Profiler 4 Service
  2. ANTS Performance Profiler 4 Service

Change the accounts on these two services to the same accounts used in the web application we identified above.

If this is the first time the account has been associated with a service it will be automatically granted the ‘Log On As A Service’ right.

image

Local Security Policy

From the Administrators menu choose Local Security Policy and grant the application pool account the following rights

  1. Act as Part of the Operating System
  2. Impersonate Client after authentication

image

Open a command prompt and run gpupdate /force.

image

Profiling your code

Your environment is now configured, we can start profiling.  As this is SharePoint I tend to just hit the bit i’m planning to profile first to make sure this is working before I start profiling.  Many hours can be lost trying to solve a configuration issue with a profiler that is not at fault.

Start Red Gate ANTS Performance Profiler.  It knows we’re running on a system a system that has UAC, it offers to make our life easy and always run as an Administrator.  I normally click yes here.

image

ANTS loads the Profile Settings window is automatically.

There are only a few things to set.

  1. Choose the ASP.Net web application (hosted in IIS)
  2. The URL to the SharePoint site
  3. Use the original port

image

Further profiling counters can be set, but we just want to get our first run going for now.  Click on Start Profiling.  (In this example I have added a long running process to show how ANTS can identify this as a hotspot).

Profile Results

Profiling will start and a new browser will open at the location specified.  As this is SharePoint the profiler restarts the service so you will always have a small delay while SharePoint is JIT compiled. The profile timeline will show this impact on the processor.

image

Once the processor has levelled out its time to start profiling your code.   Navigate and interact with the bit of the application you are interested in.  If it is a  web part or navigation load you are interested in then you can refresh the page.

Once you are happy you have performed enough tasks,  I recommend keeping these focused, stop the profiling. ANTS will present you with the HOT code, the bit of code that is the worst performing. You can focus the analysis on any part of the profile graph to show poor performing code around a specific spike in the processor or memory.

image

In the example above I am focused on the code that runs (including my long running process) when I ask the magic 8 ball a question.

Viewing source code when you have enabled Line level profiling shows every line, the hit count and the % of time taken to perform that operation.

image

The really cool thing is you can click through the methods to follow the slow running process through the code!

image

Showing the method grid allows you to open up a call graph for any method to see how the processing is broken down in a dynamic tree view.  This really is just brilliant!  The image below does not do it justice you really do need to see this for yourself to appreciate it.

image

Conclusion

The long running process I added for the demonstration was picked up and allowed me to drill down into the lines of code that were the slowest.  It even showed how the internal calls within the base classes performed.

Red Gate ANTS Profiler is easy to setup and proves to be an invaluable tool in your software development tool kit.  I suspect profiling will not be something that you do every day, however with the speed and ease of use I would like to think that you will consider the inclusion of profiling a must have rather than a nice to have.

Sunday, February 22nd, 2009



Ever wondered what it is like to be on 3rd line support at Microsoft?  The client calls in with a really obscure error that only happens some of the time?  No me either,  but the past few days have probably been pretty close.

The Problem

I am working on a Silverlight/SharePoint solution, that will take the Education world by storm in the not too distant future, which was throwing a very strange error during the creation of a SharePoint web (SPWeb).

   1: MESSAGE
   2: System.NullReferenceException
   3: Object reference not set to an instance of an object.
   4:
   5: STACK TRACE
   6:    at Microsoft.SharePoint.Utilities.SPUtility.StackTraceString(Int32 numLevelsToSkip)
   7:    at Microsoft.SharePoint.SPList.TraceListOperation(String operation, Boolean recordStack)
   8:    at Microsoft.SharePoint.SPList.Update(Boolean bFromMigration)
   9:    at Microsoft.SharePoint.SPList.Update()
  10:    at Microsoft.SharePoint.Workflow.SPWorkflowAssociationCollection.AddCore(SPWorkflowAssociation wa, Guid id, SPList list, Boolean forceUtilityListCreation)
  11:    at Microsoft.SharePoint.Workflow.SPContentTypeWorkflowAssociationCollection.AddCoreCT(SPWorkflowAssociation wa)
  12:    at Microsoft.SharePoint.Workflow.SPContentTypeWorkflowAssociationCollection.PushDownAssociation(SPWorkflowAssociation associationTemplate, Boolean bUpdateIfExisting, MethodBase mbChangeEntry)
  13:    at Microsoft.SharePoint.Workflow.SPContentTypeWorkflowAssociationCollection.CopyWorkflowAssociation(SPWorkflowAssociation associationTemplate)
  14:    at Microsoft.SharePoint.SPContentType.CopyWorkflowAssociationsTo(SPContentType ctDst)
  15:    at Microsoft.SharePoint.SPWeb.SyncNewLists()
  16:    at Microsoft.SharePoint.SPWeb.ApplyWebTemplate(String strWebTemplate)
  17:    at Microsoft.SharePoint.SPWeb.CreateWeb(String strWebUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean bCreateUniqueSubweb, Boolean bConvertIfThere)
  18:    at Microsoft.SharePoint.SPWeb.SPWebCollectionProvider.CreateWeb(String strWebUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean bCreateUniqueSubweb, Boolean bConvertIfThere)
  19:    at Microsoft.SharePoint.SPWebCollection.Add(String strWebUrl, String strTitle, String strDescription, UInt32 nLCID, String strWebTemplate, Boolean useUniquePermissions, Boolean bConvertIfThere)

The problem was happening during the creation of a standard Team Site, although it only happened on some of the SiteCollections and not on others.  Although the error was fired the actual web was actually created, and if you created the site through the UI it did not report and error.

Concern One: The UI is handling and ignoring these errors, if they are not important why would the API through them?

Reading through the errors the problem is rooted in the method Microsoft.SharePoint.Workflow.SPWorkflowAssociationCollection.AddCore which is obfuscated which makes debugging that bit harder.  The method lived deep inside Microsoft.SharePoint.SPWebCollection.Add

Diagnosis

The diagnosis process went through a number of iterations, comparing the sites that worked with those that didn’t. Eventually a small console application was created to look at the types of Work Flow Associations that existed for each of the content types and lists.   The console application accepts one parameter, the web url.

if (args.Length == 0)
{
    Console.WriteLine("Enter URL to web");
}
else
{
    using (SPSite site = new SPSite(args[0]))
    {
        using (SPWeb web = site.OpenWeb())
        {

            Console.WriteLine("***************************");
            Console.WriteLine("Workflow Templates");
            Console.WriteLine("***************************");

            foreach (SPContentType contentType in web.ContentTypes)
            {
                Console.WriteLine(contentType.Name + " - " + contentType.Hidden + " : " + contentType.Scope);
                foreach (SPWorkflowAssociation workflowAssociation in contentType.WorkflowAssociations)
                {
                    Console.WriteLine("WFA:" + workflowAssociation.Name);
                }
            }

            Console.WriteLine("***************************");
            Console.WriteLine("Workflow Templates");
            Console.WriteLine("***************************");

            foreach (SPWorkflowTemplate template in web.WorkflowTemplates)
            {
                Console.WriteLine(template.Name);
            }

            Console.WriteLine("***************************");
            Console.WriteLine("Lists with WF association");
            Console.WriteLine("***************************");

            foreach (SPList list in web.Lists)
            {
                if (list.WorkflowAssociations.Count > 0)
                {
                    Console.WriteLine(list.Title);

                    foreach (SPWorkflowAssociation workflowAssociation in list.WorkflowAssociations)
                    {
                        Console.WriteLine("WFA:" + workflowAssociation.Name);
                    }
                }
            }
        }
    }

    Console.WriteLine("END");
    Console.Read();
}

The output from this application was quite telling but did not provide the exact cause of the problem.  It showed that the Document content type on the sites that worked had no associated workflow.

Whereas the ones on the sites that did not work did have workflows associated with this core content type.

But this just pointed to some Site Collection level features that had been activated on this site that were not on the other.   Deactivating these features did not help.  Note: others have posted warnings about deactivating these types of features, however I was in a proving environment and could easily restore so this was not such a big issue.

The garden path

Continuing the investigation I felt like I was being led up the garden path however it was this path that lead me to the solution.  I wanted to get rid of any workflows and bring the working and non working sites in line.   I needed to remove these workflow associations from the site that was not working to see if the API call would work.

From Site Content Types gallery I chose the Document content type and workflow settings.   I wanted to stop the workflow from being associated with any new document libraries created using this content time, so in effect all libraries.

The error message that is returned from this function is much more informative.

Feature '75a0fea7-1651-4b91-8cdf-3f24e57526ed' for list template '7149' is not installed in this farm.  The operation could not be completed.
Feature '75a0fea7-d31d-491a-9177-f0e461a81e3f' for list template '1010' is not installed in this farm.  The operation could not be completed.
Feature '75a0fea7-d31d-491a-9177-f0e461a81e3f' for list template '1010' is not installed in this farm.  The operation could not be completed.
Feature '75a0fea7-9507-49c7-a473-0ce55c18ef89' for list template '240' is not installed in this farm.  The operation could not be completed.
   at Microsoft.SharePoint.SPContentType.PushDownChanges(CodeToPushDownChangesToDerivedCT derivedCTPushdownCode, CodeToPushDownChangesToListCTs listDerivedCTsPushdownCode, Boolean throwOnSealedOrReadOnly)
   at Microsoft.SharePoint.SPContentType.UpdateWorkflowAssociationsOnChildren(Boolean bGenerateFullChangeList, Boolean bPushdownDerivedCT, Boolean bPushdownListCTs, Boolean bThrowOnSealedOrReadOnly)
   at Microsoft.SharePoint.SPContentType.UpdateWorkflowAssociationsOnChildren(Boolean bGenerateFullChangeList)
   at Microsoft.SharePoint.ApplicationPages.RemWrkflPage.BtnSubmit_Click(Object sender, EventArgs e)
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

This function was looking to do very similar things to the failing call above and PushDownChanges to the content type.   However the error message here revealed that I had some missing features.

What do you do when you get a GUID in an error message,  your search for it.  Thank fully Robert Bogue had done one of those obscure but ultimately very helpful posts about the features in his farm.  And even more thankfully Robert had also installed the Fab 40 features into his farm.  As this revealed that the the proving environment these did not exist.  However they had been deployed in Live.

The Root Cause

It is difficult to exactly pinpoint the root cause,  my objective has been to remove the associated workflows to enable the web to be created through the API.   After installation of the Fab 40 WSP based solutions I was able to remove the workflow,  I tried the No New Instances option without success, the setting was applied but still the web would not create.

The Solution

The solution in this case was to remove the workflow,  this will have the consequence of removing all running instances of the workflow.   I hope to spend more time fine tuning the solution so ensure that the minimum of fixing up can be applied.

Lessons Learnt

Management of your proving environment is as critical as live.   Process and rigor should be put in place to ensure that the environment your using meets it’s needs,  in this case it was to mirror live.  Any short cuts that you have to take in order to meet business needs, such as a site collection restore over a full database restore could have implications that have unexpected consequences.

SharePoint is a very complex and often fickle platform,  to support, maintain and nurture your installation will require patience, time and a will to get to know its little foibles. Ultimately it will be rewarding, sometimes it just doesn’t feel like that.

Tuesday, February 10th, 2009



In contrast to the Agile SharePoint development with Scrum session this was very light on the slides.  In good Agile tradition I adopted a Pair Programming approach with me at the keyboard and the audience been my code buddy.  Everyone was provided with a copy of Uncle Bobs Three rules of TDD to help with during the pairing process.  The rules state:

  1. You are not allowed to write any production code unless it is to make a failing unit test pass.
  2. You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.
  3. You are not allowed to write any more production code than is sufficient to pass the one failing unit test.

I did have some slides to set the scene (see below), to give some background to TDD and raise the issues around the use of the word TEST.  We also looked at 10 reasons TDD sucks, with a slight SharePoint slant,  and quickly got into Visual Studio where the real learning was to happen.

The user story was to develop a Magic 8 Ball web part that could have custom answers defined in a SharePoint list.  The finished code is available on CodePlex and it is planned to extend this solution over time to expand on the ideas.  My main issue with just getting the finished code is the learning is in the process and it can be hard to see how the design was driven by the code.   I am planning to do a web cast on this to show this process.

CodePlex project now available  http://www.codeplex.com/sp8ball

Winners

The guys at Typemock we very generous in donating 3 copies of Isolator for SharePoint which is an essential component for anyone doing unit testing in a SharePoint environment.  The lucky winners were

Mark Freeman
Shahar Tamari
Kennedy Duncan

Each of you will receive a free license for Isolator for SharePoint,  for those that did not win Typemock are running a special discount.

Sunday, February 8th, 2009



As promised the slide deck from my Agile SharePoint Development with Scrum.

Abstract

Provide an introduction to Agile development using Scrum and discuss how the iterative approach to development helps the customer to get the solution they want. Look at how this approach works when applied to SharePoint projects, how it helps leverage more of the core platform and focuses effort on the biggest value areas. We will look at the challenges this brings to your development team by doing early integration, dealing with upgrades and changes and understand how addressing the hard things early is the right approach. We will also discuss how Scrum gives visibility of the project and brings both good and bad news. How getting customer engagement is the primary challenge and how the flexible approach is often at odds with the way work is contracted.

Agile SharePoint Development with Scrum

The session was spilt into two parts, an introduction to Scrum and a discussion about how this can be applied to SharePoint projects.  The audience was a good mix of Developers, Managers, ITPros, and business people with a range of exposure to Agile practices and Scrum.  The session provided everyone with an understanding of the terminology and process of doing Scrum.  There was a focus on ‘What is done’ and a good discussion around how you architect solutions.  For those that attended and anyone else interested I recommend you listen to Scott Hanselman’s podcast with Ken Schwaber where Ken covers these topics.  Also looking at the question ‘when do you architect solutions?’ I really like Kens take on how, using the waterfall approach, you have to spend time getting it right upfront. The ability to change later in the process is limited and the costs can be prohibitive.   Using agile techniques the architecture will emerge over time,  you know that you only have the architecture in place to support the business requirements developed.  He poses the question,  if you had defined the architecture up front what happens if it is changed mid way through the project?   With waterfall there is a lot of unpicking to be done and wasted effort.  With agile you don’t have to do the unpicking and the rigours of the process, ensuring things are done, means your code base is easier to change.

Being Agile with SharePoint

Here the focus was on facing the tough challenges early, understanding how to package your solutions, deployments to multiple environments, automation of processes and the eclectic mix of tasks you need to do to deal with the upgrade story.  There was a significant synergy with Ben Robb’s session on automated builds using Hyper-V and Robert Bogue’s coverage of the SharePoint Patterns and Practices coverage of upgrading.

I plan to do a screen cast of this session to provide some background to the slides and also the animations that really took me a long time to do.