org.eclipse.lyo.oslc4j.core
oslc4j-core
diff --git a/server/lyo-server-common/pom.xml b/server/lyo-server-common/pom.xml
new file mode 100644
index 000000000..e5ff363ef
--- /dev/null
+++ b/server/lyo-server-common/pom.xml
@@ -0,0 +1,52 @@
+
+ 4.0.0
+
+ org.eclipse.lyo.oslc4j.server
+ lyo-server-build
+ 7.0.0-SNAPSHOT
+ ../pom.xml
+
+ org.eclipse.lyo.server
+ lyo-server-common
+ jar
+ Lyo :: Server :: Common
+ Common components for Lyo Server
+
+
+
+ jakarta.servlet
+ jakarta.servlet-api
+ provided
+
+
+ org.eclipse.microprofile.config
+ microprofile-config-api
+ 3.1
+ provided
+
+
+ org.slf4j
+ slf4j-api
+ provided
+
+
+
+
+ junit
+ junit
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ io.smallrye.config
+ smallrye-config
+ 3.4.1
+ test
+
+
+
diff --git a/server/lyo-server-common/src/main/java/org/eclipse/lyo/server/common/LyoAppConfiguration.java b/server/lyo-server-common/src/main/java/org/eclipse/lyo/server/common/LyoAppConfiguration.java
new file mode 100644
index 000000000..f0bd55f17
--- /dev/null
+++ b/server/lyo-server-common/src/main/java/org/eclipse/lyo/server/common/LyoAppConfiguration.java
@@ -0,0 +1,61 @@
+package org.eclipse.lyo.server.common;
+
+import jakarta.servlet.ServletContext;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+
+/**
+ * Utility class for retrieving configuration properties.
+ *
+ * This class uses MicroProfile Config (Jakarta Config) as the primary source of configuration,
+ * falling back to ServletContext init parameters if the property is not found in the Config sources.
+ */
+public class LyoAppConfiguration {
+
+ private static final Logger logger = LoggerFactory.getLogger(LyoAppConfiguration.class);
+
+ private LyoAppConfiguration() {
+ // Utility class
+ }
+
+ /**
+ * Retrieves a configuration property using MicroProfile Config and falls back to ServletContext init parameters.
+ *
+ * The search order is determined by the MicroProfile Config implementation (typically System Properties > Environment Variables > microprofile-config.properties),
+ * followed by ServletContext init parameters.
+ *
+ * @param context the ServletContext to check for fallback (can be null)
+ * @param key the configuration key
+ * @return the property value, or null if not found
+ */
+ public static String getOslcConfigProperty(ServletContext context, String key) {
+ // 1. Check MicroProfile Config
+ try {
+ Config config = ConfigProvider.getConfig();
+ Optional value = config.getOptionalValue(key, String.class);
+ if (value.isPresent()) {
+ logger.debug("Found property '{}' in MicroProfile Config", key);
+ return value.get();
+ }
+ } catch (Exception e) {
+ // ConfigProvider might fail if no implementation is available
+ logger.debug("MicroProfile Config not available or failed for key '{}': {}", key, e.getMessage());
+ }
+
+ // 2. Check Servlet Context
+ if (context != null) {
+ String initParam = context.getInitParameter(key);
+ if (initParam != null) {
+ logger.debug("Found property '{}' in ServletContext", key);
+ return initParam;
+ }
+ }
+
+ logger.debug("Property '{}' not found in configuration or ServletContext", key);
+ return null;
+ }
+}
diff --git a/server/lyo-server-common/src/test/java/org/eclipse/lyo/server/common/LyoAppConfigurationTest.java b/server/lyo-server-common/src/test/java/org/eclipse/lyo/server/common/LyoAppConfigurationTest.java
new file mode 100644
index 000000000..0000c00bd
--- /dev/null
+++ b/server/lyo-server-common/src/test/java/org/eclipse/lyo/server/common/LyoAppConfigurationTest.java
@@ -0,0 +1,63 @@
+package org.eclipse.lyo.server.common;
+
+import jakarta.servlet.ServletContext;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.when;
+
+public class LyoAppConfigurationTest {
+
+ private static final String TEST_KEY = "test.property";
+ private static final String SYSTEM_VAL = "systemValue";
+ private static final String CONTEXT_VAL = "contextValue";
+
+ @Before
+ public void setUp() {
+ System.clearProperty(TEST_KEY);
+ }
+
+ @After
+ public void tearDown() {
+ System.clearProperty(TEST_KEY);
+ }
+
+ @Test
+ public void testSystemPropertyOverride() {
+ System.setProperty(TEST_KEY, SYSTEM_VAL);
+ ServletContext context = Mockito.mock(ServletContext.class);
+ when(context.getInitParameter(TEST_KEY)).thenReturn(CONTEXT_VAL);
+
+ String value = LyoAppConfiguration.getOslcConfigProperty(context, TEST_KEY);
+ assertEquals("System property should override context param", SYSTEM_VAL, value);
+ }
+
+ @Test
+ public void testContextFallback() {
+ ServletContext context = Mockito.mock(ServletContext.class);
+ when(context.getInitParameter(TEST_KEY)).thenReturn(CONTEXT_VAL);
+
+ String value = LyoAppConfiguration.getOslcConfigProperty(context, TEST_KEY);
+ assertEquals("Should fall back to context param", CONTEXT_VAL, value);
+ }
+
+ @Test
+ public void testNotFound() {
+ ServletContext context = Mockito.mock(ServletContext.class);
+ when(context.getInitParameter(TEST_KEY)).thenReturn(null);
+
+ String value = LyoAppConfiguration.getOslcConfigProperty(context, TEST_KEY);
+ assertNull("Should return null if not found", value);
+ }
+
+ @Test
+ public void testNullContext() {
+ System.setProperty(TEST_KEY, SYSTEM_VAL);
+ String value = LyoAppConfiguration.getOslcConfigProperty(null, TEST_KEY);
+ assertEquals("Should work with null context", SYSTEM_VAL, value);
+ }
+}
diff --git a/server/pom.xml b/server/pom.xml
index d97408451..f813b3498 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -23,6 +23,7 @@
net.oauth.core-oauth-consumer-jakarta
net.oauth.core-oauth-provider-jakarta
net.oauth.core-oauth-httpclient4-jakarta
+ lyo-server-common