Пример #1
0
 public MigrationMapping(SPList list, ListMetadata table)
 {
     this.List               = list;
     this.Table              = table;
     this.FieldMapping       = new List <MigrationMappingElem>();
     this.ContentTypeMapping = new List <MigrationCtMappingElem>();
 }
Пример #2
0
        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)));
            }
        }
Пример #3
0
        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}");
            }
        }
Пример #4
0
        /// <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);
            }
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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;
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
        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}"));
            }
        }
Пример #9
0
        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);
        }