private bool RunDocumentValidityChecks() { // Assure that each element has a GUID and language child element foreach (var element in DocumentElements) { if (element.Element(XmlConstants.EntityGuid) == null) { element.Add(new XElement(XmlConstants.EntityGuid, "")); } if (element.Element(XmlConstants.EntityLanguage) == null) { element.Add(new XElement(XmlConstants.EntityLanguage, "")); } } var documentElementLanguagesAll = DocumentElements .GroupBy(element => element.Element(XmlConstants.EntityGuid)?.Value) .Select(group => @group .Select(element => element.Element(XmlConstants.EntityLanguage)?.Value) .ToList()) .ToList(); var documentElementLanguagesCount = documentElementLanguagesAll.Select(item => item.Count); if (documentElementLanguagesCount.Any(count => count != 1)) { // It is an all language import, so check if all languages are specified for all entities if (documentElementLanguagesAll.Any(lang => _languages.Except(lang).Any())) { ErrorLog.AppendError(ImportErrorCode.MissingElementLanguage, "Langs=" + string.Join(", ", _languages)); return(false); } } return(true); }
/// <summary> /// Deserialize a 2sxc data xml stream to the memory. The data will also be checked for /// errors. /// </summary> /// <param name="dataStream">Data stream</param> private void ValidateAndImportToMemory(Stream dataStream) { try { if (languages == null || languages.Count() == 0) { languages = new string[] { string.Empty }; } if (contentType == null) { ErrorProtocol.AppendError(ImportErrorCode.InvalidContentType); return; } Document = XDocument.Load(dataStream); dataStream.Position = 0; if (Document == null) { ErrorProtocol.AppendError(ImportErrorCode.InvalidDocument); return; } var documentRoot = Document.Element(DocumentNodeNames.Root + contentType.Name.RemoveSpecialCharacters()); if (documentRoot == null) { ErrorProtocol.AppendError(ImportErrorCode.InvalidRoot); return; } DocumentElements = documentRoot.Elements(DocumentNodeNames.Entity); var documentElementNumber = 0; var documentElementLanguagesAll = DocumentElements.GroupBy(element => element.Element(DocumentNodeNames.EntityGuid).Value) .Select(group => group.Select(element => element.Element(DocumentNodeNames.EntityLanguage).Value)).ToList(); var documentElementLanguagesCount = documentElementLanguagesAll.Select(item => item.Count()); if (documentElementLanguagesCount.Any(count => count != 1)) { // It is an all language import, so check if all languages are specified for all entities foreach (var documentElementLanguages in documentElementLanguagesAll) { if (languages.Except(documentElementLanguages).Any()) { ErrorProtocol.AppendError(ImportErrorCode.MissingElementLanguage, "Langs=" + string.Join(", ", languages)); return; } } } var entityGuidManager = new EntityGuidManager(); foreach (var documentElement in DocumentElements) { documentElementNumber++; var documentElementLanguage = documentElement.GetChildElementValue(DocumentNodeNames.EntityLanguage); if (!languages.Any(language => language == documentElementLanguage)) { // DNN does not support the language ErrorProtocol.AppendError(ImportErrorCode.InvalidLanguage, "Lang=" + documentElementLanguage, documentElementNumber); continue; } var entityGuid = entityGuidManager.GetGuid(documentElement, documentLanguageFallback); var entity = GetEntity(entityGuid); if (entity == null) { entity = AppendEntity(entityGuid); } var attributes = contentType.GetAttributes(); foreach (var attribute in attributes) { var valueName = attribute.StaticName; var value = documentElement.GetChildElementValue(valueName); if (value == null || value.IsValueDefault()) { continue; } var valueType = attribute.Type; var valueReferenceLanguage = value.GetValueReferenceLanguage(); if (valueReferenceLanguage == null) { // It is not a value reference.. it is a normal text try { entity.AppendAttributeValue(valueName, value, valueType, documentElementLanguage, false, resourceReference.IsResolve()); } catch (FormatException) { ErrorProtocol.AppendError(ImportErrorCode.InvalidValueFormat, valueName + ":" + valueType + "=" + value, documentElementNumber); } continue; } var valueReferenceProtection = value.GetValueReferenceProtection(); if (valueReferenceProtection != "rw" && valueReferenceProtection != "ro") { ErrorProtocol.AppendError(ImportErrorCode.InvalidValueReferenceProtection, value, documentElementNumber); continue; } var valueReadOnly = valueReferenceProtection == "ro"; var entityValue = entity.GetAttributeValue(valueName, valueReferenceLanguage); if (entityValue != null) { entityValue.AppendLanguageReference(documentElementLanguage, valueReadOnly); continue; } // We do not have the value referenced in memory, so search for the // value in the database var dbEntity = contentType.GetEntity(entityGuid); if (dbEntity == null) { ErrorProtocol.AppendError(ImportErrorCode.InvalidValueReference, value, documentElementNumber); continue; } var dbEntityValue = dbEntity.GetAttributeValue(attribute, valueReferenceLanguage); if (dbEntityValue == null) { ErrorProtocol.AppendError(ImportErrorCode.InvalidValueReference, value, documentElementNumber); continue; } entity.AppendAttributeValue(valueName, dbEntityValue.Value, valueType, valueReferenceLanguage, dbEntityValue.IsLanguageReadOnly(valueReferenceLanguage), resourceReference.IsResolve()) .AppendLanguageReference(documentElementLanguage, valueReadOnly); } } } catch (Exception exception) { ErrorProtocol.AppendError(ImportErrorCode.Unknown, exception.ToString()); } }