Ejemplo n.º 1
0
        public FieldMapping Parse(string line)
        {
            var fieldMap        = new FieldMapping();
            var w3CFields       = typeof(LogEvent).GetProperties();
            var lineFields      = line.Split(' ');
            var lineFieldsIndex = 0;
            var accessors       = TypeAccessor.Create(typeof(LogEvent));

            foreach (var lineField in lineFields)
            {
                var index = lineFieldsIndex;
                GetFieldAttributeByName(lineField, w3CFields, (fieldAttribute, fieldInfo) =>
                {
                    fieldMap.Add(index, new FieldMapInfo(fieldAttribute.Convertor, accessors, fieldInfo.Name));
                });
                lineFieldsIndex += 1;
            }
            return(fieldMap);
        }
        private Dictionary <string, FieldMapping <JiraRevision> > InitializeFieldMappings()
        {
            Logger.Log(LogLevel.Info, "Initializing Jira field mapping...");

            var commonFields = new FieldMapping <JiraRevision>();
            var typeFields   = new Dictionary <string, FieldMapping <JiraRevision> >();

            foreach (var targetType in _targetTypes)
            {
                if (!typeFields.ContainsKey(targetType))
                {
                    typeFields.Add(targetType, new FieldMapping <JiraRevision>());
                }
            }

            foreach (var item in _config.FieldMap.Fields)
            {
                if (item.Source != null)
                {
                    var isCustomField = item.SourceType == "name";
                    Func <JiraRevision, (bool, object)> value;

                    if (item.Mapping?.Values != null)
                    {
                        value = r => MapValue(r, item.Source);
                    }
                    else if (!string.IsNullOrWhiteSpace(item.Mapper))
                    {
                        switch (item.Mapper)
                        {
                        case "MapTitle":
                            value = r => MapTitle(r);
                            break;

                        case "MapTitleWithoutKey":
                            value = r => MapTitleWithoutKey(r);
                            break;

                        case "MapUser":
                            value = IfChanged <string>(item.Source, isCustomField, MapUser);
                            break;

                        case "MapSprint":
                            value = IfChanged <string>(item.Source, isCustomField, MapSprint);
                            break;

                        case "MapTags":
                            value = IfChanged <string>(item.Source, isCustomField, MapTags);
                            break;

                        case "MapArray":
                            value = IfChanged <string>(item.Source, isCustomField, MapArray);
                            break;

                        case "MapRemainingWork":
                            value = IfChanged <string>(item.Source, isCustomField, MapRemainingWork);
                            break;

                        case "MapRendered":
                            value = r => MapRenderedValue(r, item.Source, isCustomField);
                            break;

                        default:
                            value = IfChanged <string>(item.Source, isCustomField);
                            break;
                        }
                    }
                    else
                    {
                        var dataType = item.Type.ToLower();
                        if (dataType == "double")
                        {
                            value = IfChanged <double>(item.Source, isCustomField);
                        }
                        else if (dataType == "int" || dataType == "integer")
                        {
                            value = IfChanged <int>(item.Source, isCustomField);
                        }
                        else if (dataType == "datetime" || dataType == "date")
                        {
                            value = IfChanged <DateTime>(item.Source, isCustomField);
                        }
                        else
                        {
                            value = IfChanged <string>(item.Source, isCustomField);
                        }
                    }

                    // Check if not-for has been set, if so get all work item types except that one, else for has been set and get those
                    var currentWorkItemTypes = !string.IsNullOrWhiteSpace(item.NotFor) ? GetWorkItemTypes(item.NotFor.Split(',')) : item.For.Split(',').ToList();

                    foreach (var wit in currentWorkItemTypes)
                    {
                        try
                        {
                            if (wit == "All" || wit == "Common")
                            {
                                commonFields.Add(item.Target, value);
                            }
                            else
                            {
                                // If we haven't mapped the Type then we probably want to ignore the field
                                if (typeFields.TryGetValue(wit, out FieldMapping <JiraRevision> fm))
                                {
                                    fm.Add(item.Target, value);
                                }
                                else
                                {
                                    Logger.Log(LogLevel.Warning, $"No target type '{wit}' is set, field {item.Source} cannot be mapped.");
                                }
                            }
                        }

                        catch (Exception)
                        {
                            Logger.Log(LogLevel.Warning, $"Ignoring target mapping with key: '{item.Target}', because it is already configured.");
                            continue;
                        }
                    }
                }
            }

            // Now go through the list of built up type fields (which we will eventually get to
            // and then add them to the complete dictionary per type.
            var mappingPerWiType = new Dictionary <string, FieldMapping <JiraRevision> >();

            foreach (KeyValuePair <string, FieldMapping <JiraRevision> > item in typeFields)
            {
                mappingPerWiType.Add(item.Key, MergeMapping(commonFields, item.Value));
            }

            return(mappingPerWiType);
        }
        private Dictionary <string, FieldMapping <JiraRevision> > InitializeFieldMappings()
        {
            var commonFields      = new FieldMapping <JiraRevision>();
            var bugFields         = new FieldMapping <JiraRevision>();
            var taskFields        = new FieldMapping <JiraRevision>();
            var pbiFields         = new FieldMapping <JiraRevision>();
            var epicFields        = new FieldMapping <JiraRevision>();
            var featureFields     = new FieldMapping <JiraRevision>();
            var requirementFields = new FieldMapping <JiraRevision>();
            var userStoryFields   = new FieldMapping <JiraRevision>();

            foreach (var item in _config.FieldMap.Fields)
            {
                if (item.Source != null)
                {
                    var isCustomField = item.SourceType == "name";
                    Func <JiraRevision, (bool, object)> value;

                    if (item.Mapping?.Values != null)
                    {
                        value = r => MapValue(r, item.Source);
                    }
                    else if (!string.IsNullOrWhiteSpace(item.Mapper))
                    {
                        switch (item.Mapper)
                        {
                        case "MapTitle":
                            value = r => MapTitle(r);
                            break;

                        case "MapUser":
                            value = IfChanged <string>(item.Source, isCustomField, MapUser);
                            break;

                        case "MapSprint":
                            value = IfChanged <string>(item.Source, isCustomField, MapSprint);
                            break;

                        case "MapTags":
                            value = IfChanged <string>(item.Source, isCustomField, MapTags);
                            break;

                        case "MapRemainingWork":
                            value = IfChanged <string>(item.Source, isCustomField, MapRemainingWork);
                            break;

                        default:
                            value = IfChanged <string>(item.Source, isCustomField);
                            break;
                        }
                    }
                    else
                    {
                        var dataType = item.Type.ToLower();
                        if (dataType == "double")
                        {
                            value = IfChanged <double>(item.Source, isCustomField);
                        }
                        else if (dataType == "int" || dataType == "integer")
                        {
                            value = IfChanged <int>(item.Source, isCustomField);
                        }
                        else if (dataType == "datetime" || dataType == "date")
                        {
                            value = IfChanged <DateTime>(item.Source, isCustomField);
                        }
                        else
                        {
                            value = IfChanged <string>(item.Source, isCustomField);
                        }
                    }

                    // Check if not-for has been set, if so get all work item types except that one, else for has been set and get those
                    var currentWorkItemTypes = !string.IsNullOrWhiteSpace(item.NotFor) ? GetWorkItemTypes(item.NotFor.Split(',')) : item.For.Split(',').ToList();

                    foreach (var wit in currentWorkItemTypes)
                    {
                        if (wit == "All" || wit == "Common")
                        {
                            commonFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.Bug)
                        {
                            bugFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.Epic)
                        {
                            epicFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.Feature)
                        {
                            featureFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.ProductBacklogItem)
                        {
                            pbiFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.Requirement)
                        {
                            requirementFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.Task)
                        {
                            taskFields.Add(item.Target, value);
                        }
                        else if (wit == WorkItemType.UserStory)
                        {
                            userStoryFields.Add(item.Target, value);
                        }
                    }
                }
            }

            var mappingPerWiType = new Dictionary <string, FieldMapping <JiraRevision> >
            {
                { WorkItemType.Bug, MergeMapping(commonFields, bugFields) },
                { WorkItemType.ProductBacklogItem, MergeMapping(commonFields, pbiFields) },
                { WorkItemType.Task, MergeMapping(commonFields, taskFields) },
                { WorkItemType.Feature, MergeMapping(commonFields, featureFields) },
                { WorkItemType.Epic, MergeMapping(commonFields, epicFields) },
                { WorkItemType.Requirement, MergeMapping(commonFields, requirementFields) },
                { WorkItemType.UserStory, MergeMapping(commonFields, userStoryFields) }
            };

            return(mappingPerWiType);
        }