/// <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); }