Last active
November 22, 2016 21:56
-
-
Save vince-geekcore/3af5de5352edf7aae31fffa3a9044023 to your computer and use it in GitHub Desktop.
This code was used in a one-time migration script on Sitecore 7.2 (2014) // Parts are supplied by Sitecore.Support. No guarantees ;) // More context can be found here http://www.geekcore.nl/sitecore/extreme-sitecore-migration/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This code was used in a one-time migration script on Sitecore 7.2 (2014) | |
// Parts are supplied by Sitecore.Support. No guarantees ;) | |
// More context can be found here http://www.geekcore.nl/sitecore/extreme-sitecore-migration/ | |
public class TransferMedia | |
{ | |
public Sitecore.Data.Database migration | |
{ | |
get | |
{ | |
return Sitecore.Data.Database.GetDatabase("migration"); | |
} | |
} | |
protected Database ContentDatabase | |
{ | |
get | |
{ | |
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master"); | |
return master; | |
} | |
} | |
public log4net.ILog logger = log4net.LogManager.GetLogger("Sitecore.Diagnostics.xxxxxxxxxxx"); | |
public StringBuilder Messages = new StringBuilder(); | |
public void TransferMediaFolder(Item siteRoot) | |
{ | |
using (new SecurityDisabler()) | |
{ | |
Item mediaLibRootInMigration = migration.GetItem(Sitecore.ItemIDs.MediaLibraryRoot); | |
Item mediaLibItem = mediaLibRootInMigration.Axes.GetChild(siteRoot.Name); | |
if(mediaLibItem == null) | |
{ | |
// No media folder found!! | |
string nomedialibMessage = String.Format("No media library folder in migration DB found for '{0}'", siteRoot.Paths.FullPath); | |
Messages.AppendLine(nomedialibMessage); | |
logger.Info(nomedialibMessage); | |
return; | |
} | |
Item medialibRootInMaster = ContentDatabase.GetItem(Sitecore.ItemIDs.MediaLibraryRoot); | |
TransferMediaNode(mediaLibItem, medialibRootInMaster, true); | |
string successMessage = String.Format("Succesfully transferred media item library for '{0}'", siteRoot.Paths.FullPath); | |
Messages.AppendLine(successMessage); | |
logger.Info(successMessage); | |
} | |
} | |
/// <summary> | |
/// Transfers the items. | |
/// | |
/// </summary> | |
protected bool TransferMediaNode(Item sourceItem, Item destinationRoot, bool includeSubItems) | |
{ | |
bool itemTransferred = false; | |
if (sourceItem == null) | |
{ | |
// do something | |
} | |
if (destinationRoot == null) | |
{ | |
// do something | |
} | |
using (new ProxyDisabler()) | |
{ | |
string outerXml = sourceItem.GetOuterXml(includeSubItems); | |
try | |
{ | |
ItemTransferringCapsule capsule = new ItemTransferringCapsule(sourceItem.Database, destinationRoot.Database); | |
try | |
{ | |
Event.Subscribe("item:saved", new EventHandler(BlobTransferrer.TransferBlobOnSave)); | |
using (new ItemTransferringContext(capsule)) | |
destinationRoot.Paste(outerXml, false, PasteMode.Overwrite); | |
} | |
finally | |
{ | |
Event.Unsubscribe("item:saved", new EventHandler(BlobTransferrer.TransferBlobOnSave)); | |
} | |
} | |
catch (TemplateNotFoundException ex) | |
{ | |
// log /throw error | |
} | |
} | |
return itemTransferred; | |
} | |
} | |
public class ItemTransferringCapsule | |
{ | |
public Database SourceDb { get; set; } | |
public Database TargetDb { get; set; } | |
public ItemTransferringCapsule(Database sourceDb, Database targetDb) | |
{ | |
this.SourceDb = sourceDb; | |
this.TargetDb = targetDb; | |
} | |
} | |
public class ItemTransferringContext : Switcher<ItemTransferringCapsule> | |
{ | |
public ItemTransferringContext(ItemTransferringCapsule capsule) | |
: base(capsule) | |
{ | |
} | |
} | |
public class BlobTransferrer | |
{ | |
public static log4net.ILog logger = log4net.LogManager.GetLogger("Sitecore.Diagnostics.xxxxxxxxx"); | |
public static void TransferBlobOnSave(object sender, EventArgs e) | |
{ | |
ItemTransferringCapsule currentValue = Switcher<ItemTransferringCapsule, ItemTransferringCapsule>.CurrentValue; | |
if (currentValue == null) | |
return; | |
Item obj = SitecoreEventArgs.GetItem(e, 0); | |
Assert.IsNotNull((object)obj, "Item cannot be null"); | |
List<Guid> blobIds = new List<Guid>(); | |
if (obj.Template != null) | |
{ | |
foreach (TemplateField templateField in TemplateManager.GetTemplate(obj).GetFields()) | |
{ | |
if (templateField.IsBlob) | |
{ | |
string str = obj.Fields[templateField.ID].GetValue(true); | |
if (!StringExtensions.IsNullOrEmpty(str) && MainUtil.IsID(str)) | |
blobIds.Add(new Guid(str)); | |
} | |
} | |
} | |
else | |
{ | |
// No media folder found!! | |
string noTemplateMessage = String.Format("No template found for item: '{0}'", obj.Paths.FullPath); | |
logger.Info(noTemplateMessage); | |
} | |
if (blobIds.Count <= 0) | |
return; | |
BlobTransferrer.PerformBlobsTransfer(blobIds, currentValue); | |
} | |
private static void PerformBlobsTransfer(List<Guid> blobIds, ItemTransferringCapsule currentCapsule) | |
{ | |
foreach (Guid blobId in blobIds) | |
{ | |
if (!ItemManager.BlobStreamExists(blobId, currentCapsule.TargetDb)) | |
{ | |
using (Stream blobStream = ItemManager.GetBlobStream(blobId, currentCapsule.SourceDb)) | |
ItemManager.SetBlobStream(blobStream, blobId, currentCapsule.TargetDb); | |
} | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment