public MigrationMapping(SPList list, ListMetadata table) { this.List = list; this.Table = table; this.FieldMapping = new List <MigrationMappingElem>(); this.ContentTypeMapping = new List <MigrationCtMappingElem>(); }
public void GenerateMetadata(string filePath, bool addNewFiles, bool removeMissingFiles) { // Deserialize existing metadata var listMetadataFiles = Directory.GetFiles(filePath, $"*.{ListMetaDataExtension}"); var listsMetadata = listMetadataFiles.Select(ListMetadata.DeserializeFromFile).ToList(); // Get all files in the folder var files = Directory.GetFiles(filePath, $"*.{ListExtension}"); if (addNewFiles || listsMetadata.Count == 0) { // Get list file names without a matching metadata file var newFiles = files.Where( file => listsMetadata.All( listInfo => Path.GetFileName(listInfo.Location.ToLower()) != Path.GetFileName(file.ToLower()))) .ToList(); // Generate any new files foreach (var newFile in newFiles) { var listMetadata = new ListMetadata { ListId = Guid.NewGuid().ToString(), Name = Path.GetFileNameWithoutExtension(newFile), Description = Path.GetFileNameWithoutExtension(newFile), Location = Path.GetFileName(newFile), Type = "rule", Separator = "|", UpdatedBy = "MaritzCX", LastUpdated = DateTime.UtcNow }; listMetadata.SerializeToFile(Path.ChangeExtension(newFile, ListMetaDataExtension)); } } if (!removeMissingFiles) { return; } // Get metadata files without a matching list file var missingFiles = listsMetadata.Where( listMetadata => files.Any(file => Path.GetFileName(file.ToLower()) != listMetadata.Location.ToLower())) .ToList(); // Remove missing files foreach (var missingFile in missingFiles) { File.Delete(Path.Combine(filePath, Path.ChangeExtension(missingFile.Location, ListMetaDataExtension))); } }
private static void ValidateList(ListMetadata listMetadata, string name, string tenantFolder) { if (!Directory.Exists(tenantFolder)) { throw new PledgeMissingListFolderException(PledgeGlobal.ExceptionMissingListFolder); } if (listMetadata == null) { throw new PledgeMissingListMetadataException(PledgeGlobal.ExceptionMissingListMetadata + $": {name}"); } if (!File.Exists(Path.Combine(tenantFolder, listMetadata.Location))) { var listName = Path.GetFileNameWithoutExtension(listMetadata.Name); throw new PledgeMissingListException(PledgeGlobal.ExceptionMissingList + $": {listName}"); } }
/// <summary> /// Internal metadata read process. /// </summary> /// <param name="pToFill"></param> /// <param name="pElement"></param> protected override void InternalRead(ref IMetadata pToFill, XElement pElement) { ListMetadata lToFill = pToFill as ListMetadata; foreach (XElement lXMetadata in pElement.Descendants(MetadataManager.cMetadataTag)) { XAttribute lXType = lXMetadata.Attribute(MetadataManager.cTypeTag); if (lXType == null) { continue; } IMetadata lMetadata = null; AMetadataReader lReader = MetadataManager.Instance.GetReader(lXType.Value); lReader.Read(out lMetadata, lXMetadata); lToFill.AddMetadata(lMetadata); } }
/// <summary> /// Get the id of the list from the supplied name. /// </summary> /// <param name="name"></param> /// <param name="tenantId"></param> /// <returns></returns> public override string GetListId(string name, string tenantId) { var listMetadata = new ListMetadata(); var tenantFolder = name.Equals(ListHelpName, StringComparison.OrdinalIgnoreCase) ? ListFolder : Directory.EnumerateDirectories(ListFolder).FirstOrDefault(path => path.EndsWith(tenantId)); if (tenantFolder != null) { var listMetadataFiles = Directory.GetFiles(tenantFolder, $"*.{ListMetaDataExtension}"); var listsMetadata = listMetadataFiles.Select(ListMetadata.DeserializeFromFile); listMetadata = listsMetadata.FirstOrDefault(metadata => string.Equals(metadata.Name, name, StringComparison.CurrentCultureIgnoreCase)); } ValidateList(listMetadata, name, tenantFolder); return(listMetadata?.ListId); }
/// <summary> /// Deletes the list. /// </summary> /// <param name="listId">The list identifier.</param> /// <param name="tenantId">The tenant identifier.</param> public override void DeleteList(string listId, string tenantId) { var tenantFolder = Directory.EnumerateDirectories(ListFolder).First(path => path.EndsWith(tenantId)); var listMetadataFiles = Directory.GetFiles(tenantFolder, $"*.{ListMetaDataExtension}"); foreach (var file in listMetadataFiles) { var metadata = ListMetadata.DeserializeFromFile(file); if (metadata.ListId != listId) { continue; } File.Delete(Path.Combine(tenantFolder, metadata.Location)); File.Delete(file); break; } }
public override List <string> GetSingleColumnList(string listId, string name, string tenantId) { var listMetadata = new ListMetadata(); var tenantFolder = name.Equals(ListHelpName, StringComparison.OrdinalIgnoreCase) ? ListFolder : Directory.EnumerateDirectories(ListFolder).FirstOrDefault(path => path.EndsWith(tenantId)); if (tenantFolder != null) { var listMetadataFiles = Directory.GetFiles(tenantFolder, $"*.{ListMetaDataExtension}"); var listsMetadata = listMetadataFiles.Select(ListMetadata.DeserializeFromFile); listMetadata = listsMetadata.FirstOrDefault(metadata => string.Equals(metadata.ListId, listId, StringComparison.CurrentCultureIgnoreCase)); } ValidateList(listMetadata, name, tenantFolder); if (listMetadata != null) { ColumnSeparators = new[] { listMetadata.Separator.DecodeDelimiter() } } ; return(listMetadata == null || tenantFolder == null ? null : new List(File.ReadAllLines(Path.Combine(tenantFolder, listMetadata.Location))).Content); }
public override void SaveList(List list) { var existingListMetadata = new ListMetadata(); var existingMetadataFile = string.Empty; var tenantFolder = Directory.EnumerateDirectories(ListFolder).FirstOrDefault(path => path.EndsWith(list.TenantId)); if (tenantFolder == null) { tenantFolder = Path.Combine(ListFolder, list.TenantId); Directory.CreateDirectory(tenantFolder); } else { var listMetadataFiles = Directory.GetFiles(tenantFolder, $"*.{ListMetaDataExtension}"); foreach (var file in listMetadataFiles) { var metadata = ListMetadata.DeserializeFromFile(file); if (metadata.ListId != list.ListId) { continue; } existingListMetadata = metadata; existingMetadataFile = file; break; } } var invalidFilenameCharacters = new Regex("[\\\\/:*?\"<>|]"); var newListLoaded = list.FileData.Length > 0; var existingMetadata = existingListMetadata.ListId != null; var newMetaData = existingListMetadata.Name != list.Name || existingListMetadata.Description != list.Description || existingListMetadata.Separator != list.Separator || existingListMetadata.Location != $"{invalidFilenameCharacters.Replace(list.Name, "")}_{list.ListId}.{ListExtension}"; var listMetadata = new ListMetadata { ListId = list.ListId, Name = list.Name, Description = list.Description, Location = newListLoaded ? $"{invalidFilenameCharacters.Replace(list.Name, "")}_{list.ListId}.{ListExtension}" : existingListMetadata.Location, Type = TranslateMetaType(list.Function), Separator = list.Separator, UpdatedBy = "MaritzCX", LastUpdated = DateTime.UtcNow }; if (newListLoaded) { if (existingMetadata) { File.Delete(Path.Combine(tenantFolder, existingListMetadata.Location)); } File.WriteAllBytes(Path.Combine(tenantFolder, listMetadata.Location ?? $"missing_{listMetadata.ListId}"), list.FileData); } if (newMetaData) { if (existingMetadata) { File.Delete(existingMetadataFile); } listMetadata.SerializeToFile(Path.Combine(tenantFolder, $"{invalidFilenameCharacters.Replace(list.Name, "")}_{list.ListId}.{ListMetaDataExtension}")); } }
public static MigrateResult MigrateItems(MigrateQuery query) { MigrateResult result = new MigrateResult { Success = true }; try { bool needValidation = (string.IsNullOrEmpty(query.PaginInfo)); RosterConfigService _configSrv = new RosterConfigService(); SPList shpList = SPContext.Current.Web.Lists[new Guid(query.Mapping.ListId)]; ListMetadata dbList = _configSrv.GetList(new Guid(query.Mapping.TableId)); var dbList_Fields = dbList.ListMetadataFields; var _globalMapping = _configSrv.GetMapping(); // collect and validate MigrationMapping mapping = new MigrationMapping(shpList, dbList); mapping.ContentTypeMapping.AddRange(query.Mapping.ContentTypeMapping.Select(m => new MigrationCtMappingElem { ListCtId = m.ListCtId, TableCtId = m.TableCtId.ToInt() })); foreach (var mItm in query.Mapping.FieldMapping) { ListMetadataField dbField = dbList_Fields.FirstOrDefault(fld => fld.InternalName.Equals(mItm.TableColumnName)); SPField listField = shpList.Fields.GetFieldByInternalName(mItm.ListFieldName); if (needValidation && dbField.DataSourceType == (int)LookupSourceType.Table && !(listField is SPFieldUser)) { SPFieldLookup shpFieldLookup = listField as SPFieldLookup; if (shpFieldLookup == null) { throw new Exception("You cannot map non-lookup field " + mItm.ListFieldName + " to Lookup column"); } var _lookupFieldMapping = _globalMapping.FirstOrDefault(m => m.ListName == new Guid(shpFieldLookup.LookupList).ToString()); if (_lookupFieldMapping == null || _lookupFieldMapping.TableName != dbField.DataSource) { throw new Exception(listField.Title + " field error. Mapping does not exist or Lookup lists don't match!"); } } bool listField_isMultiple = (listField.Type == SPFieldType.Lookup && (listField as SPFieldLookup).AllowMultipleValues) || (listField.Type == SPFieldType.User && (listField as SPFieldLookup).AllowMultipleValues) || (listField.TypeAsString == "DualLookup" && (listField as SPFieldLookup).AllowMultipleValues); mapping.FieldMapping.Add(new MigrationMappingElem { ListField = listField, AllowMultipleValues = listField_isMultiple, TableColumn = dbField, TableDbColumn = dbField.GetDbField() }); } if (needValidation) { var repeatedShPFields = mapping.FieldMapping.GroupBy(x => x.TableColumn.InternalName).Where(gr => gr.Count() > 1).Select(gr => gr.Key); if (repeatedShPFields.Any()) { throw new Exception("Following DB columns selected more than once: " + string.Join(",", repeatedShPFields)); } } double step = Math.Round(((LIST_ROW_LIMIT * 100) / (double)mapping.List.ItemCount), 2); string _pagingInfo = Migrate(query.PaginInfo, mapping); result.PagingInfo = (string)_pagingInfo ?? string.Empty; result.CurrentIndex = (_pagingInfo == null) ? 100 : query.CurrentIndex + step; } catch (Exception ex) { result.Success = false; result.ErrorMessage = ex.Message; } return(result); }