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