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