From 1178268ae17778d2fd51fd9a275dfa3e19598831 Mon Sep 17 00:00:00 2001 From: ADITYA-CODE-SOURCE Date: Sat, 14 Mar 2026 08:55:31 +0530 Subject: [PATCH 1/2] feat(licensedb): Add data transformation layer for LicenseDB integration Added transformer classes to convert LicenseDB data to SW360 format: - LicenseTransformer: Maps LicenseDB License to SW360 License - ObligationTransformer: Maps LicenseDB Obligation to SW360 Obligation These transformers handle field mapping between external LicenseDB format and internal SW360 data model for licenses and obligations. Fixes #3897 --- .../transformer/LicenseTransformer.java | 107 ++++++++++++++++++ .../transformer/ObligationTransformer.java | 85 ++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java create mode 100644 rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java new file mode 100644 index 0000000000..dca260a061 --- /dev/null +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java @@ -0,0 +1,107 @@ +/* + * Copyright Siemens AG, 2025. Part of the SW360 Portal Project. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.sw360.rest.resourceserver.licensedb.transformer; + +import org.eclipse.sw360.datahandler.thrift.licenses.License; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * Transformer class to convert LicenseDB license data to SW360 License format. + * + *

This transformer handles the conversion of license data received from the + * LicenseDB service into the SW360 internal License data model. It maps all + * relevant fields and handles null values gracefully.

+ * + *

Field mapping:

+ * + * + *

Example usage:

+ *
+ * LicenseDBLicense licenseDbData = licenseDBClient.getLicense("Apache-2.0");
+ * LicenseTransformer transformer = new LicenseTransformer();
+ * License sw360License = transformer.transform(licenseDbData);
+ * 
+ */ +@Component +public class LicenseTransformer { + + /** + * Transform LicenseDB license data to SW360 License. + * + * @param licenseDbData the license data from LicenseDB as a Map + * @return SW360 License object, or null if input is null + */ + public License transform(Map licenseDbData) { + if (licenseDbData == null) { + return null; + } + + License license = new License(); + + // Map basic string fields + license.setShortname(getStringValue(licenseDbData, "shortname")); + license.setFullname(getStringValue(licenseDbData, "fullname")); + license.setText(getStringValue(licenseDbData, "text")); + license.setUrl(getStringValue(licenseDbData, "url")); + + // Map license type + String licenseType = getStringValue(licenseDbData, "licenseType"); + if (licenseType != null) { + license.setLicenseType(licenseType); + } + + // Map OSI approved flag + Boolean osiApproved = getBooleanValue(licenseDbData, "osiApproved"); + if (osiApproved != null) { + license.setOsiApproved(osiApproved); + } + + return license; + } + + /** + * Extract a string value from the data map. + * + * @param data the data map + * @param key the key to look up + * @return the string value, or null if not found + */ + private String getStringValue(Map data, String key) { + Object value = data.get(key); + return value != null ? value.toString() : null; + } + + /** + * Extract a boolean value from the data map. + * + * @param data the data map + * @param key the key to look up + * @return the boolean value, or null if not found + */ + private Boolean getBooleanValue(Map data, String key) { + Object value = data.get(key); + if (value == null) { + return null; + } + if (value instanceof Boolean) { + return (Boolean) value; + } + return Boolean.parseBoolean(value.toString()); + } +} \ No newline at end of file diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java new file mode 100644 index 0000000000..0072ac34b7 --- /dev/null +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java @@ -0,0 +1,85 @@ +/* + * Copyright Siemens AG, 2025. Part of the SW360 Portal Project. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.sw360.rest.resourceserver.licensedb.transformer; + +import org.eclipse.sw360.datahandler.thrift.licenses.Obligation; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * Transformer class to convert LicenseDB obligation data to SW360 Obligation format. + * + *

This transformer handles the conversion of obligation data received from the + * LicenseDB service into the SW360 internal Obligation data model. It maps all + * relevant fields and handles null values gracefully.

+ * + *

Field mapping:

+ *
    + *
  • text -> text
  • + *
  • title -> title
  • + *
  • type -> obligationType
  • + *
  • level -> obligationLevel
  • + *
+ * + *

Example usage:

+ *
+ * LicenseDBObligation obligationDbData = licenseDBClient.getObligation("obligation-1");
+ * ObligationTransformer transformer = new ObligationTransformer();
+ * Obligation sw360Obligation = transformer.transform(obligationDbData);
+ * 
+ */ +@Component +public class ObligationTransformer { + + /** + * Transform LicenseDB obligation data to SW360 Obligation. + * + * @param obligationDbData the obligation data from LicenseDB as a Map + * @return SW360 Obligation object, or null if input is null + */ + public Obligation transform(Map obligationDbData) { + if (obligationDbData == null) { + return null; + } + + Obligation obligation = new Obligation(); + + // Map basic string fields + obligation.setText(getStringValue(obligationDbData, "text")); + obligation.setTitle(getStringValue(obligationDbData, "title")); + + // Map obligation type if present + String type = getStringValue(obligationDbData, "type"); + if (type != null) { + obligation.setObligationType(type); + } + + // Map obligation level if present + String level = getStringValue(obligationDbData, "level"); + if (level != null) { + obligation.setObligationLevel(level); + } + + return obligation; + } + + /** + * Extract a string value from the data map. + * + * @param data the data map + * @param key the key to look up + * @return the string value, or null if not found + */ + private String getStringValue(Map data, String key) { + Object value = data.get(key); + return value != null ? value.toString() : null; + } +} \ No newline at end of file From 021a481ac3c1b46f2807323ed6e54bba335a97c6 Mon Sep 17 00:00:00 2001 From: ADITYA-CODE-SOURCE Date: Sat, 14 Mar 2026 09:09:59 +0530 Subject: [PATCH 2/2] fix: correct Thrift type mappings in transformer classes - LicenseTransformer: use setExternalLicenseLink() instead of setUrl() - LicenseTransformer: use setLicenseTypeDatabaseId() for license type - LicenseTransformer: use setOSIApproved(Quadratic) enum instead of Boolean - ObligationTransformer: use ObligationType.valueOf() for enum conversion - ObligationTransformer: use ObligationLevel.valueOf() for enum conversion --- .../transformer/LicenseTransformer.java | 15 +++++++------ .../transformer/ObligationTransformer.java | 22 ++++++++++++++----- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java index dca260a061..f0cd7de5c3 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/LicenseTransformer.java @@ -9,6 +9,7 @@ */ package org.eclipse.sw360.rest.resourceserver.licensedb.transformer; +import org.eclipse.sw360.datahandler.thrift.Quadratic; import org.eclipse.sw360.datahandler.thrift.licenses.License; import org.springframework.stereotype.Component; @@ -58,18 +59,18 @@ public License transform(Map licenseDbData) { license.setShortname(getStringValue(licenseDbData, "shortname")); license.setFullname(getStringValue(licenseDbData, "fullname")); license.setText(getStringValue(licenseDbData, "text")); - license.setUrl(getStringValue(licenseDbData, "url")); + license.setExternalLicenseLink(getStringValue(licenseDbData, "url")); - // Map license type - String licenseType = getStringValue(licenseDbData, "licenseType"); - if (licenseType != null) { - license.setLicenseType(licenseType); + // Map license type database ID + String licenseTypeId = getStringValue(licenseDbData, "licenseTypeId"); + if (licenseTypeId != null) { + license.setLicenseTypeDatabaseId(licenseTypeId); } - // Map OSI approved flag + // Map OSI approved flag to Quadratic enum Boolean osiApproved = getBooleanValue(licenseDbData, "osiApproved"); if (osiApproved != null) { - license.setOsiApproved(osiApproved); + license.setOSIApproved(osiApproved ? Quadratic.YES : Quadratic.NA); } return license; diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java index 0072ac34b7..e888dc817a 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/licensedb/transformer/ObligationTransformer.java @@ -10,6 +10,8 @@ package org.eclipse.sw360.rest.resourceserver.licensedb.transformer; import org.eclipse.sw360.datahandler.thrift.licenses.Obligation; +import org.eclipse.sw360.datahandler.thrift.licenses.ObligationLevel; +import org.eclipse.sw360.datahandler.thrift.licenses.ObligationType; import org.springframework.stereotype.Component; import java.util.Map; @@ -56,16 +58,24 @@ public Obligation transform(Map obligationDbData) { obligation.setText(getStringValue(obligationDbData, "text")); obligation.setTitle(getStringValue(obligationDbData, "title")); - // Map obligation type if present + // Map obligation type enum if present String type = getStringValue(obligationDbData, "type"); - if (type != null) { - obligation.setObligationType(type); + if (type != null && !type.isEmpty()) { + try { + obligation.setObligationType(ObligationType.valueOf(type.toUpperCase())); + } catch (IllegalArgumentException e) { + // Unknown obligation type - skip field + } } - // Map obligation level if present + // Map obligation level enum if present String level = getStringValue(obligationDbData, "level"); - if (level != null) { - obligation.setObligationLevel(level); + if (level != null && !level.isEmpty()) { + try { + obligation.setObligationLevel(ObligationLevel.valueOf(level.toUpperCase())); + } catch (IllegalArgumentException e) { + // Unknown obligation level - skip field + } } return obligation;