diff --git a/src/ArtifactoryUploader/ArtifactoryUploader.cs b/src/ArtifactoryUploader/ArtifactoryUploader.cs index 7ff1acdc..047d41fc 100644 --- a/src/ArtifactoryUploader/ArtifactoryUploader.cs +++ b/src/ArtifactoryUploader/ArtifactoryUploader.cs @@ -95,7 +95,7 @@ async Task TryGetPackageInfo(ComponentsToArtifactory component) // Handle DEBIAN package name mismatch - if (component.ComponentType == "DEBIAN" && packageInfo?.Name != component.JfrogPackageName) + if (component.ComponentType == "DEBIAN" && packageInfo != null && packageInfo.Name != component.JfrogPackageName) { component.CopyPackageApiUrl = component.CopyPackageApiUrl.Replace(component.JfrogPackageName, packageInfo.Name); } @@ -112,7 +112,7 @@ async Task TryGetPackageInfo(ComponentsToArtifactory component) if (packageInfo != null) { - component.CopyPackageApiUrl = component.CopyPackageApiUrl.ToLower(); + component.CopyPackageApiUrl = component.CopyPackageApiUrl.Replace(component.JfrogPackageName, packageInfo.Name); } } diff --git a/src/ArtifactoryUploader/JfrogRepoUpdater.cs b/src/ArtifactoryUploader/JfrogRepoUpdater.cs index 95d749ad..4e6ffab7 100644 --- a/src/ArtifactoryUploader/JfrogRepoUpdater.cs +++ b/src/ArtifactoryUploader/JfrogRepoUpdater.cs @@ -16,7 +16,7 @@ namespace LCT.ArtifactoryUploader { - public class JfrogRepoUpdater + public static class JfrogRepoUpdater { static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public static IJFrogService jFrogService { get; set; } @@ -28,7 +28,7 @@ public static async Task UpdateJfrogRepoPathForSucessfullyUploadedItems(Bom List uploadedPackages = PackageUploadInformation.GetUploadePackageDetails(displayPackagesInfo); // Get the details of all the dest repo names from jfrog at once - List destRepoNames = uploadedPackages.Select(x => x.DestRepoName)?.Distinct()?.ToList() ?? new List(); + List destRepoNames = uploadedPackages.Select(x => x.DestRepoName).Distinct().ToList(); List jfrogPackagesListAql = await GetJfrogRepoInfoForAllTypePackages(destRepoNames); // Update the repo path diff --git a/src/LCT.PackageIdentifier/ConanProcessor.cs b/src/LCT.PackageIdentifier/ConanProcessor.cs index bbfb9883..3a763db0 100644 --- a/src/LCT.PackageIdentifier/ConanProcessor.cs +++ b/src/LCT.PackageIdentifier/ConanProcessor.cs @@ -385,73 +385,93 @@ private static void GetDependecyDetails(List componentsForBOM, List lstComponentForBOM, ref int noOfDevDependent, List nodePackages) { var rootNode = nodePackages.FirstOrDefault(); - if (rootNode != null && (!rootNode.Dependencies.Any() || rootNode.Dependencies == null)) + ValidateRootNode(rootNode, nodePackages); + + var directDependencies = GetDirectDependencies(nodePackages); + + foreach (var component in nodePackages.Skip(1)) + { + ProcessComponent(component, directDependencies, ref lstComponentForBOM, ref noOfDevDependent, nodePackages); + } + } + + private static void ValidateRootNode(ConanPackage rootNode, List nodePackages) + { + if (rootNode == null || !rootNode.Dependencies.Any()) { throw new ArgumentNullException(nameof(nodePackages), "Dependency(requires) node name details not present in the root node."); } + } - ConanPackage package = nodePackages.Where(x => x.Id == "0").FirstOrDefault(); - List directDependencies = new List(); - if (package.Dependencies != null) { directDependencies.AddRange(package.Dependencies); } - if (package.DevDependencies != null) { directDependencies.AddRange(package.DevDependencies); } + private static List GetDirectDependencies(List nodePackages) + { + var package = nodePackages.FirstOrDefault(x => x.Id == "0"); + var directDependencies = new List(); - // Ignoring the root node as it is the package information node and we are anyways considering all - // nodes in the lock file. - foreach (var component in nodePackages.Skip(1)) + if (package != null) { - BomCreator.bomKpiData.ComponentsinPackageLockJsonFile += 1; - Property isdev = new() { Name = Dataconstant.Cdx_IsDevelopment, Value = "false" }; - - if (string.IsNullOrEmpty(component.Reference)) + if (package.Dependencies != null) { - BomCreator.bomKpiData.ComponentsinPackageLockJsonFile--; - continue; + directDependencies.AddRange(package.Dependencies); } - - Component components = new Component(); - - // dev components are not ignored and added as a part of SBOM - var buildNodeIds = GetBuildNodeIds(nodePackages); - if (IsDevDependency(component, buildNodeIds, ref noOfDevDependent)) + if (package.DevDependencies != null) { - isdev.Value = "true"; + directDependencies.AddRange(package.DevDependencies); } + } - string packageName = Convert.ToString(component.Reference); + return directDependencies; + } - if (packageName.Contains('/')) - { - components.Name = packageName.Split(new char[] { '/', '@' })[0]; - components.Version = packageName.Split(new char[] { '/', '@' })[1]; - } - else - { - components.Name = packageName; - } + private static void ProcessComponent(ConanPackage component, List directDependencies, ref List lstComponentForBOM, ref int noOfDevDependent, List nodePackages) + { + BomCreator.bomKpiData.ComponentsinPackageLockJsonFile += 1; + var isdev = new Property { Name = Dataconstant.Cdx_IsDevelopment, Value = "false" }; - Property siemensFileName = new Property() - { - Name = Dataconstant.Cdx_Siemensfilename, - Value = component.Reference - }; - var isDirect = directDependencies.Contains(component.Id) ? "true" : "false"; - Property siemensDirect = new Property() - { - Name = Dataconstant.Cdx_SiemensDirect, - Value = isDirect - }; - - components.Type = Component.Classification.Library; - components.Purl = $"{ApiConstant.ConanExternalID}{components.Name}@{components.Version}"; - components.BomRef = $"{ApiConstant.ConanExternalID}{components.Name}@{components.Version}"; - components.Properties = new List(); - components.Properties.Add(isdev); - components.Properties.Add(siemensDirect); - components.Properties.Add(siemensFileName); - lstComponentForBOM.Add(components); + if (string.IsNullOrEmpty(component.Reference)) + { + BomCreator.bomKpiData.ComponentsinPackageLockJsonFile--; + return; } + + var components = CreateComponent(component, directDependencies, ref noOfDevDependent, nodePackages, isdev); + lstComponentForBOM.Add(components); } + private static Component CreateComponent(ConanPackage component, List directDependencies, ref int noOfDevDependent, List nodePackages, Property isdev) + { + var buildNodeIds = GetBuildNodeIds(nodePackages); + if (IsDevDependency(component, buildNodeIds, ref noOfDevDependent)) + { + isdev.Value = "true"; + } + + var components = new Component(); + string packageName = Convert.ToString(component.Reference); + if (packageName.Contains('/')) + { + var parts = packageName.Split(new char[] { '/', '@' }); + components.Name = parts[0]; + components.Version = parts[1]; + } + else + { + components.Name = packageName; + } + + components.Properties = new List + { + isdev, + new Property { Name = Dataconstant.Cdx_Siemensfilename, Value = component.Reference }, + new Property { Name = Dataconstant.Cdx_SiemensDirect, Value = directDependencies.Contains(component.Id) ? "true" : "false" } + }; + + components.Type = Component.Classification.Library; + components.Purl = $"{ApiConstant.ConanExternalID}{components.Name}@{components.Version}"; + components.BomRef = $"{ApiConstant.ConanExternalID}{components.Name}@{components.Version}"; + + return components; + } private static List GetBuildNodeIds(List nodePackages) { return nodePackages diff --git a/src/LCT.PackageIdentifier/MavenProcessor.cs b/src/LCT.PackageIdentifier/MavenProcessor.cs index 1ae36d85..4c2e6f2c 100644 --- a/src/LCT.PackageIdentifier/MavenProcessor.cs +++ b/src/LCT.PackageIdentifier/MavenProcessor.cs @@ -222,7 +222,7 @@ public async Task> GetJfrogRepoDetailsOfAComponent(List aqlResul aqlResult = aqlResults.FirstOrDefault(x => x.Repo.Equals(repoName)); jfrogRepoPath = GetJfrogRepoPath(aqlResult); } - aqlResult.Repo ??= repoName; + if (aqlResult != null) + { + aqlResult.Repo = aqlResult.Repo ?? repoName; + } + return aqlResult; } diff --git a/src/LCT.PackageIdentifier/NpmProcessor.cs b/src/LCT.PackageIdentifier/NpmProcessor.cs index 0d610c6f..052036d0 100644 --- a/src/LCT.PackageIdentifier/NpmProcessor.cs +++ b/src/LCT.PackageIdentifier/NpmProcessor.cs @@ -689,7 +689,7 @@ public AqlResult GetJfrogArtifactoryRepoDetials(List aqlResultList, // Forming Jfrog repo Path if (!repoName.Equals(NotFoundInRepo, StringComparison.OrdinalIgnoreCase)) { - aqlResult = aqlResults.FirstOrDefault(x => x.Repo.Equals(repoName)); + aqlResult = aqlResults.FirstOrDefault(x => x.Repo.Equals(repoName)) ?? new AqlResult(); jfrogRepoPath = GetJfrogRepoPath(aqlResult); } diff --git a/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs b/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs index bad539e8..d5d89d80 100644 --- a/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs +++ b/src/LCT.PackageIdentifier/NugetDevDependencyParser.cs @@ -184,7 +184,7 @@ private static void GetDirectDependencies(string filePath) var readValue = File.ReadAllText(filePath); JObject serializedContent = JObject.Parse(readValue); JToken projectFramworks = serializedContent["project"]["frameworks"]; - if (projectFramworks == null && !projectFramworks.HasValues) + if (projectFramworks == null || !projectFramworks.HasValues) { return; } @@ -203,7 +203,7 @@ private static void GetDirectDependencies(string filePath) if (projectDependencies.HasValues) { - directDepCollection = projectDependencies.Children().OfType()?.ToList() ?? new List(); + directDepCollection = projectDependencies.Children().OfType().ToList(); } foreach (var child in directDepCollection) { diff --git a/src/LCT.PackageIdentifier/NugetProcessor.cs b/src/LCT.PackageIdentifier/NugetProcessor.cs index e554e996..836ac57f 100644 --- a/src/LCT.PackageIdentifier/NugetProcessor.cs +++ b/src/LCT.PackageIdentifier/NugetProcessor.cs @@ -335,7 +335,7 @@ public AqlResult GetJfrogArtifactoryRepoDetials(List aqlResultList, // Forming Jfrog repo Path if (!repoName.Equals(NotFoundInRepo, StringComparison.OrdinalIgnoreCase)) { - aqlResult = aqlResults.FirstOrDefault(x => x.Repo.Equals(repoName)); + aqlResult = aqlResults.FirstOrDefault(x => x.Repo.Equals(repoName)) ?? new AqlResult(); jfrogRepoPath = GetJfrogRepoPath(aqlResult); } aqlResult.Repo ??= repoName; diff --git a/src/LCT.SW360PackageCreator/CreatorValidator.cs b/src/LCT.SW360PackageCreator/CreatorValidator.cs index fa2614b3..9151ab7c 100644 --- a/src/LCT.SW360PackageCreator/CreatorValidator.cs +++ b/src/LCT.SW360PackageCreator/CreatorValidator.cs @@ -85,7 +85,7 @@ public static async Task TriggerFossologyValidation(CommonAppSettings appSetting else { int currentPage = page; - int totalPages = (int)(releaseResponse?.Page?.TotalPages); + int totalPages = releaseResponse?.Page?.TotalPages ?? 0; if (currentPage < totalPages - 1) { page = currentPage + 1;