Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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());
            }
        }