Skip to content

Commit

Permalink
Merge pull request #211 from loosebazooka/listed-licenses-configurable
Browse files Browse the repository at this point in the history
Make ListedLicenses more user configurable
  • Loading branch information
goneall authored Oct 18, 2023
2 parents 4318088 + 67dc8c6 commit f9885f0
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 15 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,12 @@
<exclude>**/*.java</exclude>
</excludes>
</testResource>
<testResource>
<directory>src/test/resources</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
<testResource>
<filtering>false</filtering>
<directory>TestFiles</directory>
Expand Down
29 changes: 27 additions & 2 deletions src/main/java/org/spdx/library/model/license/ListedLicenses.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ private ListedLicenses() {
initializeLicenseModelStore();
}

/**
* This constructor should only be called by the initializeListedLicenses method,
* to programmatically configure licenseModelStore from the application consuming this library
*/
private ListedLicenses(IListedLicenseStore licenseModelStore) {
this.licenseModelStore = licenseModelStore;
}

private void initializeLicenseModelStore() {
listedLicenseModificationLock.writeLock().lock();
try {
Expand All @@ -89,7 +97,6 @@ private void initializeLicenseModelStore() {
}

public static ListedLicenses getListedLicenses() {

ListedLicenses retval = null;
listedLicenseModificationLock.readLock().lock();
try {
Expand All @@ -110,7 +117,25 @@ public static ListedLicenses getListedLicenses() {
}
return retval;
}


/**
* Initializes the listed licenses singleton from a provided cache. This will
* ignore all configuration around fetching remote licenses.
*
* @param licenseStore a preconfigured licenseStore, see {@link SpdxListedLicenseLocalStore} for
* an example.
* @return a singleton instance
*/
public static ListedLicenses initializeListedLicenses(IListedLicenseStore licenseStore) {
listedLicenseModificationLock.writeLock().lock();
try {
listedLicenses = new ListedLicenses(licenseStore);
return listedLicenses;
} finally {
listedLicenseModificationLock.writeLock().unlock();
}
}

/**
* Resets all of the cached license information and reloads the license IDs
* NOTE: This method should be used with caution, it will negatively impact
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public SpdxListedLicenseLocalStore() throws InvalidSPDXAnalysisException {
}

@Override
InputStream getTocInputStream() throws IOException {
public InputStream getTocInputStream() throws IOException {
String fileName = LISTED_LICENSE_JSON_LOCAL_DIR + "/" + LICENSE_TOC_FILENAME;
InputStream retval = SpdxListedLicenseLocalStore.class.getResourceAsStream("/" + fileName);
if (retval == null) {
Expand All @@ -48,7 +48,7 @@ InputStream getTocInputStream() throws IOException {
}

@Override
InputStream getLicenseInputStream(String licenseId) throws IOException {
public InputStream getLicenseInputStream(String licenseId) throws IOException {

String fileName = LISTED_LICENSE_JSON_LOCAL_DIR + "/" + licenseId + JSON_SUFFIX;
InputStream retval = SpdxListedLicenseLocalStore.class.getResourceAsStream("/" + fileName);
Expand All @@ -59,7 +59,7 @@ InputStream getLicenseInputStream(String licenseId) throws IOException {
}

@Override
InputStream getExceptionTocInputStream() throws IOException {
public InputStream getExceptionTocInputStream() throws IOException {
String fileName = LISTED_LICENSE_JSON_LOCAL_DIR + "/" + EXCEPTION_TOC_FILENAME;
InputStream retval = SpdxListedLicenseLocalStore.class.getResourceAsStream("/" + fileName);
if (retval == null) {
Expand All @@ -69,7 +69,7 @@ InputStream getExceptionTocInputStream() throws IOException {
}

@Override
InputStream getExceptionInputStream(String exceptionId) throws IOException {
public InputStream getExceptionInputStream(String exceptionId) throws IOException {
return getLicenseInputStream(exceptionId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,25 +114,25 @@ public SpdxListedLicenseModelStore() throws InvalidSPDXAnalysisException {
* @return InputStream for the Table of Contents of the licenses formated in JSON SPDX
* @throws IOException
*/
abstract InputStream getTocInputStream() throws IOException;
public abstract InputStream getTocInputStream() throws IOException;

/**
* @return InputStream for the Table of Contents of the exceptions formated in JSON SPDX
* @throws IOException
*/
abstract InputStream getExceptionTocInputStream() throws IOException;
public abstract InputStream getExceptionTocInputStream() throws IOException;

/**
* @return InputStream for a license formated in SPDX JSON
* @throws IOException
*/
abstract InputStream getLicenseInputStream(String licenseId) throws IOException;
public abstract InputStream getLicenseInputStream(String licenseId) throws IOException;

/**
* @return InputStream for an exception formated in SPDX JSON
* @throws IOException
*/
abstract InputStream getExceptionInputStream(String exceptionId) throws IOException;
public abstract InputStream getExceptionInputStream(String exceptionId) throws IOException;

/**
* Loads all license and exception ID's from the appropriate JSON files
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,22 +44,22 @@ private InputStream getUrlInputStream(final URL url) throws IOException {
}

@Override
InputStream getTocInputStream() throws IOException {
public InputStream getTocInputStream() throws IOException {
return getUrlInputStream(new URL(SpdxConstants.LISTED_LICENSE_URL + LICENSE_TOC_FILENAME));
}

@Override
InputStream getLicenseInputStream(String licenseId) throws IOException {
public InputStream getLicenseInputStream(String licenseId) throws IOException {
return getUrlInputStream(new URL(SpdxConstants.LISTED_LICENSE_URL + licenseId + JSON_SUFFIX));
}

@Override
InputStream getExceptionTocInputStream() throws IOException {
public InputStream getExceptionTocInputStream() throws IOException {
return getUrlInputStream(new URL(SpdxConstants.LISTED_LICENSE_URL + EXCEPTION_TOC_FILENAME));
}

@Override
InputStream getExceptionInputStream(String exceptionId) throws IOException {
public InputStream getExceptionInputStream(String exceptionId) throws IOException {
return getLicenseInputStream(exceptionId); // Same URL using exception ID rather than license ID
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
package org.spdx.library.model.license;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Optional;

Expand All @@ -7,6 +10,7 @@
import org.spdx.library.SpdxConstants;

import junit.framework.TestCase;
import org.spdx.storage.listedlicense.SpdxListedLicenseModelStore;

/**
* Copyright (c) 2019 Source Auditor Inc.
Expand Down Expand Up @@ -120,7 +124,9 @@ public void testGetExceptionbyIdLocal() throws InvalidSPDXAnalysisException {
}

public void testGetExceptionIds() throws InvalidSPDXAnalysisException {
assertTrue(ListedLicenses.getListedLicenses().getSpdxListedExceptionIds().size() >= NUM_3_7_EXCEPTION);
List<String> result = ListedLicenses.getListedLicenses().getSpdxListedExceptionIds();
assertTrue(result.size() >= NUM_3_7_EXCEPTION);
assertTrue(result.contains("389-exception"));
}

public void testListedLicenseIdCaseSensitive() {
Expand Down Expand Up @@ -154,4 +160,47 @@ public void testGetExceptionIdProperty() throws InvalidSPDXAnalysisException {
assertTrue(idProp.get() instanceof String);
assertEquals(id, idProp.get());
}

public void testLicenseListInitializeListedLicenses() throws InvalidSPDXAnalysisException {
try {
ListedLicenses.initializeListedLicenses(new SpdxListedLicenseModelStore() {
@Override
public InputStream getTocInputStream() throws IOException {
return ListedLicensesTest.class.getResourceAsStream("licenses.json");
}

@Override
public InputStream getExceptionTocInputStream() throws IOException {
return ListedLicensesTest.class.getResourceAsStream("exceptions.json");
}

@Override
public InputStream getLicenseInputStream(String licenseId) throws IOException {
throw new UnsupportedOperationException("this shouldn't be used in tests");
}

@Override
public InputStream getExceptionInputStream(String exceptionId) throws IOException {
throw new UnsupportedOperationException("this shouldn't be used in tests");
}

@Override
public void close() throws Exception {
// Nothing to do for the either the in-memory or the web store
}
});
List<String> licenseIds = ListedLicenses.getListedLicenses().getSpdxListedLicenseIds();
assertEquals(1, licenseIds.size());
assertFalse(licenseIds.contains("Apache-2.0"));
assertTrue(licenseIds.contains("TEST"));

List<String> exceptionIds = ListedLicenses.getListedLicenses().getSpdxListedExceptionIds();
assertEquals(1, licenseIds.size());
assertFalse(exceptionIds.contains("389-exception"));
assertTrue(exceptionIds.contains("TEST-exception"));
} finally {
// since ListedLicenses in a singleton, reset it after running this test
ListedLicenses.resetListedLicenses();
}
}
}
17 changes: 17 additions & 0 deletions src/test/resources/org/spdx/library/model/license/exceptions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"licenseListVersion": "1.1-test",
"exceptions": [
{
"reference": "./TEST-exception.json",
"isDeprecatedLicenseId": false,
"detailsUrl": "./TEST-exception.html",
"referenceNumber": 1,
"name": "TEST Directory Server Exception",
"licenseExceptionId": "TEST-exception",
"seeAlso": [
"http://example.com/TEST_Exception_License_Text"
]
}
],
"releaseDate": "1999-01-01"
}
18 changes: 18 additions & 0 deletions src/test/resources/org/spdx/library/model/license/licenses.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"licenseListVersion": "1.1-test",
"licenses": [
{
"reference": "https://spdx.org/licenses/test.html",
"isDeprecatedLicenseId": false,
"detailsUrl": "https://spdx.org/licenses/test.json",
"referenceNumber": 1,
"name": "Some fake licenses for tests",
"licenseId": "TEST",
"seeAlso": [
"https://opensource.org/licenses/TEST"
],
"isOsiApproved": true
}
],
"releaseDate": "1999-01-01"
}

0 comments on commit f9885f0

Please sign in to comment.