public ICollection GetAllDependantPackages()

in JetBrains.SbomUtils/src/JetBrains.SbomUtils/SbomOperations.cs [33:94]


    public ICollection<Package> GetAllDependantPackages(SbomModel sbomModel, IEnumerable<Package> rootPackages)
    {
      Dictionary<string, Package> seenPackages = new Dictionary<string, Package>();
      Queue<Package> queue = new Queue<Package>();

      foreach (var rootPackage in rootPackages)
      {
        seenPackages.Add(rootPackage.SPDXID, rootPackage);
        queue.Enqueue(rootPackage);
      }

      while (queue.Count > 0)
      {
        var package = queue.Dequeue();

        if (sbomModel.RelationshipsBySourceElement.TryGetValue(package.SPDXID, out var rootToLeavesRelationships))
        {
          foreach (var relationship in rootToLeavesRelationships)
          {
            if (SbomRelationshipTypes.RootToLeavesRelationshipTypes.Contains(relationship.RelationshipType))
            {
              if (sbomModel.Packages.TryGetValue(relationship.RelatedSpdxElement, out var relatedPackage) && !seenPackages.ContainsKey(relationship.RelatedSpdxElement))
              {
                seenPackages.Add(relatedPackage.SPDXID, relatedPackage);
                queue.Enqueue(relatedPackage);
              }
            }
            else if (!SbomRelationshipTypes.LeavesToRootRelationshipTypes.Contains(relationship.RelationshipType))
            {
              _logger.LogWarning("Relationship type {relationshipType} (between package {element} and package {relatedElement}) is not supported",
                relationship.RelationshipType,
                relationship.SpdxElementId,
                relationship.RelatedSpdxElement);
            }
          }
        }

        if (sbomModel.RelationshipsByDestinationElement.TryGetValue(package.SPDXID, out var leavesToRootRelationships))
        {
          foreach (var relationship in leavesToRootRelationships)
          {
            if (SbomRelationshipTypes.LeavesToRootRelationshipTypes.Contains(relationship.RelationshipType))
            {
              if (sbomModel.Packages.TryGetValue(relationship.SpdxElementId, out var relatedPackage) && !seenPackages.ContainsKey(relationship.SpdxElementId))
              {
                seenPackages.Add(relatedPackage.SPDXID, relatedPackage);
                queue.Enqueue(relatedPackage);
              }
            }
            else if (!SbomRelationshipTypes.RootToLeavesRelationshipTypes.Contains(relationship.RelationshipType))
            {
              _logger.LogWarning("Relationship type {relationshipType} (between package {element} and package {relatedElement}) is not supported",
                relationship.RelationshipType,
                relationship.SpdxElementId,
                relationship.RelatedSpdxElement);
            }
          }
        }
      }

      return seenPackages.Values;
    }