private Item EnsureMediaFolders(MigrateItemPipelineArgs args)
        {
            var source = args.Source;

            // Determine if the parent already exists.  If it does, there is nothing to do.
            var parent = Sitecore.Context.Database.GetItem(new ID(source.ParentId));

            if (parent != null)
            {
                return(parent);
            }

            // Work backwards ensuring folders exist, skipping the current item
            var firstVersion = source.Versions.First();
            var path         = _hardRockWebServiceProxy.GetFullPath(source.Id, firstVersion.Language, firstVersion.Version);

            // Find first ancestor that exists
            var count = path.Count;
            var index = 2; //Skip the first 2 (self and parent)

            while (index < count)
            {
                parent = Sitecore.Context.Database.GetItem(new ID(path[index].Id));
                if (parent != null)
                {
                    break;
                }

                index++;
            }

            // Move to the first missing parent
            index--;

            // Create the parents, furthest to closest
            while (index > 0)
            {
                var folder = path[index];

                // Create the folder.  This becomes the parent for the next item
                parent = CreateItem(folder.Name, parent, TemplateIDs.MediaFolder, new ID(folder.Id));

                Sitecore.Diagnostics.Log.Debug(string.Format("[FieldMigrator] (CreateMediaItem): {0}", parent.Paths.FullPath), this);

                index--;
            }

            return(parent);
        }
        public virtual void Process(CreateItemPipelineArgs args)
        {
            if (args.Source == null ||
                args.Parent != null ||
                args.Template == null)
            {
                return;
            }

            var source = args.Source;

            // Determine if the parent already exists.  If it does, there is nothing to do.
            args.Parent = Sitecore.Context.Database.GetItem(new ID(source.ParentId));
            if (args.Parent != null)
            {
                return;
            }

            Item parent = null;

            // Work backwards ensuring folders exist, skipping the current item
            var firstVersion = source.Versions.First();
            var path         = _hardRockWebServiceProxy.GetFullPath(source.Id, firstVersion.Language, firstVersion.Version);

            // Get folder type based on location
            var folderTemplateId = (path.Any(f => f.Id == ItemIDs.MediaLibraryRoot.Guid)) ? TemplateIDs.MediaFolder : TemplateIDs.Folder;

            // Find first ancestor that exists
            var count = path.Count;
            var index = 2; //Skip the first 2 (self and parent)

            while (index < count)
            {
                parent = Sitecore.Context.Database.GetItem(new ID(path[index].Id));
                if (parent != null)
                {
                    break;
                }

                index++;
            }

            // Move to the first missing parent
            index--;

            // Create the parents, furthest to closest
            while (index > 0)
            {
                var folder = path[index];

                // Create the folder.  This becomes the parent for the next item
                parent = ItemManager.CreateItem(folder.Name, parent, folderTemplateId, new ID(folder.Id), SecurityCheck.Disable);

                // Add at least 1 version
                if (!string.IsNullOrEmpty(DefaultLanguage))
                {
                    var language = LanguageManager.GetLanguage(DefaultLanguage);
                    parent = (parent.Language == language) ? parent : parent.Database.GetItem(parent.ID, language);

                    // Create version if it does not exist
                    if (parent.Versions.Count == 0)
                    {
                        var disableFiltering = Sitecore.Context.Site.DisableFiltering;
                        try
                        {
                            Sitecore.Context.Site.DisableFiltering = true;
                            parent = parent.Versions.AddVersion();
                        }
                        finally
                        {
                            Sitecore.Context.Site.DisableFiltering = disableFiltering;
                        }
                    }
                }

                Sitecore.Diagnostics.Log.Debug(string.Format("[FieldMigrator] Created: {0}", parent.Paths.FullPath), this);

                index--;
            }

            args.Parent = parent;
        }