From 5111af370b69ec50c9acbb6b0439614d9b835340 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Tue, 7 Jan 2025 14:42:25 -0800 Subject: [PATCH 1/5] Add support for storing properties of type Double This update depends on new versions of the SPDX core library (1.0.0-RC2 or later) and the SPDX 3 Model (1.0.0-RC2 or later) Fixes #273 --- pom.xml | 4 ++-- src/main/java/org/spdx/storage/simple/InMemSpdxStore.java | 2 +- src/main/java/org/spdx/storage/simple/StoredTypedItem.java | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 8cf75f66..6d5d2ab0 100644 --- a/pom.xml +++ b/pom.xml @@ -153,12 +153,12 @@ org.spdx spdx-java-core - 1.0.0-RC1 + 1.0.0-RC2 org.spdx spdx-java-model-3_0 - 1.0.0-RC1 + 1.0.0-RC2 diff --git a/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java b/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java index f27cec70..293644dc 100644 --- a/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java +++ b/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java @@ -414,7 +414,7 @@ public void leaveCriticalSection(IModelStoreLock lock) { } @Override - public Optional getCaseSensisitiveId(String nameSpace, String caseInsensisitiveId) { + public Optional getCaseSensitiveId(String nameSpace, String caseInsensisitiveId) { Objects.requireNonNull(nameSpace, "Namespace can not be null"); Objects.requireNonNull(caseInsensisitiveId, "CaseInsensisitiveId can not be null"); String objectUri = nameSpace + "#" + caseInsensisitiveId; diff --git a/src/main/java/org/spdx/storage/simple/StoredTypedItem.java b/src/main/java/org/spdx/storage/simple/StoredTypedItem.java index 309a61bf..32b44559 100644 --- a/src/main/java/org/spdx/storage/simple/StoredTypedItem.java +++ b/src/main/java/org/spdx/storage/simple/StoredTypedItem.java @@ -120,6 +120,8 @@ public void setValue(PropertyDescriptor propertyDescriptor, Object value) throws !String.class.isAssignableFrom(value.getClass()) && !Boolean.class.isAssignableFrom(value.getClass()) && !Integer.class.isAssignableFrom(value.getClass()) && + !Double.class.isAssignableFrom(value.getClass()) && + !Float.class.isAssignableFrom((value.getClass())) && !TypedValue.class.isAssignableFrom(value.getClass()) && !(value instanceof IndividualUriValue)) { throw new SpdxInvalidTypeException(value.getClass() +" is not a supported class to be stored."); From 5520f665051989f3fe3fb47c5a55864bec48eb36 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Wed, 8 Jan 2025 11:24:44 -0800 Subject: [PATCH 2/5] Update src/main/java/org/spdx/storage/simple/InMemSpdxStore.java Co-authored-by: Arthit Suriyawongkul Signed-off-by: Gary O'Neall --- src/main/java/org/spdx/storage/simple/InMemSpdxStore.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java b/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java index 293644dc..b8337142 100644 --- a/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java +++ b/src/main/java/org/spdx/storage/simple/InMemSpdxStore.java @@ -414,10 +414,10 @@ public void leaveCriticalSection(IModelStoreLock lock) { } @Override - public Optional getCaseSensitiveId(String nameSpace, String caseInsensisitiveId) { + public Optional getCaseSensitiveId(String nameSpace, String caseInsensitiveId) { Objects.requireNonNull(nameSpace, "Namespace can not be null"); - Objects.requireNonNull(caseInsensisitiveId, "CaseInsensisitiveId can not be null"); - String objectUri = nameSpace + "#" + caseInsensisitiveId; + Objects.requireNonNull(caseInsensitiveId, "CaseInsensitiveId can not be null"); + String objectUri = nameSpace + "#" + caseInsensitiveId; StoredTypedItem item = typedValueMap.get(objectUri.toLowerCase()); if (Objects.isNull(item)) { return Optional.empty(); From f911d4e753304955c65ddfe12e78c9eb57184f54 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Thu, 9 Jan 2025 15:48:08 -0800 Subject: [PATCH 3/5] Append '#' to document namespace when converting form 2 Fixes #275 --- .../java/org/spdx/library/conversion/Spdx2to3Converter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/spdx/library/conversion/Spdx2to3Converter.java b/src/main/java/org/spdx/library/conversion/Spdx2to3Converter.java index f16fc101..97d20a13 100644 --- a/src/main/java/org/spdx/library/conversion/Spdx2to3Converter.java +++ b/src/main/java/org/spdx/library/conversion/Spdx2to3Converter.java @@ -726,7 +726,7 @@ public NamespaceMap convertAndStore(org.spdx.library.model.v2.ExternalDocumentRe NamespaceMap toNamespaceMap = (NamespaceMap)SpdxModelClassFactoryV3.getModelObject(toModelStore, toObjectUri, SpdxConstantsV3.CORE_NAMESPACE_MAP, copyManager, true, defaultUriPrefix); toNamespaceMap.setPrefix(externalDocRef.getId()); - toNamespaceMap.setNamespace(externalDocRef.getSpdxDocumentNamespace()); + toNamespaceMap.setNamespace(externalDocRef.getSpdxDocumentNamespace() + "#"); return toNamespaceMap; } From c4df57196095689d6c3d21d31b9f3c411e47e278 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Tue, 21 Jan 2025 14:42:06 -0800 Subject: [PATCH 4/5] additional logging for licenses --- src/main/java/org/spdx/library/ListedLicenses.java | 2 +- .../spdx/storage/listedlicense/SpdxListedLicenseModelStore.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/spdx/library/ListedLicenses.java b/src/main/java/org/spdx/library/ListedLicenses.java index faaa63f8..938eab00 100644 --- a/src/main/java/org/spdx/library/ListedLicenses.java +++ b/src/main/java/org/spdx/library/ListedLicenses.java @@ -126,7 +126,7 @@ private void initializeLicenseModelStore() { try { baseModelStore = new SpdxListedLicenseLocalStore(); } catch(InvalidSPDXAnalysisException ex) { - logger.error("Error loading cached SPDX licenses"); + logger.error("Error loading cached SPDX licenses", ex); throw new RuntimeException("Unexpected error loading SPDX Listed Licenses"); } } diff --git a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java index 112b5e77..aa1f98e7 100644 --- a/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java +++ b/src/main/java/org/spdx/storage/listedlicense/SpdxListedLicenseModelStore.java @@ -180,8 +180,10 @@ private void loadIds() throws InvalidSPDXAnalysisException { ExceptionJsonTOC exceptionToc = gson.fromJson(tocJsonStr.toString(), ExceptionJsonTOC.class); exceptionIds = exceptionToc.getExceptionIds(); } catch (MalformedURLException e) { + logger.error("License TOC URL invalid", e); throw new SpdxListedLicenseException("License TOC URL invalid", e) ; } catch (IOException e) { + logger.error("I/O error reading license TOC", e); throw new SpdxListedLicenseException("I/O error reading license TOC", e); } finally { if (reader != null) { From 0ae3a6e18aeeca7863af4fc717fc4f860ec03307 Mon Sep 17 00:00:00 2001 From: Gary O'Neall Date: Sat, 25 Jan 2025 12:39:45 -0800 Subject: [PATCH 5/5] Initialize default model store in init method --- .../org/spdx/library/SpdxModelFactory.java | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/spdx/library/SpdxModelFactory.java b/src/main/java/org/spdx/library/SpdxModelFactory.java index 1ce20e47..27f21333 100644 --- a/src/main/java/org/spdx/library/SpdxModelFactory.java +++ b/src/main/java/org/spdx/library/SpdxModelFactory.java @@ -25,14 +25,14 @@ import javax.annotation.Nullable; -import org.spdx.core.CoreModelObject; -import org.spdx.core.IModelCopyManager; -import org.spdx.core.InvalidSPDXAnalysisException; -import org.spdx.core.ModelRegistry; -import org.spdx.core.ModelRegistryException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spdx.core.*; import org.spdx.library.model.v2.SpdxModelInfoV2_X; import org.spdx.library.model.v3_0_1.SpdxModelInfoV3_0; import org.spdx.storage.IModelStore; +import org.spdx.storage.listedlicense.SpdxListedLicenseModelStore; +import org.spdx.storage.simple.InMemSpdxStore; /** * Main entrypoint for the SPDX Java Library @@ -52,7 +52,9 @@ */ @SuppressWarnings("unused") public class SpdxModelFactory { - + + static final Logger logger = LoggerFactory.getLogger(SpdxModelFactory.class.getName()); + static { // register the supported spec version models ModelRegistry.getModelRegistry().registerModel(new SpdxModelInfoV2_X()); @@ -61,6 +63,10 @@ public class SpdxModelFactory { public static final String IMPLEMENTATION_VERSION = "2.0.0"; + static final String DEFAULT_DOCUMENT_URI = "https://default/spdx/document"; + + private static final Object INIT_LOCK = new Object(); + /** * Static class private constructor */ @@ -107,12 +113,48 @@ public static String getLatestSpecVersion() { } /** - * This static method is a convenience to load this class and initialize the supported model versions. + * This static method is a convenience to load this class and initialize the supported model versions and + * initialize the DefaultModelStore with default values *

* It should be called before using any other functionality from the library */ public static void init() { - // doesn't do anything + synchronized (INIT_LOCK) { + if (!DefaultModelStore.isInitialized()) { + DefaultModelStore.initialize(new InMemSpdxStore(), DEFAULT_DOCUMENT_URI, new ModelCopyManager()); + } + } + } + + /** + * This static method is a convenience to load this class and initialize the supported model versions and + * initialize the DefaultModelStore with the parameter values + *

+ * It should be called before using any other functionality from the library + * @param modelStore Model store to use as a default + * @param defaultDocumentUri Document URI to use as a default + * @param defaultCopyManager Copy manager to use as a default + */ + public static void init(IModelStore modelStore, String defaultDocumentUri, + IModelCopyManager defaultCopyManager) { + Objects.requireNonNull(modelStore, "Model store can not be null"); + Objects.requireNonNull(defaultDocumentUri, "Document URI can not be null"); + Objects.requireNonNull(defaultCopyManager, "Copy manager can not be null"); + synchronized (INIT_LOCK) { + if (!DefaultModelStore.isInitialized()) { + DefaultModelStore.initialize(modelStore, defaultDocumentUri, defaultCopyManager); + } else { + try { + if (!(Objects.equals(modelStore, DefaultModelStore.getDefaultModelStore()) && + Objects.equals(defaultDocumentUri, DefaultModelStore.getDefaultDocumentUri()) && + Objects.equals(defaultCopyManager, DefaultModelStore.getDefaultCopyManager()))) { + logger.warn("Ignoring second call to initialize the model store"); + } + } catch (DefaultStoreNotInitialized e) { + logger.error("Unexpected store not initialized during init", e); + } + } + } } /**