diff --git a/pom.xml b/pom.xml index 41bed6c80..d5cb64949 100644 --- a/pom.xml +++ b/pom.xml @@ -189,6 +189,12 @@ **/*.java + + src/test/resources + + **/*.java + + false TestFiles diff --git a/src/main/java/org/spdx/library/model/license/ListedLicenses.java b/src/main/java/org/spdx/library/model/license/ListedLicenses.java index e2e33f8ac..57ba1af1c 100644 --- a/src/main/java/org/spdx/library/model/license/ListedLicenses.java +++ b/src/main/java/org/spdx/library/model/license/ListedLicenses.java @@ -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 { @@ -89,7 +97,6 @@ private void initializeLicenseModelStore() { } public static ListedLicenses getListedLicenses() { - ListedLicenses retval = null; listedLicenseModificationLock.readLock().lock(); try { @@ -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 diff --git a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseLocalStore.java b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseLocalStore.java index 625605df9..3c42f8ea3 100644 --- a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseLocalStore.java +++ b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseLocalStore.java @@ -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) { @@ -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); @@ -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) { @@ -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); } diff --git a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java index e49a53918..5ff2b5621 100644 --- a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java +++ b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java @@ -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 diff --git a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseWebStore.java b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseWebStore.java index eeacb80a6..43f73a707 100644 --- a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseWebStore.java +++ b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseWebStore.java @@ -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 } diff --git a/src/test/java/org/spdx/library/model/license/ListedLicensesTest.java b/src/test/java/org/spdx/library/model/license/ListedLicensesTest.java index 9360b9b40..a3cf3874a 100644 --- a/src/test/java/org/spdx/library/model/license/ListedLicensesTest.java +++ b/src/test/java/org/spdx/library/model/license/ListedLicensesTest.java @@ -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; @@ -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. @@ -120,7 +124,9 @@ public void testGetExceptionbyIdLocal() throws InvalidSPDXAnalysisException { } public void testGetExceptionIds() throws InvalidSPDXAnalysisException { - assertTrue(ListedLicenses.getListedLicenses().getSpdxListedExceptionIds().size() >= NUM_3_7_EXCEPTION); + List result = ListedLicenses.getListedLicenses().getSpdxListedExceptionIds(); + assertTrue(result.size() >= NUM_3_7_EXCEPTION); + assertTrue(result.contains("389-exception")); } public void testListedLicenseIdCaseSensitive() { @@ -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 licenseIds = ListedLicenses.getListedLicenses().getSpdxListedLicenseIds(); + assertEquals(1, licenseIds.size()); + assertFalse(licenseIds.contains("Apache-2.0")); + assertTrue(licenseIds.contains("TEST")); + + List 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(); + } + } } diff --git a/src/test/resources/org/spdx/library/model/license/exceptions.json b/src/test/resources/org/spdx/library/model/license/exceptions.json new file mode 100644 index 000000000..630c288cd --- /dev/null +++ b/src/test/resources/org/spdx/library/model/license/exceptions.json @@ -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" +} \ No newline at end of file diff --git a/src/test/resources/org/spdx/library/model/license/licenses.json b/src/test/resources/org/spdx/library/model/license/licenses.json new file mode 100644 index 000000000..2c615c536 --- /dev/null +++ b/src/test/resources/org/spdx/library/model/license/licenses.json @@ -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" +}