Ejemplo n.º 1
0
        /// <summary>
        /// Imports serialized data from a package by checking if its valid
        /// and already exists.
        /// </summary>
        public SerializedDataImport ImportData()
        {
            //Check if data folder exists
            var absoluteDataFolderPath = Path.Combine(_absolutePackagePath, "Data");

            if (!Directory.Exists(absoluteDataFolderPath))
            {
                return(new SerializedDataImport());
            }

            //Load serialized data and deserialize to objects for import
            var serialization = _context.Application.FrameworkContext.Serialization;
            SerializedDataImport dataImport = new SerializedDataImport();

            var directories = new DirectoryInfo(absoluteDataFolderPath).GetDirectories("*", SearchOption.TopDirectoryOnly);

            foreach (var directory in directories)
            {
                var fileInfos = directory.GetFiles("*", SearchOption.AllDirectories);
                foreach (var fileInfo in fileInfos)
                {
                    if (fileInfo.DirectoryName == null)
                    {
                        continue;
                    }

                    //Deserialize content
                    if (fileInfo.DirectoryName.EndsWith("data\\content", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(TypedEntity));
                        dataImport.Entities.Add(new DeseriazliedDataResult(o, typeof(TypedEntity)));
                    }
                    else if (fileInfo.DirectoryName.EndsWith("data\\content\\relations", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(Relation));
                        dataImport.EntityRelations.Add(new DeseriazliedDataResult(o, typeof(Relation)));
                    }
                    //Deserialize DataTypes
                    if (fileInfo.DirectoryName.EndsWith("data\\datatypes", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(AttributeType));
                        dataImport.AttributeTypes.Add(new DeseriazliedDataResult(o, typeof(AttributeType)));
                    }
                    //Deserialize Dictionary Items
                    if (fileInfo.DirectoryName.EndsWith("data\\dictionaryitems", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(TypedEntity));
                        dataImport.Entities.Add(new DeseriazliedDataResult(o, typeof(TypedEntity)));
                    }
                    else if (fileInfo.DirectoryName.EndsWith("data\\dictionaryitems\\relations", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(Relation));
                        dataImport.EntityRelations.Add(new DeseriazliedDataResult(o, typeof(Relation)));
                    }
                    //Deserialize DocumentTypes
                    if (fileInfo.DirectoryName.EndsWith("data\\documenttypes", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(EntitySchema));
                        dataImport.Schemas.Add(new DeseriazliedDataResult(o, typeof(EntitySchema)));
                    }
                    else if (fileInfo.DirectoryName.EndsWith("data\\documenttypes\\relations", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(Relation));
                        dataImport.SchemaRelations.Add(new DeseriazliedDataResult(o, typeof(Relation)));
                    }
                    //Deserialize Media
                    if (fileInfo.DirectoryName.EndsWith("data\\media", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(TypedEntity));
                        dataImport.Entities.Add(new DeseriazliedDataResult(o, typeof(TypedEntity)));
                    }
                    else if (fileInfo.DirectoryName.EndsWith("data\\media\\relations", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(Relation));
                        dataImport.EntityRelations.Add(new DeseriazliedDataResult(o, typeof(Relation)));
                    }
                    //Deserialize MediaTypes
                    if (fileInfo.DirectoryName.EndsWith("data\\mediatypes", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(EntitySchema));
                        dataImport.Schemas.Add(new DeseriazliedDataResult(o, typeof(EntitySchema)));
                    }
                    else if (fileInfo.DirectoryName.EndsWith("data\\mediatypes\\relations", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(Relation));
                        dataImport.SchemaRelations.Add(new DeseriazliedDataResult(o, typeof(Relation)));
                    }
                    //Deserialize Languages
                    if (fileInfo.DirectoryName.EndsWith("data\\languages", StringComparison.InvariantCultureIgnoreCase))
                    {
                        object o = serialization.FromStream(fileInfo.OpenRead(), typeof(LanguageElement));
                        dataImport.Languages.Add(new DeseriazliedDataResult(o, typeof(LanguageElement)));
                    }
                }
            }

            //Check entities and relations
            CheckImportableEntities(dataImport);
            CheckImportableRelations(dataImport);

            //Open writer and save deserialized attribute types, schemas, entities and relations
            using (var uow = _context.Application.Hive.OpenWriter <IContentStore>())
            {
                foreach (var attributeType in dataImport.AttributeTypes.Where(attributeType => attributeType.IsImportable))
                {
                    uow.Repositories.Schemas.AddOrUpdate(attributeType.DeserializedObject as AttributeType);
                }

                foreach (var schema in dataImport.Schemas.Where(schema => schema.IsImportable))
                {
                    uow.Repositories.Schemas.AddOrUpdate(schema.DeserializedObject as EntitySchema);
                }

                foreach (var schemaRelation in dataImport.SchemaRelations.Where(schema => schema.IsImportable))
                {
                    var relation = schemaRelation.DeserializedObject as IRelationById;
                    uow.Repositories.Schemas.AddRelation(relation.SourceId, relation.DestinationId, relation.Type, relation.Ordinal, relation.MetaData.ToArray());
                }

                foreach (var entity in dataImport.Entities.Where(entity => entity.IsImportable))
                {
                    uow.Repositories.AddOrUpdate(entity.DeserializedObject as TypedEntity);
                }

                foreach (var entityRelation in dataImport.EntityRelations.Where(schema => schema.IsImportable))
                {
                    var relation = entityRelation.DeserializedObject as IRelationById;
                    uow.Repositories.AddRelation(relation.SourceId, relation.DestinationId, relation.Type, relation.Ordinal, relation.MetaData.ToArray());
                }

                uow.Complete();
            }

            // Regenerate any image thubnails
            var entitiesWithFiles = dataImport.Entities.Where(x => x.IsImportable)
                                    .Select(x => x.DeserializedObject as TypedEntity)
                                    .Where(x => x.Attributes
                                           .Any(y => y.AttributeDefinition.AttributeType.RenderTypeProvider.InvariantEquals(CorePluginConstants.FileUploadPropertyEditorId)));

            if (entitiesWithFiles.Any())
            {
                // Get a list of attribute type ids that use the file uploader property editor
                var attributeTypeIds = entitiesWithFiles
                                       .SelectMany(x => x.Attributes
                                                   .Where(y => y.AttributeDefinition.AttributeType.RenderTypeProvider.InvariantEquals(CorePluginConstants.FileUploadPropertyEditorId))
                                                   .Select(y => y.AttributeDefinition.AttributeType.Id))
                                       .Distinct().ToArray();

                using (var contentUow = _context.Application.Hive.OpenWriter <IContentStore>())
                    using (var fileUow = _context.Application.Hive.OpenWriter <IFileStore>(new Uri("storage://file-uploader/")))
                    {
                        // Load attribute types from hive incase prevalues are different to those serialized (hive take presidence)
                        var attributeTypes = contentUow.Repositories.Schemas.Get <AttributeType>(true, attributeTypeIds);

                        foreach (var entity in entitiesWithFiles)
                        {
                            var uploadAttributes = entity.Attributes
                                                   .Where(x => x.AttributeDefinition.AttributeType.RenderTypeProvider.InvariantEquals(CorePluginConstants.FileUploadPropertyEditorId))
                                                   .ToList();

                            foreach (var uploadAttribute in uploadAttributes)
                            {
                                var mediaId = uploadAttribute.Values["MediaId"].ToString();
                                var fileId  = HiveId.Parse(uploadAttribute.Values["Value"].ToString());
                                if (!string.IsNullOrWhiteSpace(mediaId) && !fileId.IsNullValueOrEmpty())
                                {
                                    // Refetch the attribute type
                                    var attributeType = attributeTypes.SingleOrDefault(x => x.Id == uploadAttribute.AttributeDefinition.AttributeType.Id);
                                    var dataType      = _context.Application.FrameworkContext.TypeMappers.Map <DataType>(attributeType);

                                    var preValue = dataType.GetPreValueModel() as dynamic;
                                    var sizes    = preValue.Sizes;
                                    var file     = fileUow.Repositories.Get <Rebel.Framework.Persistence.Model.IO.File>(fileId);
                                    if (file.IsImage())
                                    {
                                        ContentExtensions.CreateThumbnails(fileUow, file, mediaId, sizes);
                                    }
                                }
                            }
                        }

                        fileUow.Complete();
                    }
            }

            if (dataImport.Languages.Any())
            {
                // Persist the language entity
                var configFile = Path.Combine(_httpContext.Server.MapPath("~/App_Data/Rebel/Config"), "rebel.cms.languages.config");
                var configXml  = XDocument.Load(configFile);

                foreach (var language in dataImport.Languages)
                {
                    var lang = language.DeserializedObject as LanguageElement;
                    if (lang == null)
                    {
                        continue;
                    }

                    // Remove previous entry
                    configXml.Descendants("language").Where(x => x.Attribute("isoCode").Value == lang.IsoCode).Remove();

                    // Add new entry
                    configXml.Element("languages").Add(XElement.Parse(lang.ToXmlString()));

                    language.IsImportable = true;
                    language.ObjectId     = new HiveId(lang.IsoCode.EncodeAsGuid());
                }

                configXml.Save(configFile);
            }

            return(dataImport);
        }