internal /*for testing purposes*/ void DownloadQualityProfile(IProgressController controller, CancellationToken cancellationToken, IProgressStepExecutionEvents notificationEvents, IEnumerable<Language> languages)
{
Debug.Assert(controller != null);
Debug.Assert(notificationEvents != null);
bool failed = false;
var rulesets = new Dictionary<Language, RuleSet>();
var languageList = languages as IList<Language> ?? languages.ToList();
DeterminateStepProgressNotifier notifier = new DeterminateStepProgressNotifier(notificationEvents, languageList.Count);
notifier.NotifyCurrentProgress(Strings.DownloadingQualityProfileProgressMessage);
foreach (var language in languageList)
{
QualityProfile qualityProfileInfo;
if (!host.SonarQubeService.TryGetQualityProfile(this.connectionInformation, this.project, language, cancellationToken, out qualityProfileInfo))
{
failed = true;
InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true);
break;
}
this.QualityProfiles[language] = qualityProfileInfo;
RoslynExportProfile export;
if (!this.host.SonarQubeService.TryGetExportProfile(this.connectionInformation, qualityProfileInfo, language, cancellationToken, out export))
{
failed = true;
InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true);
break;
}
this.NuGetPackages.Add(language, export.Deployment.NuGetPackages);
var tempRuleSetFilePath = Path.GetTempFileName();
File.WriteAllText(tempRuleSetFilePath, export.Configuration.RuleSet.OuterXml);
RuleSet ruleSet = RuleSet.LoadFromFile(tempRuleSetFilePath);
// Remove/Move/Refactor code when XML ruleset file is no longer downloaded but the proper API is used to retrieve rules
UpdateDownloadedSonarQubeQualityProfile(ruleSet, qualityProfileInfo);
rulesets[language] = ruleSet;
notifier.NotifyIncrementedProgress(string.Empty);
if (rulesets[language] == null)
{
failed = true;
InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, true);
break;
}
InformAboutQualityProfileToDownload(qualityProfileInfo.Name, qualityProfileInfo.Key, language.Name, false);
}
if (failed)
{
this.AbortWorkflow(controller, cancellationToken);
}
else
{
// Set the rule set which should be available for the following steps
foreach (var keyValue in rulesets)
{
this.Rulesets[keyValue.Key] = keyValue.Value;
}
}
}