public async Task <HealthMetrics> CheckHealth(PackageURL purl) { // Use reflection to find the correct package management class var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes() .Where(type => type.IsSubclassOf(typeof(BaseProjectManager))) .Where(type => type.Name.Equals($"{purl.Type}ProjectManager", StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(); if (projectManagerClass != default) { var ctor = projectManagerClass.GetConstructor(Array.Empty <Type>()); var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>())); var content = await projectManager.GetMetadata(purl); if (!string.IsNullOrWhiteSpace(content)) { foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content)) { try { var healthAlgorithm = new GitHubHealthAlgorithm(githubPurl); var health = await healthAlgorithm.GetHealth(); return(health); } catch (Exception ex) { Logger.Warn(ex, "Unable to calculate health for {0}: {1}", githubPurl, ex.Message); } } } else { Logger.Warn("No metadata found for {0}", purl.ToString()); } } else { throw new ArgumentException("Invalid Package URL type: {0}", purl.Type); } return(default);
public async Task <HealthMetrics?> CheckHealth(PackageURL purl) { BaseProjectManager?packageManager = ProjectManagerFactory.CreateProjectManager(purl); if (packageManager != null) { string?content = await packageManager.GetMetadataAsync(purl); if (!string.IsNullOrWhiteSpace(content)) { RepoSearch repoSearcher = new RepoSearch(ProjectManagerFactory); foreach ((PackageURL githubPurl, double _) in await repoSearcher.ResolvePackageLibraryAsync(purl)) { try { GitHubHealthAlgorithm?healthAlgorithm = new GitHubHealthAlgorithm(githubPurl); HealthMetrics? health = await healthAlgorithm.GetHealth(); return(health); } catch (Exception ex) { Logger.Warn(ex, "Unable to calculate health for {0}: {1}", githubPurl, ex.Message); } } } else { Logger.Warn("No metadata found for {0}", purl.ToString()); } } else { throw new ArgumentException($"Invalid Package URL type: {purl.Type}"); } return(null); }