<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Suman Chakrabarti - SharePoint and ASP.NET blog : Migration</title><link>http://blogs.msdn.com/sumanc/archive/tags/Migration/default.aspx</link><description>Tags: Migration</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Migrating Web Part Pages to Publishing Pages</title><link>http://blogs.msdn.com/sumanc/archive/2008/03/16/migrating-web-part-pages-to-publishing-pages.aspx</link><pubDate>Mon, 17 Mar 2008 04:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8277106</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/8277106.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=8277106</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=8277106</wfw:comment><description>&lt;P&gt;Unfortunately, you cannot natively migrate web part pages to WCM publishing pages. The benefit of publishing pages manifests itself in the centralized page layouts. Web part pages cannot be modified universally, but publishing page layouts can be thusly modified.&lt;/P&gt;
&lt;P&gt;So, to build a utility for migrating web part pages, it's a messy recipe. The result is only publishing pages with web parts intact, but not in the proper location nor is the page layout maintained; however, it is a better deal than to have to migrate web parts individually.&lt;/P&gt;
&lt;P&gt;Start by making sure the web is a &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.publishing.publishingweb.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.publishing.publishingweb.aspx"&gt;PublishingWeb&lt;/A&gt;:&lt;/P&gt;
&lt;P class=code&gt;&lt;CODE&gt;if (PublishingSite.IsPublishingWeb)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return PublishingWeb.GetPublishingWeb(web);&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Get all web part pages by looping through all document libraries and getting web part pages:&lt;/P&gt;
&lt;P class=code&gt;&lt;CODE&gt;foreach (SPListItem item in doclib.Items) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item.File.Url.EndsWith(".aspx")) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WL("Adding web part page: {0}", item.File.Url);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; webPartPages.Add(item.File.Url, item);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Next, create a new publishing page from a selected page layout (BlankWebPartPage.aspx is a good one): 
&lt;P class=code&gt;&lt;CODE&gt;// get the blank web part page layout&lt;BR&gt;List&amp;lt;PageLayout&amp;gt; layouts = new List&amp;lt;PageLayout&amp;gt;(pubWeb.GetAvailablePageLayouts());&lt;BR&gt;PageLayout layout = layouts.Find(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; delegate(PageLayout l) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return l.Name.Equals(pageLayoutName, StringComparison.CurrentCultureIgnoreCase);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;BR&gt;&lt;BR&gt;// get the pages collection and add the new publishing page&lt;BR&gt;PublishingPageCollection pages = pubWeb.GetPublishingPages();&lt;BR&gt;&lt;BR&gt;// change the name of the new page if it already exists&lt;BR&gt;SPQuery query = new SPQuery();&lt;BR&gt;query.Query = "&amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef Name='FileLeafRef'/&amp;gt;&amp;lt;Value Type='Text'&amp;gt;" + item.File.Name + "&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;";&lt;BR&gt;SPListItemCollection items = pubWeb.PagesList.GetItems(query);&lt;BR&gt;string pageName = item.File.Name;&lt;BR&gt;if (items.Count &amp;gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string fileExtension = DateTime.Now.ToString("_MMddyy_hhmmss");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pageName = pageName.Replace(".aspx", fileExtension+".aspx");&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;// create the new page&lt;BR&gt;PublishingPage publishingPage = pages.Add(pageName, layout);&lt;BR&gt;publishingPage.Title = item.Title;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Get a few &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.splimitedwebpartmanager.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.splimitedwebpartmanager.aspx"&gt;SPLimitedWebPartManagers&lt;/A&gt; to read the old web parts and store them and to create new web parts on the publishing page:&lt;/P&gt;
&lt;P class=code&gt;&lt;CODE&gt;SPLimitedWebPartManager wppWpm = ((SPWeb)site).GetLimitedWebPartManager(item.File.Url, PersonalizationScope.Shared);&lt;BR&gt;SPLimitedWebPartManager publishingWpm = ((SPWeb)site).GetLimitedWebPartManager(item.File.Url, PersonalizationScope.Shared);&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;Now you've got to copy the web parts and save the publishing page:&lt;/P&gt;
&lt;P class=code&gt;&lt;CODE&gt;foreach (WebPart oldWP in oldPageWpm.WebParts) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // don't move the Title bar, it's already built into the page&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (oldWP.ToString().Equals("Microsoft.SharePoint.WebPartPages.TitleBarWebPart")) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TitleBarWebPart titleBar = (TitleBarWebPart)oldWP;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do steal the title bar property data, though&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; publishingPage.Title = titleBar.HeaderTitle;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; publishingPage.Description = titleBar.HeaderDescription;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;StringBuilder sb = new StringBuilder();&lt;BR&gt;try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // export the web part to a stream&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldWP.ExportMode = WebPartExportMode.All;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlWriter xwriter = XmlTextWriter.Create(sb);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wppWpm.ExportWebPart(oldWP, xwriter);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xwriter.Close(); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // import the web part from the stream&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string output = sb.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader xreader = XmlTextReader.Create(new StringReader(output));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string errorMessage;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebPart newWP = publishingWpm.ImportWebPart(xreader, out errorMessage);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xreader.Close();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // check for import errors&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!string.IsNullOrEmpty(errorMessage)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpgradeLog(errorMessage, EventLogEntryType.Error);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the web part to the page&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; publishingWpm.AddWebPart(newWP, "Header", oldWP.ZoneIndex);&lt;BR&gt;}&lt;BR&gt;catch (Exception ex) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.WriteLine(ex.ToString());&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;publishingPage.Update();&lt;/CODE&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8277106" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Migration/default.aspx">Migration</category></item><item><title>Migrating MyLinks</title><link>http://blogs.msdn.com/sumanc/archive/2008/01/10/migrating-mylinks.aspx</link><pubDate>Thu, 10 Jan 2008 08:56:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7050460</guid><dc:creator>Suman Chakrabarti</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sumanc/comments/7050460.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sumanc/commentrss.aspx?PostID=7050460</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sumanc/rsscomments.aspx?PostID=7050460</wfw:comment><description>&lt;p&gt;So, I was recently asked how to migrate MyLinks from an SPS2003 SharePoint site. The hurdle is that that MyLinks are not easily available in the SPS 2003 API nor are they easy to migrate (provided you don't want to upgrade the shared services provider).&lt;/p&gt;  &lt;p&gt;Well, I only need readonly access to the SPS2003 database (now decommissioned) and SharePoint admin rights (the MOSS admin account) to add new links to the MyLinks section for all users.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Querying the SPS2003 database     &lt;br /&gt;&lt;/strong&gt;Connect to the *_PROF database and join on the QuickLinks and UserProfile table.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Select up.NTName, ql.Title, ql.Group, ql.PageUrl, ql.IsPublic     &lt;br /&gt;from quicklinks ql join userprofile up on ql.userid=up.userid      &lt;br /&gt;where ntname=@ntname      &lt;br /&gt;order by ntname, linkid&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Creating the link     &lt;br /&gt;&lt;/strong&gt;Create a UserProfileManager to get the UserProfile and retreive the QuickLinkManager.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;ServerContext context = ServerContext.GetContext(siteCollection);     &lt;br /&gt;UserProfileManager profileManager = new UserProfileManager(context, true);      &lt;br /&gt;UserProfile userProfile = profileManager.GetUserProfile(accountName);      &lt;br /&gt;QuickLinkManager qlm = userProfile.QuickLinks;      &lt;br /&gt;QuickLinkGroupType groupType = groupName.Equals(&amp;quot;General&amp;quot;) ?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; QuickLinkGroupType.General : QuickLinkGroupType.UserSpecified;      &lt;br /&gt;Privacy privacy = isPublic ? Privacy.Public : Privacy.Private;      &lt;br /&gt;qlm.Create(title, url, groupType, groupName, privacy);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;From the code above, it's just a distinct NTName query and a few loops away from migrating links for all users.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7050460" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sumanc/archive/tags/SPS+2003_2F00_WSS+2/default.aspx">SPS 2003/WSS 2</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/sumanc/archive/tags/Migration/default.aspx">Migration</category></item></channel></rss>