<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Architecture Decisions on Eclipse SW360</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/</link><description>Recent content in Architecture Decisions on Eclipse SW360</description><generator>Hugo</generator><language>en</language><atom:link href="https://eclipse.dev/sw360/docs/architecture/decisions/index.xml" rel="self" type="application/rss+xml"/><item><title>ADR Index</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/readme/</guid><description>&lt;h1 id="architecture-decision-records-adrs"&gt;Architecture Decision Records (ADRs)&lt;/h1&gt;
&lt;p&gt;This directory contains the Architecture Decision Records for SW360.&lt;/p&gt;
&lt;h2 id="adr-index"&gt;ADR Index&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ADR&lt;/th&gt;
 &lt;th&gt;Title&lt;/th&gt;
 &lt;th&gt;Status&lt;/th&gt;
 &lt;th&gt;Date&lt;/th&gt;
 &lt;th&gt;Format&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/"&gt;ADR-001&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Use Apache Thrift for Internal Services&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2014&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/"&gt;ADR-002&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Use CouchDB as Primary Database&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2014&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/"&gt;ADR-003&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Use Keycloak for Authentication&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2022&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/"&gt;ADR-004&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Migrate to Spring Boot 3.x&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2024&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/"&gt;ADR-005&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Use Apache Tomcat as Servlet Container&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2014&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/"&gt;ADR-006&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Migrate to Cloudant SDK for CouchDB Access&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2024&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/"&gt;ADR-007&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;File-Based API Response Cache for REST Endpoints&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2026&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DAR/SWOT&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-008-spring-boot-4/"&gt;ADR-008&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Upgrade to Spring Boot 4.x and Spring Security 7.x&lt;/td&gt;
 &lt;td&gt;Accepted&lt;/td&gt;
 &lt;td&gt;2026&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="templates"&gt;Templates&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Template&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/"&gt;ADR-TEMPLATE.md&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;DAR format with SWOT analysis &amp;amp; T-shirt sizing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>ADR-001: Apache Thrift for Internal Services</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/</guid><description>&lt;h1 id="decision-analysis-and-resolution-sw360-internal-rpc-framework"&gt;Decision Analysis and Resolution: SW360 Internal RPC Framework&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2014&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 10 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#option-1---restjson"&gt;Option 1 - REST/JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#option-2---soapxml"&gt;Option 2 - SOAP/XML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#option-3---apache-thrift"&gt;Option 3 - Apache Thrift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#option-4---grpcprotocol-buffers"&gt;Option 4 - gRPC/Protocol Buffers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-001-thrift/#discussion--brainstorming"&gt;Discussion &amp;amp; Brainstorming&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360 was designed as a multi-tier application for open source license compliance management with:&lt;/p&gt;</description></item><item><title>ADR-002: CouchDB as Primary Database</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/</guid><description>&lt;h1 id="decision-analysis-and-resolution-sw360-primary-database"&gt;Decision Analysis and Resolution: SW360 Primary Database&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2014&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 12 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#option-1---postgresqlmysql"&gt;Option 1 - PostgreSQL/MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#option-2---mongodb"&gt;Option 2 - MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#option-3---apache-couchdb"&gt;Option 3 - Apache CouchDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#option-4---elasticsearch"&gt;Option 4 - Elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-002-couchdb/#evolution--updates"&gt;Evolution &amp;amp; Updates&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360 manages software components, releases, projects, and licenses for open source license compliance. The data model is characterized by:&lt;/p&gt;</description></item><item><title>ADR-003: Keycloak for Authentication</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/</guid><description>&lt;h1 id="decision-analysis-and-resolution-sw360-authentication-provider"&gt;Decision Analysis and Resolution: SW360 Authentication Provider&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2022&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 12 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#option-1---spring-security-standalone"&gt;Option 1 - Spring Security Standalone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#option-2---auth0"&gt;Option 2 - Auth0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#option-3---keycloak"&gt;Option 3 - Keycloak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#option-4---okta"&gt;Option 4 - Okta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#option-5---custom-oauth2-server"&gt;Option 5 - Custom OAuth2 Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-003-keycloak/#implementation-details"&gt;Implementation Details&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360 originally used Liferay Portal&amp;rsquo;s built-in authentication, which coupled user management to the UI layer. With the migration away from Liferay toward a REST-first architecture, several challenges emerged:&lt;/p&gt;</description></item><item><title>ADR-004: Migrate to Spring Boot 3.x</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/</guid><description>&lt;h1 id="decision-analysis-and-resolution-spring-boot-version-migration"&gt;Decision Analysis and Resolution: Spring Boot Version Migration&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2024&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 10 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#option-1---stay-on-spring-boot-27x"&gt;Option 1 - Stay on Spring Boot 2.7.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#option-2---migrate-to-spring-boot-3x"&gt;Option 2 - Migrate to Spring Boot 3.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#option-3---alternative-framework-migration"&gt;Option 3 - Alternative Framework Migration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#migration-effort"&gt;Migration Effort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-004-spring-boot-3/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360&amp;rsquo;s REST API was built on Spring Boot 2.x with Spring Security 5.x. Several factors drove the need to evaluate migration:&lt;/p&gt;</description></item><item><title>ADR-005: Apache Tomcat as Servlet Container</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/</guid><description>&lt;h1 id="decision-analysis-and-resolution-sw360-servlet-container"&gt;Decision Analysis and Resolution: SW360 Servlet Container&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2014&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 8 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#option-1---apache-tomcat"&gt;Option 1 - Apache Tomcat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#option-2---eclipse-jetty"&gt;Option 2 - Eclipse Jetty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#option-3---wildflyjboss"&gt;Option 3 - WildFly/JBoss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#option-4---glassfish"&gt;Option 4 - GlassFish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#evolution"&gt;Evolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-005-tomcat/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360 was originally designed as a Liferay Portal application, which required a servlet container to host web applications. The servlet container needed to:&lt;/p&gt;</description></item><item><title>ADR-006: Cloudant SDK for CouchDB Access</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/</guid><description>&lt;h1 id="decision-analysis-and-resolution-couchdb-client-library-migration"&gt;Decision Analysis and Resolution: CouchDB Client Library Migration&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2024&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 10 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#option-1---ibm-cloudant-sdk"&gt;Option 1 - IBM Cloudant SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#option-2---apache-couchdb-java"&gt;Option 2 - Apache CouchDB-Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#option-3---ektorp-fork-community"&gt;Option 3 - Ektorp Fork (Community)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#option-4---custom-http-client"&gt;Option 4 - Custom HTTP Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#migration-path"&gt;Migration Path&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-006-cloudant-sdk/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;SW360 uses Apache CouchDB as its primary database (see ADR-002). The original CouchDB client library was &lt;strong&gt;Ektorp&lt;/strong&gt;, a Java library that provided:&lt;/p&gt;</description></item><item><title>ADR-007: File-Based API Response Cache</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/</guid><description>&lt;h1 id="decision-analysis-and-resolution-rest-api-response-caching"&gt;Decision Analysis and Resolution: REST API Response Caching&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Original Decision:&lt;/strong&gt; 2026&lt;br&gt;
&lt;strong&gt;Reformatted:&lt;/strong&gt; April 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; 12 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#option-1---spring-cacheable-in-memory"&gt;Option 1 - Spring @Cacheable (In-Memory)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#option-2---redisexternal-cache"&gt;Option 2 - Redis/External Cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#option-3---file-based-response-cache"&gt;Option 3 - File-Based Response Cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#option-4---no-caching-status-quo"&gt;Option 4 - No Caching (Status Quo)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#implementation-details"&gt;Implementation Details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-007-api-caching/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;The SW360 REST API exposes resource-intensive endpoints that aggregate large amounts of data. The most critical example is &lt;code&gt;GET /releases?allDetails=true&lt;/code&gt;, which:&lt;/p&gt;</description></item><item><title>ADR-008: Upgrade to Spring Boot 4.x and Spring Security 7.x</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-008-spring-boot-4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-008-spring-boot-4/</guid><description>&lt;h1 id="decision-analysis-and-resolution-spring-boot-4x-and-spring-security-7x-upgrade"&gt;Decision Analysis and Resolution: Spring Boot 4.x and Spring Security 7.x Upgrade&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; SW360 Architecture Team&lt;br&gt;
&lt;strong&gt;Decision Date:&lt;/strong&gt; April 2026
&lt;strong&gt;Status:&lt;/strong&gt; Accepted&lt;br&gt;
&lt;strong&gt;Supersedes:&lt;/strong&gt; ADR-004 (Spring Boot 3.x Migration)&lt;br&gt;
&lt;strong&gt;Reference:&lt;/strong&gt; &lt;a href="https://github.com/eclipse-sw360/sw360/pull/4054"&gt;eclipse-sw360/sw360#4054&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-context-and-problem-statement"&gt;1. Context and Problem Statement&lt;/h2&gt;
&lt;p&gt;Spring Boot 3.x, while still supported, is approaching its maintenance window end. Spring Boot 4.x (based on Spring Framework 7.x and Spring Security 7.x) introduces performance improvements, modern Java alignment, and security enhancements. However, the upgrade involves breaking changes in package relocations, removed deprecated APIs, and module restructuring.&lt;/p&gt;</description></item><item><title>ADR Template (DAR/SWOT)</title><link>https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/</guid><description>&lt;h1 id="adr-template-decision-analysis-and-resolution-dar"&gt;ADR Template: Decision Analysis and Resolution (DAR)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Template Version:&lt;/strong&gt; 1.0&lt;br&gt;
&lt;strong&gt;Based on:&lt;/strong&gt; ABT UI Technology Stack Decision Framework&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; SWOT Analysis + T-Shirt Sizing for Weighted Criteria Evaluation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="adr-xxx-decision-title"&gt;ADR-XXX: [Decision Title]&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Created by:&lt;/strong&gt; [Author Name]&lt;br&gt;
&lt;strong&gt;Last updated:&lt;/strong&gt; [Date]&lt;br&gt;
&lt;strong&gt;Estimated read time:&lt;/strong&gt; [X] minutes&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#background"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#goal"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#key-principles"&gt;Key Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#key-inputs-assumptions-and-restrictions"&gt;Key Inputs, Assumptions and Restrictions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#options-analysis"&gt;Options Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#option-1---name"&gt;Option 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#option-2---name"&gt;Option 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#option-3---name"&gt;Option 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#criteria-for-making-a-decision"&gt;Criteria for Making a Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#final-decision"&gt;Final Decision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#contributors"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclipse.dev/sw360/docs/architecture/decisions/adr-template/#discussion--brainstorming"&gt;Discussion &amp;amp; Brainstorming&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;[Describe the experience and context that led to this decision point. Include:]&lt;/p&gt;</description></item></channel></rss>