Class SpdxComparer


  • public class SpdxComparer
    extends Object
    Performs a comparison between two or more SPDX documents and holds the results of the comparison The main function to perform the comparison is compare(spdxdoc1, spdxdoc2) For files, the comparison results are separated into unique files based on the file names which can be obtained by the method getUniqueFiles(index1, index2). If two documents contain files with the same name, but different data, the differences for these files can be obtained through the method getFileDifferences(index1, index2) Multi-threading considerations: This class is "mostly" threadsafe in that the calls to perform the comparison are synchronized and a flag is used to throw an error for any calls to getters when a compare is in progress. There is a small theoretical window in the getters where the compare operation is started in the middle of a get operation.
    Author:
    Gary O'Neall
    • Constructor Detail

      • SpdxComparer

        public SpdxComparer()
    • Method Detail

      • compare

        public void compare​(org.spdx.library.model.v2.SpdxDocument spdxDoc1,
                            org.spdx.library.model.v2.SpdxDocument spdxDoc2)
                     throws org.spdx.core.InvalidSPDXAnalysisException,
                            SpdxCompareException
        Compares 2 SPDX documents
        Parameters:
        spdxDoc1 -
        spdxDoc2 -
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
        SpdxCompareException
      • compare

        public void compare​(List<org.spdx.library.model.v2.SpdxDocument> spdxDocuments)
                     throws org.spdx.core.InvalidSPDXAnalysisException,
                            SpdxCompareException
        Compares multiple SPDX documents
        Parameters:
        spdxDocuments -
        Throws:
        SpdxCompareException
        org.spdx.core.InvalidSPDXAnalysisException
      • collectAllPackages

        protected List<org.spdx.library.model.v2.SpdxPackage> collectAllPackages​(org.spdx.library.model.v2.SpdxDocument spdxDocument)
                                                                          throws org.spdx.core.InvalidSPDXAnalysisException
        Collect all of the packages present in the SPDX document including packages embedded in other relationships within documents
        Parameters:
        spdxDocument -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • collectAllFiles

        public List<org.spdx.library.model.v2.SpdxFile> collectAllFiles​(org.spdx.library.model.v2.SpdxDocument spdxDocument)
                                                                 throws org.spdx.core.InvalidSPDXAnalysisException
        Collect all of the files present in the SPDX document including files within documents and files embedded in packages
        Parameters:
        spdxDocument -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • compareLicense

        public boolean compareLicense​(int doc1,
                                      org.spdx.library.model.v2.license.AnyLicenseInfo license1,
                                      int doc2,
                                      org.spdx.library.model.v2.license.AnyLicenseInfo license2)
                               throws SpdxCompareException
        Compares two licenses from two different SPDX documents taking into account the extracted license infos who's ID's may be different between the two documents Note: The ExtracedLicenseIDMap must be initialized before this method is invoked
        Parameters:
        doc1 - Index of the SPDX document for license1
        license1 -
        doc2 - Index of the SPDX document for license2
        license2 -
        Returns:
        true if the licenses are equivalent
        Throws:
        SpdxCompareException
      • stringCollectionsEqual

        public static boolean stringCollectionsEqual​(Collection<String> stringsA,
                                                     Collection<String> stringsB)
        Compares 2 collections and returns true if the contents are equal ignoring order and trimming strings. Nulls are also considered as equal to other nulls.
        Parameters:
        stringsA -
        stringsB -
        Returns:
      • objectsEqual

        public static boolean objectsEqual​(Object o1,
                                           Object o2)
        returns true if the two objects are equal considering nulls
        Parameters:
        o1 -
        o2 -
        Returns:
      • elementsEquivalent

        public static boolean elementsEquivalent​(Optional<? extends org.spdx.library.model.v2.ModelObjectV2> elementA,
                                                 Optional<? extends org.spdx.library.model.v2.ModelObjectV2> elementB)
                                          throws org.spdx.core.InvalidSPDXAnalysisException
        Parameters:
        elementA -
        elementB -
        Returns:
        true of the elements are present and equivalent
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • collectionsEquivalent

        public static boolean collectionsEquivalent​(Collection<? extends org.spdx.library.model.v2.ModelObjectV2> collectionA,
                                                    Collection<? extends org.spdx.library.model.v2.ModelObjectV2> collectionB)
                                             throws org.spdx.core.InvalidSPDXAnalysisException
        Parameters:
        collectionA -
        collectionB -
        Returns:
        true if the collections all contain equivalent items
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • listsEquals

        public static boolean listsEquals​(List<? extends Object> a1,
                                          List<? extends Object> a2)
        Compare two object lists
        Parameters:
        a1 -
        a2 -
        Returns:
      • collectionsEquals

        public static boolean collectionsEquals​(Collection<? extends Object> a1,
                                                Collection<? extends Object> a2)
        Compare two object lists
        Parameters:
        a1 -
        a2 -
        Returns:
      • stringsEqual

        public static boolean stringsEqual​(String stringA,
                                           String stringB)
        Compares two strings returning true if they are equal considering null values and trimming the strings. and normalizing linefeeds. Empty strings are treated as the same as null values.
        Parameters:
        stringA -
        stringB -
        Returns:
      • stringsEqual

        public static boolean stringsEqual​(Optional<String> stringA,
                                           Optional<String> stringB)
        Compares two strings returning true if they are equal considering null values and trimming the strings. and normalizing linefeeds. Empty strings are treated as the same as null values.
        Parameters:
        stringA -
        stringB -
        Returns:
      • compareStrings

        public static int compareStrings​(String stringA,
                                         String stringB)
        Compares two strings including trimming the string and taking into account they may be null. Null is considered a smaller value
        Parameters:
        stringA -
        stringB -
        Returns:
      • compareStrings

        public static int compareStrings​(Optional<String> stringA,
                                         Optional<String> stringB)
        Compares two strings including trimming the string and taking into account they may be null. Null is considered a smaller value
        Parameters:
        stringA -
        stringB -
        Returns:
      • isDifferenceFound

        public boolean isDifferenceFound()
        Returns:
      • getSpdxDoc

        public org.spdx.library.model.v2.SpdxDocument getSpdxDoc​(int docIndex)
                                                          throws SpdxCompareException
        Parameters:
        docIndex - Reference to which document number - 0 is the first document parameter in compare
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueExtractedLicenses

        public List<org.spdx.library.model.v2.license.ExtractedLicenseInfo> getUniqueExtractedLicenses​(int docIndexA,
                                                                                                       int docIndexB)
                                                                                                throws SpdxCompareException
        Retrieves any unique extracted licenses fromt the first SPDX document index relative to the second - unique is determined by the license text matching
        Parameters:
        docIndexA -
        docIndexB -
        Returns:
        Throws:
        SpdxCompareException
      • getExtractedLicenseDifferences

        public List<SpdxLicenseDifference> getExtractedLicenseDifferences​(int docIndexA,
                                                                          int docIndexB)
                                                                   throws SpdxCompareException
        Retrieves any licenses which where the text matches in both documents but other fields are different
        Parameters:
        docIndexA -
        docIndexB -
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueCreators

        public List<String> getUniqueCreators​(int doc1index,
                                              int doc2index)
                                       throws SpdxCompareException
        Returns any creators which are in the SPDX document 1 which are not in document 2
        Parameters:
        doc1index -
        doc2index -
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueFiles

        public List<org.spdx.library.model.v2.SpdxFile> getUniqueFiles​(int docindex1,
                                                                       int docindex2)
                                                                throws SpdxCompareException
        Return any files which are in spdx document index 1 but not in spdx document index 2
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getFileDifferences

        public List<SpdxFileDifference> getFileDifferences​(int docindex1,
                                                           int docindex2)
                                                    throws SpdxCompareException
        Returns any file differences found between the first and second SPDX documents as specified by the document index
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getUniquePackages

        public List<org.spdx.library.model.v2.SpdxPackage> getUniquePackages​(int docindex1,
                                                                             int docindex2)
                                                                      throws SpdxCompareException
        Return any files which are in spdx document index 1 but not in spdx document index 2
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueExternalDocumentRefs

        public List<org.spdx.library.model.v2.ExternalDocumentRef> getUniqueExternalDocumentRefs​(int docindex1,
                                                                                                 int docindex2)
                                                                                          throws SpdxCompareException
        Return any external document references which are in spdx document index 1 but not in spdx document index 2
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueDocumentAnnotations

        public List<org.spdx.library.model.v2.Annotation> getUniqueDocumentAnnotations​(int docindex1,
                                                                                       int docindex2)
                                                                                throws SpdxCompareException
        Return any document annotations which are in spdx document index 1 but not in spdx document index 2
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getUniqueDocumentRelationship

        public List<org.spdx.library.model.v2.Relationship> getUniqueDocumentRelationship​(int docindex1,
                                                                                          int docindex2)
                                                                                   throws SpdxCompareException
        Return any document annotations which are in spdx document index 1 but not in spdx document index 2
        Parameters:
        docindex1 -
        docindex2 -
        Returns:
        Throws:
        SpdxCompareException
      • getPackageComparers

        public SpdxPackageComparer[] getPackageComparers()
        Returns:
        all package comparers
      • getNumSpdxDocs

        public int getNumSpdxDocs()
        Returns:
      • findUniqueChecksums

        public static List<org.spdx.library.model.v2.Checksum> findUniqueChecksums​(Collection<org.spdx.library.model.v2.Checksum> checksumsA,
                                                                                   Collection<org.spdx.library.model.v2.Checksum> checksumsB)
                                                                            throws org.spdx.core.InvalidSPDXAnalysisException
        Find any SPDX checksums which are in elementsA but not in elementsB
        Parameters:
        checksumsA -
        checksumsB -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • findUniqueAnnotations

        public static List<org.spdx.library.model.v2.Annotation> findUniqueAnnotations​(Collection<org.spdx.library.model.v2.Annotation> annotationsA,
                                                                                       Collection<org.spdx.library.model.v2.Annotation> annotationsB)
                                                                                throws org.spdx.core.InvalidSPDXAnalysisException
        Find any SPDX annotations which are in annotationsA but not in annotationsB
        Parameters:
        annotationsA -
        annotationsB -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • findUniqueRelationships

        public static List<org.spdx.library.model.v2.Relationship> findUniqueRelationships​(Collection<org.spdx.library.model.v2.Relationship> relationshipsA,
                                                                                           Collection<org.spdx.library.model.v2.Relationship> relationshipsB)
                                                                                    throws org.spdx.core.InvalidSPDXAnalysisException
        Find unique relationships that are present in relationshipsA but not relationshipsB
        Parameters:
        relationshipsA -
        relationshipsB -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • findUniqueExternalDocumentRefs

        public static List<org.spdx.library.model.v2.ExternalDocumentRef> findUniqueExternalDocumentRefs​(Collection<org.spdx.library.model.v2.ExternalDocumentRef> externalDocRefsA,
                                                                                                         Collection<org.spdx.library.model.v2.ExternalDocumentRef> externalDocRefsB)
                                                                                                  throws org.spdx.core.InvalidSPDXAnalysisException
        Find unique relationships that are present in relationshipsA but not relationshipsB
        Parameters:
        externalDocRefsA -
        externalDocRefsB -
        Returns:
        Throws:
        org.spdx.core.InvalidSPDXAnalysisException
      • getSpdxDocuments

        public List<org.spdx.library.model.v2.SpdxDocument> getSpdxDocuments()
        Returns:
      • getSnippetComparers

        public SpdxSnippetComparer[] getSnippetComparers()
        Returns:
        all snippet comparers