Monday, 28 March 2011

What Browsers do SharePoint People use

I was looking at the stats from this blog of browsers that visitors used in March 2011, below is a summary:
 IE 841.23%
 FireFox 317.59%
Chrome 1011.58%
 IE 97.96%
 IE 77.27%
 Chrome 95.76%

The most amazing stat was I had 1 visitor using IE4 at least that what their http header provided :)

Update 2 May 2011 - Browsers visting this blog breakdown for last week in April 2011.

Sunday, 27 March 2011

SPMetal Jbg Presentation evening

Thank-you to everyone that came to the presentation and Singular who sponsored the event.  I enjoyed doing the 2 sessions and meeting some new SharePoint folk.

Slide decks:

Session 1 - PowerPoint SP2010 Data Access (includes the introduction to LINQ to SharePoint)
Session 2 - PowerPoint presentation on LINQ to SharePoint with the demo

I'll record the slides and if i can get the presentation to a reasonable size I'll add the downloads here - more info to follow.

Code Download:
VS2010 solution - This solution contains 3 projects with the code used for this presentation.
  1. SPDemoLists - Pragmatically deploy the Customers and Order lists with a list lookup and populate the 2 lists with seed data.  Sandbox solution.
  2. SPDemoUI - C# sandbox solution that contains a visual user control (web part) that allows a customer to be selected in a drop down and then display the related orders for that customer.  Additionally there is a button to delete the selected customer. 
  3. SPDemonUnit - is an NUnit blank C# project setup ready to start adding unit tests.
SharePoint 2010 Johannesburg Knowledge Group Meeting Post
Event details:
Session summary's
Session 1
Presentation - Overview of data access in SharePoint. What are your options? Is SharePoint storage always the answer? What is LINQ to SharePoint? What is LINQ to SharePoint not good at? The 8 caveats to LINQ to SharePoint.
Session 2
Demonstrate LINQ to SharePoint 2010. Using Visual Studio creating a visual web part to perform CRUD operations on SharePoint lists.

Saturday, 26 March 2011

Cannot delete related SP2010 lists

Problem: You cannot delete either of 2 lists if they are related through a lookup column.  I tried deleting the list instances using Powershell and the SP2010 UI.  The List definition and corresponding content types are being deployed and retracted successfully.  PS error message when deleting either list instance is:
Exception calling "Delete" with "0" argument(s): "This list cannot be deleted because one or more lists are related to it. A relationship between two lists occurs when one of the lists contains a lookup column enforcing a relationship behavior on the other list."
Initial Hypothesis:  As I am deploying my lists using content types and there is a lookup column, it is important that they are created in the appropriate order.  As I am chaning my features elements manifest file building out my lists it appears to be that I have got my lists instances tangled so they can't be deleted. 

Resolution: I deployed my solution so that the CT and list definitions were present, I deleted the lookup column using the list setting in the UI.  I could then delete the list instances. 

Friday, 25 March 2011

SPMetal - Specified cast is not valid

Problem:  I am using LINQ to SharePoint to retrieve data.  A specific SPMetal list request generates the error "Specified cast is not valid".  Additional error information shown in the UI:
Web Part Error: Unhandled exception was thrown by the sandboxed code wrapper's Execute method in the partial trust app domain: An unexpected error has occurred.
From the stack trace:
"at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at Microsoft.SharePoint.UserCode.SPUserCodeWorkerProcess.ExecuteDelegate.EndInvoke(IAsyncResult result)"
Hypothesis: The error message is a standard error thrown in a SharePoint sandbox solution. The underlying issue is that the proxy is working on lists using SPMetal however only 1 list is causing the problem.  I remembered that I had altered the list using Powershell.   Obviously the entity proxy class generated is based on the old list.  Generate the proxy with the latest lists.
Resoultion: Run SPMetal again to correct the proxy code as the proxy classes do not match the backend SharePoint lists. 

Tuesday, 22 March 2011

SharePoint 2010 Search

SharePoint 2010 Edition comparison

Problem: Setup search securely from scratch
Initial Hypothesis: The setup wizard is not precise enough so it is a better idea to setup search using Powershell or even by creating a new Search Service Application using the UI.  The crawl account used by your Search Service Application can be seen under the "Default content access account" property.
When you create the new Search Service application you loose your existing search data such as indexing, scopes and search settings.
Corey Roth has a good post on permissions for the crawl account.

Security Trimming: Search only returns the results the current user has access to in SharePoint.  File servers work the same way.  Any outside content source you crawl using a specified account will not have security permissions and therefore will show all results.

Tuesday, 15 March 2011

Presenting in Johannesburg on 4 April 2011

I'm presenting on Monday the 4th of  April at Corlett Drive for SharePoint 2010 Johannesburg Knowledge Group at 18:00 in the evening so if you are in the area, it will be good to see you. 

Event book and details:
Session summarys
Session 1
Presentation - Overview of data access in SharePoint. What are your options? Is SharePoint storage always the answer? What is LINQ to SharePoint? What is LINQ to SharePoint not good at? The 8 caveats to LINQ to SharePoint.
Session 2
Demonstrate LINQ to SharePoint 2010. Using Visual Studio creating a visual web part to perform CRUD operations on SharePoint lists.

Reference Material:
Project to create Lookup lists

Thursday, 10 March 2011

Unit Testing for SharePoint 2010 - Part 2

Part 1 of Unit Testing for SharePoint 2010

Overview:  Part 1 discusses setting up nUnit and TDD.NET on you dev machine and writing a simple unit test.  This post looks at using TypeMock Isolator to unit test SharePoint dependent code.
Background:  I haven't used TypeMock Isolator in the last 2 years but the latest version still is a good candidate for testing SharePoint 2010 based applications.   The TypeMock Isolator allows you to fake calls to SharePoint so that you can run unit testing against the SharePoint object model with actually having SharePoint installed or going to a specific instance of SharePoint 2010.  The full version (i.e. not the SharePoint only version of TypeMoch Isolator) also allows you to do create isolation mocks of you code (see Rhino Mocks is a good Isolator Framework).  So pretty useful for testing SharePoint or Entity Framework.  You simply mock out the expected behaviour and don't need to test the Entity Framework by connecting to it.

Tip:  You can use this exact same technique to test MOSS.
Tip: TypeMock needs a separate build server licence from the developer licences.  You can use the full product that includes the ability to do SharePoint testing or just the SharePoint TypeMock isolator.  As of 6 March 2011 the SharePoint edition costs 249 euros per year.  Licencing is expensive especially for large dev teams with multiple build servers but the returns are good if your organisation buys into TDD.
Tip: The SharePoint edition is fine for testing SharePoint calls but you can't mock your own .NET methods so you can't simply use a factory pattern and then mock your entire .NET method call as was shown to me by Ketul Patel (@Pateketu).

Objectives: Create a unit test that uses TypeMock Isolator that mocks the call to SharePoint.
TypeMock to Isolate a method call:
Add 4 reference for nUnit and TypeMock frameworks.
Add a reference to the library you are testing in my case "MagicBall.dll".
Create a new unit test, I isolate a call to the method "GetSPQuestions" and return a list of strings (this has allowed me to override the normal call that would be made to SharePoint).
My business logic for the "Magic 8 Ball" is shown below.  The key take away is I fake the method call GetSPQuestions() using TypeMock so it doesn't try access SharePoint.  This allows me to test my business logic using SharePoint's object model.
TypeMock to Isolate a SharePoint call:
The previous technique works if the return data is not SharePoint objects, so TypeMock allows you to mock up SharePoint objects.  Whereas this example shows how to unit test by faking SharePoint objects.
  • As you can see the code fakes the SPSite Object, then we fake the "Contracts" SPList object (fakeContractList). 
  • At this point all properties inside the objects are null.  So our list would simple return a list with no objects.
  • The next step is to create 3 fake list items that are added to the "fakeContractList".
The code below shows the business logic/code of my "Magic 8 Ball":
The method QuestionSPList() has child methods that use SharePoint objects.  This example directly fakes the SharePoint object model to allow for unit testing.
Summary:  I prefer to build my calls to the SharePoint API or any external API's in a low level private service method.  Then all I need to do it stub out the entire method as shown in the 1st example.  Faking the SharePoint object model using TypeMock is a good option for testing SharePoint reliant code. 

More Info:
Paul Hunt has done 3 great blogs on Andrew Woodward's SPRetreat so this will give you another viewpoint on unit testing for SharePoint 2010.

Andrew Woodward has a codeplex project (SharePoint Magic 8 Ball) that will give you tons of example code on unit testing.

Wednesday, 9 March 2011

Problem with DIP using Lookup Columns

Problem: The Document Information Panel (DIP) in MS Office Word 2010 won’t do lookups to a list within MOSS.  This is a known bug. 
What is affected:  I have tested this on SP2010 and the issue has been resolved.  This only affects MOSS when using the Document Information Panel (DIP) for Word 2010, Word 2007 and Word 2003.

Initial Hypothesis: The issue is caused by MOSS User Interface (UI) when the lookup column is created. The UI links the document library content type to a custom SharePoint 2007 list using a GUID. The issue is that the GUID should be surrounded by {}. SharePoint UI knows how to handle these missing curly brackets however, all the MS Office applications (Word 2010 in our case) need the correct hook-up.  The hook up is wrong, hookup the document libary using a differnt approach.

Resolution:  Login to a WFE that has SharePoint Manager 2007 (codeplex project) installed. Navigate to the SavillsSolar Site Collection and amend the lookup property by surrounding the GUID with curly brackets. The url below details the change and additional information. 
Alternative Resolution: Create the custom list in the root of the site collection, the custom content type for the document library should have a lookup added.  This fixes the problem but requires content type to be create 1st.  Lookup list site column to be created 2nd.  3rd use the custom document contnet type in the library.  Lastly, the custom list has to be in the base/root of the site collection.
Alternative Resolution: Move to SP2010 not to practical but another reason to promote the move to your business.
Summary:  This is a rehash of Bernado Nguyen-Hoan's Blog post on the same topic that allowed me to quickly fix the issue on an old MOSS farm.  The new bit is that the lookup columns from SP2010 using the DIP have been fixed and the best appoach is to have your custom list (lookup list) directly under the site collection.


Sunday, 6 March 2011

Unit Testing for SharePoint - Part 1

Overview:  I am not an expert in Test Driven Development (TDD) but the SharePoint Retreat in London has made me think about using this approach for SharePoint 2010 development.  There are various tools to help you perform TDD however, these 2 posts show the approach I am most comfortable with thanks to Andrew Woodward. 

This whole article is based on Andrew's session and I really would recommend to any serious development team to get Andrew in to do some upfront consulting and potentially training.  Upfront costs and his experience would definately be quickly recovered.  If you have already decided to use a TDD get Andrew in to get you dev team up to a good standard with TDD for SharePoint, anyway enough of my sycophantic

  • Visual Studio (VS) 2010 any edition;
  • NUnit - preferable to MSTest for SharePoint dev
  • TestDriven.Net (optional)
  • ReSharper (optional)
Part 1 focuses on using setting up a basic "Magic 8 Ball" to unit test the business logic using nUnit. 

Tip: using coding Katas (really good approach to training, this is the 1st time I've used them and they actually really work) to get a full unit testing system working. 
Tip: Write the unit test and then write the code to fix the test.

At the SharePoint retreat, each session started with a:
  1. Review of the last sessions code (if appicable),
  2. Followed by an overview of what will be the next bit of coding logic (instructor lead teaching/demo exercise),
  3. Break into a new pair programming team to code (old code is throw away and a fresh set of code is started that includes all the exercise from all the previous sessions), and
  4. Loop - Back to step 1 (Review each pairs code).
In this post I am describing the 1st session, what you are trying to do is setup unit testing and write a couple of tests for you "Magic 8 Ball". 

1. Open VS2010, create a new solution file (MagicPost1.Sln).
2. Create 2 new C# class projects, the 1st project contains the business logic code (BOL project) and the 2nd project contains the unit tests (BOLTest project).
3. Change the default class on the BOL project to Ball and the default class on the BOLTest project to BallTest.
4. Add 3 references to the BolTest project. 
All 4 steps are shown below:

dll reference locations:
\Program Files (x86)\NUnit 2.5.9\bin\net-2.0\lib\nunit.core.dll
\Program Files (x86)\NUnit 2.5.9\bin\net-2.0\framework\nunit.framework.dll

5.  Add the basic testing structure to you BallTest.cs code as shown below:
6. Add this basic code snippet to your Visual Studio code snippets (Resharper has better code snippet support).  7. Write you 1st unit test (the simpler the better) as show below:
8. Build your project to ensure it compiles. 9. Comptete the test code as shown below and run the test.
Tip: Strictly following TDD principals your test should fail and then you write code to fix it in the BOL code.

More Info:
Andrew Woodward's codeplex project on the magic 8 Ball which provides the code you can use to build the magic 8 Ball with TDD.
Here is a slide deck to a presentation on the Magic 8 Ball TDD project.

Next Post:
Part 2 of the series looks at testing SharePoint using Type Moch Isolator.

Saturday, 5 March 2011

SharePoint Retreat Saturday

SharePoint Retreat London 2011, Saturday, March 05, 2011 London held by Andrew Woodward (@) & Wes Hackett.  A brilliant day, if you get a chance to go to 1 of these you should.  Met some good SP people and got great tips & pointers.  The bonus was I won a Type Mock Isolator licence.

Andrew gave a clear example that we worked on throughout the day, enjoyed the unit testing with nUnit.  I'm not totally sold on the TypeMoch as I feel like I'm testing the SharePoint API but it does increase code coverage.    
More Info:
Paul Hunt (@cimares) has done 3 great posts on the SPRetreat event.  Paul has transcribed the sessions extremely well and with good examples delivered in a step by step approach.
Update 10/08/2011: Unit testing Guidance

Friday, 4 March 2011

Reset your AD Pswd history

Problem:  As a developer I setup a development machine on my own network and the default security policy forces me to change my password every 60 days.

Hypothesis:  Use Powershell to change how often the password needs to be reset in AD.  I don't know this so if anyone has this script please post it.

Resolution: Use the PS to remove you history.  This at lease allows me to reuse pswds repeatedly so I don't ned up with a lot of versions.  I have multiple VM so it's pretty useful to know my passwords are consistant.  Thanks to Brad Turner for posting this script.

# Pass the number of days to retain on the cmdline
param ([string]$NumDaysToKeepPwdHistory = 14)
# Calculate the date to clear password history against
[string]$ClearPwdHistoryDate= [DateTime]::Now.AddDays(-$NumDaysToKeepPwdHistory).ToUniversalTime()
# Get the WMI Object for your sever (use your server name)
$myserver = @(get-wmiobject-class "Win2008R2-machine6" -namespace "root\MicrosoftIdentityIntegrationServer" -computer ".")
# Clear the Password History
Write-Host "Clearing the Password History prior to (UTC)" $ClearPwdHistoryDate
Write-Host "Result: " $myserver[0].ClearPasswordHistory($ClearPwdHistoryDate).ReturnValue
# New line
Write-Host "'nError: $($_.Exception.Message)'n" -foregroundcolorwhite -backgroundcolordarkred

Tip:  This should not be done in production, only use on development environements.

Read More:
Brad Turner on removing Pswd history

Update: 2 April 2011 - Edit password setting using Group Policy 

Thursday, 3 March 2011

Google's Cloud Connect for Microsoft Office

Google’s Cloud Connect for Microsoft Office has been released and looks like a great option for informal collaboration.  It is not comparable to SharePoint but offers a good option for sharing and managing individual documents.
Problem: A user has a single document that needs to shared with multiple contributors and read-only users.  Document history is required.  User need the ability to go offline and sync up with the document when the have Internet access.
Hypothesis:  There are several options for tackling this problem and in SharePoint world, you can use Groove (Workspace in SP2010) to get a good solution but you will need licences, setup servers or buy BPOS and potentially install Groove/Workspace on users machines.  All the SharePoint solutions are great but they have costs and time requirements and are generally suited to people within the same enterprise or a agreed integration effort for authenticating.

Redefined Problem: The users are an informal group that need to collaborate on MS Office documents, they have no or low budget and they need a version history.  Users come from multiple locations and have Internet access.
Hypothesis:  Google has released a software plug-in for MS Office 2003, 2007 and 2010 that hooks office documents to Google Docs.  Google docs already exists and offers this functionality but not directly from word, also you can't collaborate on the same document at the same time.  So this plug-in is a cheap alternative to a SharePoint Document library with a Grove/Workspace client.  Functionality is very limited but for simple sharing and collaboration, this is a good option.
Resolution:  As always the answer is .. "It depends".  It isn't a competitor but it offers a simple alternative to sharing documents.  A good example would be if I had a document that I need to give to a digital agency using the Google Cloud Connect for MS Office I don't need to get them access to SharePoint.  If it far more informal and won't work for large amounts of data but there are definitely good reasons to use the solution.
Quote:  Shan Sinha Google product manager explains Google's Cloud Connect plug-in “The plugin syncs your work through Google’s cloud, so everyone can contribute to the same version of a file at the same time. You can edit a Word document’s table of contents from Dublin while co-workers adjust formatting and make revisions from Denver. Instead of bombarding each other with attachments and hassling to reconcile people’s edits, your whole team can focus on productive work together.”

Download and home page for Google Cloud Connect for MS Office.
Read More:
Take a look at the movie in this post

Access SharePoint document libraries from Office

Problem: You can't save a word document to a SharePoint 2010 document library directly from word.  This applies to all products in the office suite and saving to SP2010 & MOSS from Windows Server 2008.  I was getting the error "You can't open this location using this program." when pointing the document to a SharePoint library.

Note: This only applies if your OS is Windows 2008 Server.

Initial Hypothesis: This only affects Windows 2008 Server users.  So it's really just developers looking at saving to SharePoint from the Windows 2008 Server environment, you would also need Office installed.  The issue is with the restricted access the Windows 2008 server allows by default.

Open Server Manager > Features > Add the "Desktop Experience" feature.  Andrew Woodward has a post on the issue for more information.

AD account password out of sync with the managed service account within SharePoint

Problem: I am trying to start services on a server, when I start the Search Foundation service I get the following error: "The password for the account ...\..., as currently stored in SharePoint, is not the same as the current password for the account within Active Directory.  To fix this with Powershell, run Set-SPManagedAccount -UseExistingPassword."
Initial Hypothesis: The password for the account I am using to run the service using has been changed in AD, this does not match the password stored in the SharePoint.

Resolution: Reset the AD Password

Ensure SharePoint is using the correct pswd i.e. chnage the store managed account password as shown below using the Set-SPManagedAccount cmd.