public ProjectMetricSnapshotModel ConvertToModel(ProjectMetricSnapshot dbModel)
        {
            ProjectMetricSnapshotModel snapshot = new ProjectMetricSnapshotModel
            {
                Id              = dbModel.Id,
                InsertionDate   = dbModel.InsertionDate,
                ProjectMetricId = dbModel.ProjectMetricId
            };

            snapshot.Values = dbModel.ProjectMetricColumnValue.Select(v =>
                                                                      new ProjectMetricColumnValueModel
            {
                Id                      = v.Id,
                Value                   = v.Value,
                MetricColumnId          = v.MetricColumnId,
                ProjectMetricSnapshotId = v.ProjectMetricSnapshotId
            }).ToList();

            return(snapshot);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// zpracuje XML pro number metriku
        /// </summary>
        /// <param name="projectMetric">projektova metrida</param>
        /// <param name="results">nactene elementy z XML</param>
        private void ParseXmlForNumberMetric(ProjectMetric projectMetric, XmlNodeList results)
        {
            ProjectMetricSnapshot snapshot = new ProjectMetricSnapshot
            {
                InsertionDate            = DateTime.Now,
                ProjectMetric            = projectMetric,
                ProjectMetricColumnValue = new List <ProjectMetricColumnValue>()
            };

            if (results.Count == 1) //je jen jeden sloupec -> to znamena, ze v nem suma a neni treba nic pocitat
            {
                if (projectMetric.Metric.MetricColumn.Count > 1)
                {
                    projectMetric.ProjectMetricLog.Add(new ProjectMetricLog($"Metric #{projectMetric.MetricId} has {projectMetric.Metric.MetricColumn.Count} columns, but in data XML was only one column!"));
                }

                MetricColumn column = projectMetric.Metric.MetricColumn.First();

                ProjectMetricColumnValue columnValue = new ProjectMetricColumnValue
                {
                    Value                 = 0,
                    MetricColumnId        = column.Id,
                    ProjectMetricSnapshot = snapshot
                };

                XmlNode value = SelectSingleNodeSpecial(results[0], column.NumberFieldName) ?? SelectSingleNodeSpecial(results[0], FIELD_ID) ?? SelectSingleNodeSpecial(results[0], column.FieldName);
                if (ParseNodeValue(value, out int numberValue))
                {
                    columnValue.Value = numberValue;
                }
                else
                {
                    projectMetric.ProjectMetricLog.Add(new ProjectMetricLog($"Column #{column.Id} of metric #{column.MetricId}, does not have proper tag with numeric value in data XML!"));
                }

                snapshot.ProjectMetricColumnValue.Add(columnValue);
            }
            else //vice sloupcu
            {
                foreach (var column in projectMetric.Metric.MetricColumn)
                {
                    ProjectMetricColumnValue columnValue = new ProjectMetricColumnValue
                    {
                        Value                 = 0,
                        MetricColumnId        = column.Id,
                        ProjectMetricSnapshot = snapshot
                    };

                    string[] values = column.Value.Split(';').Select(v => v.Trim().ToLower()).ToArray();
                    foreach (XmlNode result in results) //hledam hodnoty a jejich pocty, pripadne jen pricitam
                    {
                        XmlNode name = SelectSingleNodeSpecial(result, column.FieldName) ?? SelectSingleNodeSpecial(result, FIELD_VALUE);
                        if (name != null && (values.Contains(name.InnerText.ToLower()) || (values[0] == ANY_VALUE && name.InnerText != string.Empty)))
                        {
                            XmlNode value = SelectSingleNodeSpecial(result, column.NumberFieldName) ?? SelectSingleNodeSpecial(result, FIELD_COUNT);
                            if (ParseNodeValue(value, out int numberValue))
                            {
                                columnValue.Value += numberValue;
                            }
                            else
                            {
                                columnValue.Value++;
                            }
                        }
                    }

                    snapshot.ProjectMetricColumnValue.Add(columnValue);
                }
            }

            projectMetric.ProjectMetricSnapshot.Add(snapshot);

            projectMetric.ProjectMetricLog.Add(new ProjectMetricLog($"Snapshot of project metric #{projectMetric.Id} was successfully created!", false));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// zpracuje XML pro coverage metriku
        /// </summary>
        /// <param name="projectMetric">projektova metrida</param>
        /// <param name="results">nactene elementy z XML</param>
        private void ParseXmlForCoverageMetric(ProjectMetric projectMetric, XmlNodeList results)
        {
            ProjectMetricSnapshot snapshot = new ProjectMetricSnapshot
            {
                InsertionDate            = DateTime.Now,
                ProjectMetric            = projectMetric,
                ProjectMetricColumnValue = new List <ProjectMetricColumnValue>()
            };

            //nekde se totiz opakuji pozadavky, pokud maji treba vice testu (napr M78), mne staci jen vedet, ze aspon jeden ma
            //takze nadbytecne nevyberu, jinak totiz zkresluje vysledek metriky
            if (results.Item(0).SelectSingleNode($"//ns:{FIELD_ID}", _namespaces) != null)
            {
                //vybiram podle referenceID, ktere ma kazdy pozadavek jedinecne
                results = _document.SelectNodes($"/ns:results/ns:result[ns:NAME{Suffix}='{projectMetric.Metric.RequirementGroup}' and ns:{FIELD_ID}[not=(.=../following-sibling::ns:result/ns:{FIELD_ID})]]", _namespaces);
            }

            foreach (var column in projectMetric.Metric.MetricColumn)
            {
                ProjectMetricColumnValue columnValue = new ProjectMetricColumnValue
                {
                    Value                 = 0,
                    MetricColumnId        = column.Id,
                    ProjectMetricSnapshot = snapshot
                };

                int count = 0, accepted = 0;
                if (results.Count > 1 && results.Item(0).SelectSingleNode($"//ns:{FIELD_COUNT}", _namespaces) == null) //pokud se nenachazi node se sumou prvku
                {
                    if (column.DivisorValue != ALL_VALUES && !string.IsNullOrEmpty(column.DivisorFieldName))           //mam specifikovane jen nektere pro delitele
                    {
                        count = _document.SelectNodes($"/ns:results/ns:result[ns:{column.DivisorFieldName}='{column.DivisorValue}']", _namespaces).Count;
                    }
                    else //vsechny nody pro delitele
                    {
                        count = results.Count;
                    }
                }
                else //existuje node s poctem prvku, tak musim secist jednotlive hodnoty
                {
                    XmlNodeList groupResults = results;
                    if (column.DivisorValue != ALL_VALUES && !string.IsNullOrEmpty(column.DivisorFieldName))
                    {
                        groupResults = _document.SelectNodes($"/ns:results/ns:result[ns:{column.DivisorFieldName}='{column.DivisorValue}']", _namespaces);  //mam specifikovane jen nektere pro delitele
                    }

                    foreach (XmlNode result in groupResults) //scitam pocty
                    {
                        XmlNode value = SelectSingleNodeSpecial(result, FIELD_COUNT);
                        if (ParseNodeValue(value, out int numberValue))
                        {
                            count += numberValue;
                        }
                        else //pro pripad, ze tam neni cislo
                        {
                            count++;
                        }
                    }
                }


                if (results.Item(0).SelectSingleNode("//ns:REFERENCE_ID1", _namespaces) != null && results.Item(0).SelectSingleNode("//ns:NAME2", _namespaces) != null)
                { //metriky, kde jen hledam, zda maji vyplneny nektery pozadovany atribut
                    foreach (XmlNode result in results)
                    {
                        XmlNode reference = SelectSingleNodeSpecial(result, column.FieldName) ?? SelectSingleNodeSpecial(result, "REFERENCE_ID1")
                                            ?? SelectSingleNodeSpecial(result, "NAME2") ?? SelectSingleNodeSpecial(result, "NAME3");
                        if (reference != null && !string.IsNullOrEmpty(reference.InnerText))
                        {
                            accepted++;
                        }
                    }
                }
                else if (results.Item(0).SelectSingleNode($"//ns:{column.FieldName}", _namespaces) != null || results.Item(0).SelectSingleNode($"//ns:{FIELD_VALUE}", _namespaces) != null) //M03, M06, M60
                {                                                                                                                                                                           //metriky, kde hledam, jestli ma vyplnenou danou hodnotu
                    string[] values = column.Value.Split(';').Select(v => v.Trim().ToLower()).ToArray();
                    foreach (XmlNode result in results)
                    {
                        XmlNode name = SelectSingleNodeSpecial(result, column.FieldName) ?? SelectSingleNodeSpecial(result, FIELD_VALUE);
                        if (name != null && (values.Contains(name.InnerText.ToLower()) || values[0] == ANY_VALUE))
                        {
                            XmlNode value = SelectSingleNodeSpecial(result, FIELD_COUNT);
                            if (ParseNodeValue(value, out int numberValue)) //znovu, pokud je suma, pricitam sumu, jinak jen jeden
                            {
                                accepted += numberValue;
                            }
                            else
                            {
                                accepted++;
                            }
                        }
                    }
                }
                else
                {
                    projectMetric.ProjectMetricLog.Add(new ProjectMetricLog($"Metric #{projectMetric.MetricId} coverage column '{column.Value}' is unknown type!"));
                }

                columnValue.Value = (accepted / (decimal)count) * 100; //v %

                snapshot.ProjectMetricColumnValue.Add(columnValue);
            }

            projectMetric.ProjectMetricSnapshot.Add(snapshot);

            projectMetric.ProjectMetricLog.Add(new ProjectMetricLog($"Snapshot of project metric #{projectMetric.Id} was successfully created!", false));
        }