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"
+}