in src/PortingAssistant.Client.NuGet/PortingAssistantRecommendationHandler.cs [96:167]
private async void ProcessCompatibility(IEnumerable<string> namespaces,
Dictionary<string, List<string>> foundPackages,
Dictionary<string, TaskCompletionSource<RecommendationDetails>> recommendationTaskCompletionSources)
{
var namespacesFound = new HashSet<string>();
var namespacesWithErrors = new HashSet<string>();
try
{
foreach (var url in foundPackages)
{
try
{
_logger.LogInformation("Downloading {0} from {1}", url.Key, CompatibilityCheckerType);
using var stream = await _httpService.DownloadGitHubFileAsync("recommendation/" + url.Key);
using var streamReader = new StreamReader(stream);
var packageFromGithub = JsonConvert.DeserializeObject<RecommendationDetails>(streamReader.ReadToEnd());
foreach (var @namespace in url.Value)
{
if (recommendationTaskCompletionSources.TryGetValue(@namespace, out var taskCompletionSource))
{
taskCompletionSource.SetResult(packageFromGithub);
namespacesFound.Add(@namespace);
}
}
}
catch (Exception ex)
{
_logger.LogError("Failed when downloading recommendation and parsing {0} from {1}, {2}", url.Key, CompatibilityCheckerType, ex);
foreach (var @namespace in url.Value)
{
if (recommendationTaskCompletionSources.TryGetValue(@namespace, out var taskCompletionSource))
{
taskCompletionSource.SetException(new PortingAssistantClientException(ExceptionMessage.NamespaceFailedToProcess(@namespace), ex));
namespacesWithErrors.Add(@namespace);
}
}
}
}
foreach (var @namespace in namespaces)
{
if (namespacesFound.Contains(@namespace) || namespacesWithErrors.Contains(@namespace))
{
continue;
}
if (recommendationTaskCompletionSources.TryGetValue(@namespace, out var taskCompletionSource))
{
var errorMessage = $"Could not find {@namespace} recommendation in external source; discarding this namespace.";
_logger.LogInformation(errorMessage);
var innerException = new NamespaceNotFoundException(errorMessage);
taskCompletionSource.TrySetException(new PortingAssistantClientException(ExceptionMessage.NamespaceNotFound(@namespace), innerException));
}
}
}
catch (Exception ex)
{
foreach (var @namespace in namespaces)
{
if (recommendationTaskCompletionSources.TryGetValue(@namespace, out var taskCompletionSource))
{
taskCompletionSource.TrySetException(
new PortingAssistantClientException(ExceptionMessage.NamespaceFailedToProcess(@namespace), ex));
}
}
_logger.LogError("Error encountered while processing recommendations: {0}", ex);
}
}