Fix Issue 8121: ElementWrapperPartDriver (#8125)

Prevent data being lost when overwriting data during subsequent import/export events.
This commit is contained in:
Andy Mason 2018-10-11 20:10:08 +01:00 committed by Sébastien Ros
parent 533eb411e9
commit 33002234fe

View File

@ -1,5 +1,4 @@
using System;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
@ -91,11 +90,10 @@ namespace Orchard.Layouts.Drivers {
protected override void Exported(ElementWrapperPart part, ExportContentContext context) {
var describeContext = CreateDescribeContext(part);
var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, part.ElementTypeName);
var data = ElementDataHelper.Deserialize(part.ElementData);
var element = _elementManager.ActivateElement(descriptor, e => e.Data = data);
_elementManager.Exported(new[] { element }, new ExportLayoutContext());
// Deserialize element from the version set in the Exporting method
var currentContextValue = context.Element(part.PartDefinition.Name).Value;
var element = _serializer.Deserialize(currentContextValue, describeContext);
_elementManager.Exported(new[] {element}, new ExportLayoutContext());
var exportableData = _serializer.Serialize(element);
context.Element(part.PartDefinition.Name).SetValue(exportableData);
@ -108,22 +106,38 @@ namespace Orchard.Layouts.Drivers {
}
protected override void Imported(ElementWrapperPart part, ImportContentContext context) {
HandleImportEvent(part, context, (describeContext, element) => {
HandleSecondaryImportEvent(part, context, (describeContext, element) => {
_elementManager.Imported(new[] { element }, new ImportLayoutContext { Session = new ImportContentContextWrapper(context) });
});
}
protected override void ImportCompleted(ElementWrapperPart part, ImportContentContext context) {
HandleImportEvent(part, context, (describeContext, element) => {
HandleSecondaryImportEvent(part, context, (describeContext, element) => {
_elementManager.ImportCompleted(new[] { element }, new ImportLayoutContext { Session = new ImportContentContextWrapper(context) });
});
}
private void HandleSecondaryImportEvent(ElementWrapperPart part, ImportContentContext context, Action<DescribeElementsContext, Element> callback) {
var root = context.Data.Element(part.PartDefinition.Name);
if (root == null) {
return;
}
var describeContext = CreateDescribeContext(part);
// Deserialize element from the data set in previous Import events
var descriptor = _elementManager.GetElementDescriptorByTypeName(describeContext, part.ElementTypeName);
var data = ElementDataHelper.Deserialize(part.ElementData);
var element = _elementManager.ActivateElement(descriptor, e => e.Data = data);
callback(describeContext, element);
part.ElementData = element.Data.Serialize();
}
private void HandleImportEvent(ElementWrapperPart part, ImportContentContext context, Action<DescribeElementsContext, Element> callback) {
var root = context.Data.Element(part.PartDefinition.Name);
if (root == null)
if (root == null) {
return;
}
var exportedData = root.Value;
var describeContext = CreateDescribeContext(part);