Package org.spdx.utility.compare
Class SpdxComparer
java.lang.Object
org.spdx.utility.compare.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 Summary
Constructors Constructor Description SpdxComparer() -
Method Summary
Modifier and Type Method Description List<SpdxFile>collectAllFiles(SpdxDocument spdxDocument)Collect all of the files present in the SPDX document including files within documents and files embedded in packagesprotected List<SpdxPackage>collectAllPackages(SpdxDocument spdxDocument)Collect all of the packages present in the SPDX document including packages embedded in other relationships within documentsstatic booleancollectionsEquals(Collection<? extends Object> a1, Collection<? extends Object> a2)Compare two object listsstatic booleancollectionsEquivalent(Collection<? extends ModelObject> collectionA, Collection<? extends ModelObject> collectionB)voidcompare(List<SpdxDocument> spdxDocuments)Compares multiple SPDX documentsvoidcompare(SpdxDocument spdxDoc1, SpdxDocument spdxDoc2)Compares 2 SPDX documentsbooleancompareLicense(int doc1, AnyLicenseInfo license1, int doc2, AnyLicenseInfo license2)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 invokedstatic intcompareStrings(String stringA, String stringB)Compares two strings including trimming the string and taking into account they may be null.static intcompareStrings(Optional<String> stringA, Optional<String> stringB)Compares two strings including trimming the string and taking into account they may be null.static booleanelementsEquivalent(Optional<? extends ModelObject> elementA, Optional<? extends ModelObject> elementB)static List<Annotation>findUniqueAnnotations(Collection<Annotation> annotationsA, Collection<Annotation> annotationsB)Find any SPDX annotations which are in annotationsA but not in annotationsBstatic List<Checksum>findUniqueChecksums(Collection<Checksum> checksumsA, Collection<Checksum> checksumsB)Find any SPDX checksums which are in elementsA but not in elementsBstatic List<ExternalDocumentRef>findUniqueExternalDocumentRefs(Collection<ExternalDocumentRef> externalDocRefsA, Collection<ExternalDocumentRef> externalDocRefsB)Find unique relationships that are present in relationshipsA but not relationshipsBstatic List<Relationship>findUniqueRelationships(Collection<Relationship> relationshipsA, Collection<Relationship> relationshipsB)Find unique relationships that are present in relationshipsA but not relationshipsBList<SpdxLicenseDifference>getExtractedLicenseDifferences(int docIndexA, int docIndexB)Retrieves any licenses which where the text matches in both documents but other fields are differentList<SpdxFileDifference>getFileDifferences(int docindex1, int docindex2)Returns any file differences found between the first and second SPDX documents as specified by the document indexintgetNumSpdxDocs()SpdxPackageComparer[]getPackageComparers()List<SpdxPackageComparer>getPackageDifferences()SpdxSnippetComparer[]getSnippetComparers()SpdxDocumentgetSpdxDoc(int docIndex)List<SpdxDocument>getSpdxDocuments()List<String>getUniqueCreators(int doc1index, int doc2index)Returns any creators which are in the SPDX document 1 which are not in document 2List<Annotation>getUniqueDocumentAnnotations(int docindex1, int docindex2)Return any document annotations which are in spdx document index 1 but not in spdx document index 2List<Relationship>getUniqueDocumentRelationship(int docindex1, int docindex2)Return any document annotations which are in spdx document index 1 but not in spdx document index 2List<ExternalDocumentRef>getUniqueExternalDocumentRefs(int docindex1, int docindex2)Return any external document references which are in spdx document index 1 but not in spdx document index 2List<ExtractedLicenseInfo>getUniqueExtractedLicenses(int docIndexA, int docIndexB)Retrieves any unique extracted licenses fromt the first SPDX document index relative to the second - unique is determined by the license text matchingList<SpdxFile>getUniqueFiles(int docindex1, int docindex2)Return any files which are in spdx document index 1 but not in spdx document index 2List<SpdxPackage>getUniquePackages(int docindex1, int docindex2)Return any files which are in spdx document index 1 but not in spdx document index 2booleanisCreatorCommentsEqual()booleanisCreatorDatesEqual()booleanisCreatorInformationEqual()booleanisDataLicenseEqual()booleanisDifferenceFound()booleanisDocumentAnnotationsEquals()booleanisDocumentCommentsEqual()booleanisDocumentContentsEquals()booleanisDocumentRelationshipsEquals()booleanisExternalDcoumentRefsEquals()booleanisExtractedLicensingInfosEqual()booleanisfilesEquals()booleanisLicenseListVersionEqual()booleanisPackagesEquals()booleanisSnippetsEqual()booleanisSpdxVersionEqual()static booleanlistsEquals(List<? extends Object> a1, List<? extends Object> a2)Compare two object listsstatic booleanobjectsEqual(Object o1, Object o2)returns true if the two objects are equal considering nullsstatic booleanstringCollectionsEqual(Collection<String> stringsA, Collection<String> stringsB)Compares 2 collections and returns true if the contents are equal ignoring order and trimming strings.static booleanstringsEqual(String stringA, String stringB)Compares two strings returning true if they are equal considering null values and trimming the strings.static booleanstringsEqual(Optional<String> stringA, Optional<String> stringB)Compares two strings returning true if they are equal considering null values and trimming the strings.
-
Constructor Details
-
SpdxComparer
public SpdxComparer()
-
-
Method Details
-
compare
public void compare(SpdxDocument spdxDoc1, SpdxDocument spdxDoc2) throws InvalidSPDXAnalysisException, SpdxCompareExceptionCompares 2 SPDX documents- Parameters:
spdxDoc1-spdxDoc2-- Throws:
InvalidSPDXAnalysisExceptionSpdxCompareException
-
compare
public void compare(List<SpdxDocument> spdxDocuments) throws InvalidSPDXAnalysisException, SpdxCompareExceptionCompares multiple SPDX documents- Parameters:
spdxDocuments-- Throws:
SpdxCompareExceptionInvalidSPDXAnalysisException
-
collectAllPackages
protected List<SpdxPackage> collectAllPackages(SpdxDocument spdxDocument) throws InvalidSPDXAnalysisExceptionCollect all of the packages present in the SPDX document including packages embedded in other relationships within documents- Parameters:
spdxDocument-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
collectAllFiles
public List<SpdxFile> collectAllFiles(SpdxDocument spdxDocument) throws InvalidSPDXAnalysisExceptionCollect all of the files present in the SPDX document including files within documents and files embedded in packages- Parameters:
spdxDocument-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
compareLicense
public boolean compareLicense(int doc1, AnyLicenseInfo license1, int doc2, AnyLicenseInfo license2) throws SpdxCompareExceptionCompares 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 license1license1-doc2- Index of the SPDX document for license2license2-- 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
returns true if the two objects are equal considering nulls- Parameters:
o1-o2-- Returns:
-
elementsEquivalent
public static boolean elementsEquivalent(Optional<? extends ModelObject> elementA, Optional<? extends ModelObject> elementB) throws InvalidSPDXAnalysisException- Parameters:
elementA-elementB-- Returns:
- true of the elements are present and equivalent
- Throws:
InvalidSPDXAnalysisException
-
collectionsEquivalent
public static boolean collectionsEquivalent(Collection<? extends ModelObject> collectionA, Collection<? extends ModelObject> collectionB) throws InvalidSPDXAnalysisException- Parameters:
collectionA-collectionB-- Returns:
- true if the collections all contain equivalent items
- Throws:
InvalidSPDXAnalysisException
-
listsEquals
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
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
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
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
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:
-
isSpdxVersionEqual
- Returns:
- Throws:
SpdxCompareException
-
getSpdxDoc
- Parameters:
docIndex- Reference to which document number - 0 is the first document parameter in compare- Returns:
- Throws:
SpdxCompareException
-
isDataLicenseEqual
- Returns:
- Throws:
SpdxCompareException
-
isDocumentCommentsEqual
- Returns:
- Throws:
SpdxCompareException
-
isExternalDcoumentRefsEquals
- Throws:
SpdxCompareException
-
isExtractedLicensingInfosEqual
- Throws:
SpdxCompareException
-
getUniqueExtractedLicenses
public List<ExtractedLicenseInfo> getUniqueExtractedLicenses(int docIndexA, int docIndexB) throws SpdxCompareExceptionRetrieves 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 SpdxCompareExceptionRetrieves any licenses which where the text matches in both documents but other fields are different- Parameters:
docIndexA-docIndexB-- Returns:
- Throws:
SpdxCompareException
-
isCreatorInformationEqual
- Returns:
- true if all creation information fields equals
- Throws:
SpdxCompareException
-
isCreatorCommentsEqual
- Returns:
- true all creator comments equal
- Throws:
SpdxCompareException
-
isCreatorDatesEqual
- Returns:
- true if all creation information fields equals
- Throws:
SpdxCompareException
-
getUniqueCreators
Returns any creators which are in the SPDX document 1 which are not in document 2- Parameters:
doc1index-doc2index-- Returns:
- Throws:
SpdxCompareException
-
isfilesEquals
- Returns:
- Throws:
SpdxCompareException
-
isPackagesEquals
- Returns:
- Throws:
SpdxCompareException
-
isDocumentAnnotationsEquals
- Returns:
- Throws:
SpdxCompareException
-
isDocumentRelationshipsEquals
- Returns:
- Throws:
SpdxCompareException
-
getUniqueFiles
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 SpdxCompareExceptionReturns 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<SpdxPackage> getUniquePackages(int docindex1, int docindex2) throws SpdxCompareExceptionReturn 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<ExternalDocumentRef> getUniqueExternalDocumentRefs(int docindex1, int docindex2) throws SpdxCompareExceptionReturn 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<Annotation> getUniqueDocumentAnnotations(int docindex1, int docindex2) throws SpdxCompareExceptionReturn 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<Relationship> getUniqueDocumentRelationship(int docindex1, int docindex2) throws SpdxCompareExceptionReturn any document annotations which are in spdx document index 1 but not in spdx document index 2- Parameters:
docindex1-docindex2-- Returns:
- Throws:
SpdxCompareException
-
getPackageDifferences
- Returns:
- Package comparers where there is at least one difference
- Throws:
SpdxCompareException
-
getPackageComparers
- Returns:
- all package comparers
-
getNumSpdxDocs
public int getNumSpdxDocs()- Returns:
-
isLicenseListVersionEqual
- Returns:
- Throws:
SpdxCompareException
-
findUniqueChecksums
public static List<Checksum> findUniqueChecksums(Collection<Checksum> checksumsA, Collection<Checksum> checksumsB) throws InvalidSPDXAnalysisExceptionFind any SPDX checksums which are in elementsA but not in elementsB- Parameters:
checksumsA-checksumsB-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
findUniqueAnnotations
public static List<Annotation> findUniqueAnnotations(Collection<Annotation> annotationsA, Collection<Annotation> annotationsB) throws InvalidSPDXAnalysisExceptionFind any SPDX annotations which are in annotationsA but not in annotationsB- Parameters:
annotationsA-annotationsB-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
findUniqueRelationships
public static List<Relationship> findUniqueRelationships(Collection<Relationship> relationshipsA, Collection<Relationship> relationshipsB) throws InvalidSPDXAnalysisExceptionFind unique relationships that are present in relationshipsA but not relationshipsB- Parameters:
relationshipsA-relationshipsB-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
findUniqueExternalDocumentRefs
public static List<ExternalDocumentRef> findUniqueExternalDocumentRefs(Collection<ExternalDocumentRef> externalDocRefsA, Collection<ExternalDocumentRef> externalDocRefsB) throws InvalidSPDXAnalysisExceptionFind unique relationships that are present in relationshipsA but not relationshipsB- Parameters:
externalDocRefsA-externalDocRefsB-- Returns:
- Throws:
InvalidSPDXAnalysisException
-
getSpdxDocuments
- Returns:
-
isDocumentContentsEquals
- Returns:
- Throws:
SpdxCompareException
-
isSnippetsEqual
- Returns:
- Throws:
SpdxCompareException
-
getSnippetComparers
- Returns:
- all snippet comparers
-