Oracle Portal 10g to SharePoint Migration

Do you have Oracle Portal 10g?  Want to move to SharePoint with full fidelity?  I have scripts that will do exactly that!  This would include:

  • Portal Groups
  • All pages with all "things" (URLs, content, files)
  • Files with versions and comments
  • Workflows
  • Permissions

Contact me at:
chris@architectingconnectedsystems.com

I'd be happy to chat with you about moving to SharePoint 2010!

Oh, and here are some interesting facts about Oracle Portal versus SharePoint:

  • Web part zones can have web part zones (these are called regions and subregions in Portal) 
  • Workflows have steps for approvals (whereas SharePoint an approval is just a single step)
  • Groups are global in Oracle Portal (SharePoint groups are limited to site collections)
  • Oracle uses a concept of "things".  Everything is one and everything can have other "things".  This is *super* powerful notion and means that a single page can contain "things", where a thing can be a URL, a file, content, etc.  SharePoint pages can only have web parts on them.
  • Each "thing" on the page can have security for it, SharePoint doesn't let you do this
  • Each "thing" has a version (no matter what it is), SharePoint doesn't have this
  • Each "thing" on a page can have a workflow.  SharePoint workflows are tied to list items, you can't workflow web parts
  • Each "thing" can be optionally HIDDEN.   SharePoint doesn't have a notion of hidden.  The closest you can get is by creating a second list/library and setting permissions.
  • Oracle has a built in notion of shortcut links (a GUID that takes you to the page you want to hit), SharePoint doesn't

So what saves SharePoint at the end of the day?

  • Office Web Apps is the savior, you can't do fancy Office Document manipulation in Oracle
  • Oracle Portal is *much* more expensive than SharePoint

Chris

1 Year Anniversary Tribute – eBay upgrade video

As a tribute to the 1-year anniversary of the start of the eBay upgrade project, I thought I would share the video I created to show at our celebration party in San Jose.  It is a great video, and shows how much fun we had (and you should too) when we did the upgrade.  The team deserves a tremendous amout of credit for the work and effort they put in…so here it is:

http://youtu.be/EnK2c_lntOY

As a run down, here is what occurs in the video:

  • The SharePoint odessey – the 2001 to 2010 evolution.  When the monkey discovers the monolith and evolves.  Simiarly, eBay's discovery of SharePoint 2010 starts with a monolithic-white board (its only appropriate that we use Richard Struass's Also sprach Zarathustra to show this)
  • You see that it really is a love of "SharePoint" that progresses the joining of all parties
  • As we drive through the initial requirements (found and un-found), you will realize that this project was done in 3.5 months (when similar quotes were at 14 months at 4x the cost).  This drives the selection of Queen's…"Under Pressure"
  • At one point you will see Ramin and I on the ground with our hands in the air…it was a fun moment as we were not really knowing what was going to happen…
  • You will see photos of our countdown timer of the night we went live (we had an upgrade window of the weekend to finish the upgrade successfully).  It slowly winds down until the "GO-NOGO Moment"
  • As the pictures are displayed, you will see various moments over the 3.5 months of us working intent-ly getting the job done
  • Not everything went as planned and hence you see the "GO-NOGO" which occured at least 4-5 times (some elements include NDR64 discoveries and the infamous Search ResultsProvider that has claimed countless develpers…
  • Katy Perry's song of "Firework" is perfect for our dispay of the team members that worked so very hard to make the upgrade happen and thusly are amazingly bright and wonderful people that randomly came together to accomplish something amazing (NOTE: there are moments in the song lyrics that relate to hidden moments)
  • Let me be the first to say that eBay has an amazing NetOps team that just kicks butt (Kenny Cheng and Ken MacIntosh), they saved our a$$ a few times…
  • You will see a snapshot of a fortune cookie that "I" got…it was the week of the upgrade and it said "Your hard work is about to pay off", it was the best fortune EVER!
  • There were some times when we had some pretty "interesting" dinners…hence the snapshot of the menu…
  • The video ends with 00:00:00 and pictures of the eBay intranet running SharePoint 2010 and our SharePoint Conference 2011 session – "How eBay successfully upgrade their intranet to 2010"

Enjoy!
Chris

Fixing: Action 4.0.23.0 of Microsoft.SharePoint.Upgrade.SPSiteWssSequence failed.

This was a tough error, THAT IS AN UPGRADE SHOWSTOPPER, that I ran into a few months ago.  Just now getting around to blogging it.  Here's the full error:

[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Action 4.0.23.0 of Microsoft.SharePoint.Upgrade.SPSiteWssSequence failed.
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Inner Exception: Field name already exists.

The name used for this field is already used by another field in the list.  Select another name and try again.<nativehr>0x81020013</nativehr><nativestack></nativestack>
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]:    at Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
   at Microsoft.SharePoint.Library.SPRequest.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Exception: Field name already exists.

The name used for this field is already used by another field in the list.  Select another name and try again.
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]:    at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
   at Microsoft.SharePoint.Library.SPRequest.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
   at Microsoft.SharePoint.SPField.UpdateCore(Boolean bToggleSealed)
   at Microsoft.SharePoint.SPField.Update()
   at Microsoft.SharePoint.SPFieldIndexCollection.IndexOneField(Object field, Boolean bIndexed)
   at Microsoft.SharePoint.SPFieldIndexCollection.Add(SPField field)
   at Microsoft.SharePoint.Upgrade.RestoreWorkflowAndDatasourceLibraryPermissions.Upgrade()
   at Microsoft.SharePoint.Upgrade.SPActionSequence.Upgrade()

What causes this?  Diving into the upgrade code I find that it is obviously trying to add a column to a list.  But which one?  The hint was in the name of one of the methods – "RestoreWorkflowAndDatasourceLibraryPermissions".  Looking at this, it is checking for all task lists in each site that are setup for workflow.

I reran the code in powershell and eventually found the offending list:

foreach($web in $site.allwebs)

{

$ht = new-object system.collections.hashtable

foreach($list in $web.lists)

{

foreach($ct in $list.ContentTypes)

{

if ($ct.Id.IsCHildof([Microsoft.SHarePoint.SPBuiltInContentTYpeId]::WorkflowTask))

{

$ht.add($list.id, $list.id)

"Web:" + $web.TItle

"List: " + $list.Title

"Content Type:" + $ct.Name

} #end if

} #end ct

} #end list

foreach($id in $ht.values)

{

$l1 = $web.lists[$id]

#$g = new-object system.guid ([Microsoft.SHarePoint.SPBuiltInFieldId]::WorkflowInstanceID.tostring())

$g = new-object system.guid ("de8beacf-5505-47cd-80a6-aa44e7ffe2f4")

#$l1.FieldIndexes.delete($g);

$l1.FieldIndexes.add($list.fields[[Microsoft.SHarePoint.SPBuiltInFieldId]::WorkflowInstanceID]);

$l1.update()

#$g = new-object system.guid([Microsoft.SHarePoint.SPBuiltInFieldId]::Guid.tostring())

$g = new-object system.guid("ae069f25-3ac2-4256-b9c3-15dbc15da0e0")

#$l1.FieldIndexes.delete($g);

$l1.FieldIndexes.add($list.fields[[Microsoft.SHarePoint.SPBuiltInFieldId]::Guid]);

$l1.update() 

} #end hashtable

} #end web

What was the cause?   When you create a workflow, it asks for a task list. 
You can point the workflow at an existing task list or create a new one.  It seems that not only did the users create a workflow that pointed to an existing list, but that list in fact was the task list that the workflow was using for task tracking!!  This causes a loop in the upgrade code and hence the failure.

Fixing it requires deleting some of the fields that were added by the workflow.

Enjoy!

Chris


Adding "Add folder" to SharePoint 2010 document library views

A customer asked me if they could add a "Add Folder" to the document library list type in SharePoint 2010.  I said, "probably", but wasn't sure exactly how one might do it.  I dug in and found it!  The secret lies in the vwstyles.xsl file.  It is located in:

C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions14TEMPLATELAYOUTSXSL

You will want to open the file and find the template called:

<xsl:template name="Freeform">

From there you should see some XSLT that is responsible for creating the "Add document" link.  Right above the variable declaraton"<xsl:variable name="Url">", you need to add a new one:

<xsl:variable name="FolderUrl">
<xsl:value-of select="$HttpVDir"/>/<xsl:value-of select="
$XmlDefinition/List/@title"/>/Forms/Upload.aspx?Type=1&amp;IsDlg=1&amp;List=<xsl:value-of select="$List"/>&amp;RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/>
</xsl:variable>

Then add a new table row below the current one that defines the "Add Document" link:

        <tr>
          <td class="ms-addnew" style=’padding-bottom: 3px’>
          <span style=’height:10px;width:10px;position:relative;display:inline-block;overflow:hidden;’ class=’s4-clust’><img src=’/_layouts/images/fgimg.png’ alt=” style=’left:-0px !important;top:-128px !important;position:absolute;’  /></span>
          <xsl:text disable-output-escaping="yes" ddwrt:nbsp-preserve="yes">&amp;nbsp;</xsl:text>
          <xsl:choose>
            <xsl:when test="
List/@TemplateType = '115'">
              <a class="ms-addnew" id="{$ID}-{$WPQ}"
                 href="{$Url}"
                 onclick="javascript:NewItem2(event, &quot;{$Url}&quot;);javascript:return false;"
                 target="_self">
                <xsl:value-of select="$AddNewText" />
              </a>
            </xsl:when>
            <xsl:otherwise>
              <a class="ms-addnew" id="{$ID}Folder"
                 href="{$FolderUrl}"
                 onclick="javascript:NewItem2(event, &quot;{$FolderUrl}&quot;);javascript:return false;"
                 target="_self">Add folder
              </a>
            </xsl:otherwise>
          </xsl:choose>
          </td>
        </tr>

BAM!  You now have a handly "Add folder" link at the bottom of the page instead of using the ribbon.  NOTE:  This change would need to be applied to all WFEs in the farm and you would need to re-check after every CU or Service Pack deployed.  Also, you will need to add some other logic to keep it from showing up in places you don't want it…I'll have to add this in a later update to this blog.

NOTE: Also keep in mind that this file is cached on its first load and an IISRESET is required in order to see any changes.

Enjoy!
Chris

 

CanUpgrade [Microsoft.SharePoint.Administration.SPIisWebSite] failed.

How do I always seem to be the guy finding this stuff is beyond me, but I'm always excited when I figure this stuff out…ok, was getting this error after trying to run the PSConfig after an upgrade to SP1 and December 2011 CU.

[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]: CanUpgrade [Microsoft.SharePoint.Administration.SPIisWebSite] failed.
[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]: Exception: The system cannot find the path specified.
[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]:    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at Microsoft.SharePoint.Administration.SPIisVirtualDirectory.get_Path()
   at Microsoft.SharePoint.Administration.SPProvisioningAssistant.GetBuildVersionOnIisWebSite(Int32 iisInstanceId)
   at Microsoft.SharePoint.Upgrade.SPSequence.get_CanUpgrade()
   at Microsoft.SharePoint.Upgrade.SPUpgradeSession.CanUpgrade(Object o)

So what is causing this?  Using the handy reflector tool I went into the upgrade code and found the sequence that upgrades SPWebApplication objects.  This creates a list of all children objects that must be upgraded and then upgrades those objects one by one.  One of the children objects is the created or extended IIS web sites.  In order to check if these "CanUpgrade", it must look at the file in the IIS virtual directory "_vti_pvtuildversion.cnf".  If it can't find this file (the virtual path is deleted or missing), then the upgrade will stop for that web application and your upgrade is stuck in a weird state with this crappy error "Product / patch installation or server upgrade required"!

How do you fix?  You can try to add the directory back, but how do you know what the directory is that you need to add?  Funny thing, you can't find it unless you open up the SharePoint_Config database.  I will spare you the details and jump to the "supported" way of fixing this.  In Central administration you won't see the offending missing zone to delete it, therefore you must resort to powershell:

$webapp = get-spwebapplication "http://yourfailedurl"

foreach($setting in $webapp.iissettings.values)
{
$setting.path
}

foreach($zone in $webapp.iissettings.keys)
{
$z = $zone
}

$webapp.IisSettings.Remove("missingzone")
$webapp.update()

Rerun your PSconfig command, viola, you are back in business!!!

Enjoy!
Chris