MCMS 2002 to MOSS migration issue : Leaf names are not unique

MCMS 2002 to MOSS migration issue : Leaf names are not unique

  • Comments 7

Unfortunately MCMS 2002 Site Manager doesn’t allow you to rename the postings or resource gallery items. In some situation you may end up duplicate entries in the resource gallery item names. MCMS 2002 allows you to have multiple resource items or postings with same name. The items will be differentiated by using their GUIDs. But this will end up a problem when you are migrating to MOSS 2007, and you will get "Leaf names are not unique." error message. And the only work-around is renaming all those files.

Untitled

But we can work-around this issue using MCMS PAPI. I have created an utility to find out all the duplicated postings and resources and rename all of them in a single shot. I have written the code in a .NET console based application. We have to run this code in the MCMS server by login to your machine as a user who has edit permission. I would recommend executing this code by login as MCMS administrator.

   1: using System;
   2: using System.Security.Principal;
   3: using System.IO;
   4: using Microsoft.ContentManagement.Publishing;
   5: using System.Collections;
   6:  
   7: namespace RenameTheChannels
   8: {
   9:     /// <summary>
  10:     /// Summary description for Class1.
  11:     /// </summary>
  12:     class Class1
  13:     {
  14:         /// <summary>
  15:         /// The main entry point for the application.
  16:         /// </summary>
  17:         public static CmsApplicationContext appContext = null;
  18:         public static TextWriter oTextWriter = null;
  19:         [STAThread]
  20:         static void Main(string[] args)
  21:         {
  22:             try
  23:             {
  24:                 oTextWriter = new StreamWriter("FixDuplicateEntries.txt");
  25:                 appContext = new CmsApplicationContext();
  26:                 WindowsIdentity ident = WindowsIdentity.GetCurrent();
  27:                 appContext.AuthenticateUsingUserHandle((System.IntPtr)ident.Token.ToInt32(),PublishingMode.Update);        
  28:                 Console.WriteLine("********************************************Renaming Postings*********************************************");
  29:                 IterateAllChannels(appContext.RootChannel);
  30:                 Console.WriteLine("******************************************** End of Renaming Postings*************************************");
  31:                 Console.WriteLine("******************************************** Renaming Resources*******************************************");
  32:                 IterateResourceGallery(appContext.RootResourceGallery);
  33:                 Console.WriteLine("******************************************** End of Renaming Resources************************************");
  34:                 
  35:             }
  36:             catch(Exception ex)
  37:             {
  38:                 Console.WriteLine(ex.Message);
  39:             }
  40:             finally 
  41:             {
  42:                 appContext.Dispose();
  43:                 oTextWriter.Close();
  44:                 Console.WriteLine("Operation has been completed !");
  45:                 Console.ReadLine();
  46:             }
  47:         }
  48:  
  49:         public static void IterateResourceGallery(ResourceGallery oRootResourceGallery)
  50:         {
  51:             foreach(ResourceGallery oChildResourceGallery in oRootResourceGallery.ResourceGalleries)
  52:             {
  53:                 string[] childResources = FinalResources(oChildResourceGallery);
  54:                 IterateResourceGallery(oChildResourceGallery);
  55:             }
  56:         }
  57:  
  58:         public static string[] FinalResources(ResourceGallery oChildResourceGallery)
  59:         {
  60:             string[] Resources = new string[oChildResourceGallery.Resources.Count];
  61:             
  62:             //bool hasChange = false;
  63:  
  64:             if(oChildResourceGallery.Resources.Count >0)
  65:             {
  66:                 ArrayList oResourceList = new ArrayList();
  67:                 for(int i=0;i<oChildResourceGallery.Resources.Count;i++)
  68:                 {                    
  69:                     oResourceList.Add(oChildResourceGallery.Resources[i]);
  70:                 }    
  71:                 
  72:                 int iCount = 1;
  73:  
  74:                 foreach(Resource oCompareResource in oChildResourceGallery.Resources)
  75:                 {                    
  76:                     int i=0;
  77:                     foreach(Resource oResource in oResourceList)
  78:                     {
  79:                         if(oResource.Name == oCompareResource.Name )
  80:                         {    
  81:                             i++;
  82:                             if(i>1)
  83:                             {
  84:                                 string[] strName = oResource.Name.Split('.');
  85:  
  86:                                 string strOldName = oResource.Name;                                
  87:                                 string strNewName = strName[0] + i.ToString() +"." + strName[1];;
  88:  
  89:                                 oResource.Name = strNewName;
  90:                                 oResource.DisplayName = strNewName;                                                                
  91:                                 appContext.CommitAll();
  92:                                 Console.WriteLine("Resource Gallery : " + oChildResourceGallery.Name + "old name: " + strOldName + " New Name :" + strNewName );
  93:                                 oTextWriter.WriteLine("Resource Gallery : " + oChildResourceGallery.Name + "old name: " + strOldName + " New Name :" + strNewName );
  94:                             }
  95:                             
  96:                         }
  97:                     }
  98:                     iCount ++;
  99:                 }
 100:             }            
 101:             return Resources;        
 102:         }
 103:  
 104:         public static void IterateAllChannels(Channel oRootChannel)
 105:         {            
 106:             
 107:             foreach(Channel oChildChannel in oRootChannel.Channels)
 108:             {
 109:                 string[] childrenPosting = FinalPosting(oChildChannel);
 110:                 IterateAllChannels(oChildChannel);
 111:             }
 112:         }
 113:  
 114:         public static string[] FinalPosting(Channel oChildChannel)
 115:         {
 116:             string[] Postings = new string[oChildChannel.Postings.Count];
 117:         
 118:  
 119:             if(oChildChannel.Postings.Count >0)
 120:             {
 121:                 ArrayList oPostingList = new ArrayList();
 122:                 for(int i=0;i<oChildChannel.Postings.Count;i++)
 123:                 {                    
 124:                     oPostingList.Add(oChildChannel.Postings[i]);
 125:                 }    
 126:                 
 127:                 int iCount = 1;
 128:  
 129:                 foreach(Posting oComparePosting in oChildChannel.Postings)
 130:                 {                    
 131:                     int i=0;
 132:                     foreach(Posting oPosting in oPostingList)
 133:                     {
 134:                         if(oPosting.Name == oComparePosting.Name )
 135:                         {    
 136:                             i++;
 137:                             if(i>1)
 138:                             {
 139:                                 
 140:                                 string strOldName = oPosting.Name;                                
 141:                                 string strNewName = strOldName + i.ToString();
 142:  
 143:                                 oPosting.Name = strNewName;
 144:                                 oPosting.DisplayName = strNewName;    
 145:                                 oPosting.Approve();
 146:         
 147:                                 appContext.CommitAll();
 148:                                 Console.WriteLine("Channel : " + oChildChannel.Name + "old name: " + strOldName + " New Name :" + strNewName );
 149:                                 oTextWriter.WriteLine("Channel : " + oChildChannel.Name + "old name: " + strOldName + " New Name :" + strNewName );
 150:                             }                            
 151:                         }
 152:                     }
 153:                     iCount ++;
 154:                 }
 155:             }            
 156:             return Postings;
 157:         }
 158:  
 159:     }
 160: }
 161:  
 162:  
 163:  

MCMS 2002 Migration: http://msdn.microsoft.com/en-us/library/aa480227.aspx

Comments
  • PingBack from http://hoursfunnywallpaper.cn/?p=5431

  • Its a nice article. Can you tell me where to code the above mention code and how to run. I mean step by step. Kindly Help

  • that code was developed for  .Net console based application. You can wrap it in a .net cosole application and run it in the MCMS server.

    Thanks,

    Sowmyan

  • But how to run in MCMS Server- I mean can you tell me the steps.

  • First you have to create .Net console application with the code that I have provided here, once you compile the application it will create an execuatable (.exe) file for you. you can just double click on it and it will run, or if you are developing the application in CMS server then can run it directly from the VS by pressing F5.

  • Hey,

    Thanks for this post - good to know I'm not alone.

    However - your command line tool/script appears to rename the most recent items instead of the old items. For example - I'm looking at a MCMS database of items where myfile.jpg has 4 duplicates. I would assume the most recent version (last modified) would deserve the right to keep the original file name and all older versions would be renamed.  Am I looking at it the wrong way?

  • ah - I see the links are updated in the site anyhow - so I guess it doesn't matter how the renaming works. Sorry for odd question! Thank you again for posting this - especially the code.

Page 1 of 1 (7 items)
Leave a Comment
  • Please add 8 and 3 and type the answer here:
  • Post