Fixes #U4-5921 Import of Document Type fails, if dependencies are not part of the import.

This commit is contained in:
Morten Christensen
2014-12-02 13:35:58 +01:00
parent d4db32c0f2
commit b11135a096

View File

@@ -336,48 +336,56 @@ namespace Umbraco.Core.Services
? (from doc in element.Elements("DocumentType") select doc).ToList()
: new List<XElement> { element };
//NOTE Here we sort the doctype XElements based on dependencies
//before creating the doc types - this should also allow for a better structure/inheritance support.
//When you are importing a single doc type we have to assume that the depedencies are already there.
//Otherwise something like uSync won't work.
var fields = new List<TopologicalSorter.DependencyField<XElement>>();
foreach (var documentType in unsortedDocumentTypes)
var isSingleDocTypeImport = unsortedDocumentTypes.Count == 1;
if (isSingleDocTypeImport == false)
{
var elementCopy = documentType;
var infoElement = elementCopy.Element("Info");
var dependencies = new List<string>();
//Add the Master as a dependency
if (elementCopy.Element("Master") != null &&
string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false)
//NOTE Here we sort the doctype XElements based on dependencies
//before creating the doc types - this should also allow for a better structure/inheritance support.
foreach (var documentType in unsortedDocumentTypes)
{
dependencies.Add(elementCopy.Element("Master").Value);
}
var elementCopy = documentType;
var infoElement = elementCopy.Element("Info");
var dependencies = new List<string>();
//Add compositions as dependencies
var compositionsElement = infoElement.Element("Compositions");
if (compositionsElement != null && compositionsElement.HasElements)
{
var compositions = compositionsElement.Elements("Composition");
if (compositions.Any())
//Add the Master as a dependency
if (elementCopy.Element("Master") != null &&
string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false)
{
foreach (var composition in compositions)
dependencies.Add(elementCopy.Element("Master").Value);
}
//Add compositions as dependencies
var compositionsElement = infoElement.Element("Compositions");
if (compositionsElement != null && compositionsElement.HasElements)
{
var compositions = compositionsElement.Elements("Composition");
if (compositions.Any())
{
dependencies.Add(composition.Value);
foreach (var composition in compositions)
{
dependencies.Add(composition.Value);
}
}
}
}
var field = new TopologicalSorter.DependencyField<XElement>
{
Alias = infoElement.Element("Alias").Value,
Item = new Lazy<XElement>(() => elementCopy),
DependsOn = dependencies.ToArray()
};
fields.Add(field);
var field = new TopologicalSorter.DependencyField<XElement>
{
Alias = infoElement.Element("Alias").Value,
Item = new Lazy<XElement>(() => elementCopy),
DependsOn = dependencies.ToArray()
};
fields.Add(field);
}
}
//Sorting the Document Types based on dependencies
var documentTypes = TopologicalSorter.GetSortedItems(fields).ToList();
//Sorting the Document Types based on dependencies - if its not a single doc type import ref. #U4-5921
var documentTypes = isSingleDocTypeImport
? unsortedDocumentTypes.ToList()
: TopologicalSorter.GetSortedItems(fields).ToList();
//Iterate the sorted document types and create them as IContentType objects
foreach (var documentType in documentTypes)