|
using System; |
|
using Telerik.Sitefinity.Data.ContentLinks; |
|
using Telerik.Sitefinity.DynamicModules.Model; |
|
using Telerik.Sitefinity.Model; |
|
using Telerik.Sitefinity.Publishing; |
|
using Telerik.Sitefinity.SiteSync; |
|
using Telerik.Sitefinity.Utilities.TypeConverters; |
|
|
|
namespace SitefinityWebApp |
|
{ |
|
public class CustomMigrationBehavior : ICustomMigrationBehavior |
|
{ |
|
/// <summary> |
|
/// Gets a value indicating whether implicitly syncing item dependencies should be skipped |
|
/// </summary> |
|
public bool SkipLoadingDependencies |
|
{ |
|
get { return false; } |
|
} |
|
|
|
/// <summary> |
|
/// Prepares an item for migration |
|
/// </summary> |
|
/// <param name="item">The exported item</param> |
|
/// <param name="obj">The wrapper object containing exported information</param> |
|
/// <param name="context">The export context</param> |
|
public void ProcessItemExport(object item, WrapperObject obj, ISiteSyncExportContext context) |
|
{ |
|
if (item is DynamicContent dynamicContent) |
|
{ |
|
// Example on how to tell the destination server to create new item with different ID. |
|
// All properties of the WrapperObject could be altered here. |
|
this.MapForceCreateItem(dynamicContent, obj, context); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Validates the import operation |
|
/// </summary> |
|
/// <param name="wrapperObject">The wrapper object containing import information</param> |
|
/// <param name="importTransaction">The import transaction</param> |
|
/// <returns>A value indicating whether the import operation is valid</returns> |
|
public bool ProcessItemImport(WrapperObject wrapperObject, ISiteSyncImportTransaction importTransaction) |
|
{ |
|
var itemType = wrapperObject.GetPropertyOrDefault<string>(ObjectTypeId); |
|
var type = TypeResolutionService.ResolveType(itemType, false); |
|
|
|
if (type != null && typeof(DynamicContent).IsAssignableFrom(type)) |
|
{ |
|
// Example on how to change the "OriginalContentId" property to match the new item ID |
|
this.Map(importTransaction.Response.Mappings, wrapperObject, "OriginalContentId"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/// <summary> |
|
/// Handles the logic on the target server after migration completes |
|
/// </summary> |
|
/// <param name="migrationMappings">The migration mappings</param> |
|
/// <param name="siteInfo">The target site info</param> |
|
public void HandleMigrationCompleted(SiteSyncMigrationMappings migrationMappings, SiteSyncSiteInfo siteInfo) |
|
{ |
|
var linksManager = ContentLinksManager.GetManager(); |
|
var links = linksManager.GetContentLinks(); |
|
foreach (var link in links) |
|
{ |
|
this.Map(migrationMappings, link, "ChildItemId", link.ChildItemType); |
|
this.Map(migrationMappings, link, "ParentItemId", link.ParentItemType); |
|
} |
|
|
|
linksManager.SaveChanges(); |
|
} |
|
|
|
#region Helper methods |
|
|
|
private void Map(SiteSyncMigrationMappings migrationMappings, object obj, string propertyName, string mapType = null, string mappedPropertyName = ItemId) |
|
{ |
|
if (obj is WrapperObject wrapperObject) |
|
{ |
|
var itemType = wrapperObject.GetPropertyOrDefault<string>(ObjectTypeId); |
|
if (wrapperObject.HasProperty(propertyName)) |
|
{ |
|
var mapping = migrationMappings.GetMapping(mapType ?? itemType, wrapperObject.GetProperty(propertyName).ToString(), mappedPropertyName); |
|
if (mapping != null) |
|
{ |
|
var currentProp = wrapperObject.GetPropertyOrNull(propertyName); |
|
if (currentProp != null && currentProp.GetType() == typeof(Guid)) |
|
{ |
|
wrapperObject.SetProperty(propertyName, Guid.Parse(mapping)); |
|
} |
|
else |
|
{ |
|
wrapperObject.SetProperty(propertyName, mapping); |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
var itemType = obj.GetType(); |
|
var property = itemType.GetProperty(propertyName); |
|
if (property != null) |
|
{ |
|
var mapping = migrationMappings.GetMapping(mapType ?? itemType.FullName, property.GetValue(obj, null).ToString(), mappedPropertyName); |
|
if (mapping != null) |
|
{ |
|
if (property.PropertyType == typeof(Guid)) |
|
{ |
|
property.SetValue(obj, Guid.Parse(mapping)); |
|
} |
|
else |
|
{ |
|
property.SetValue(obj, mapping); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
private void MapForceCreateItem(IDataItem dataItem, WrapperObject obj, ISiteSyncExportContext context) |
|
{ |
|
var mapping = context.GetMapping(dataItem.GetType().FullName, dataItem.Id); |
|
if (mapping == null) |
|
{ |
|
// The item is not existing on the target server and it should be created even if the item with same id already exists. |
|
obj.AddProperty(ForceCreateNewItem, true); |
|
} |
|
else |
|
{ |
|
var newId = (Guid)mapping; |
|
// The item is already created on the target server. |
|
obj.AddProperty(Id, newId); // The identity of the item can't be changed, so we add the Id as additional property. |
|
obj.SetOrAddProperty(ObjectId, newId); |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
private const string Id = "Id"; |
|
private const string ItemId = "ItemId"; |
|
private const string ObjectId = "objectId"; |
|
private const string ObjectTypeId = "objectTypeId"; |
|
private const string ForceCreateNewItem = "ForceCreateNewItem"; |
|
} |
|
} |