From ce67f47e245ca90fdc57c93690c1141e9829696d Mon Sep 17 00:00:00 2001 From: PujaDeshmukh17 Date: Mon, 20 Jul 2026 14:01:08 +0530 Subject: [PATCH 1/5] Adding error message for unsupported roles in properties file --- .../src/main/resources/messages.properties | 1 + .../sap/cds/sdm/service/SDMServiceImpl.java | 2 +- .../SDMReadAttachmentsHandlerTest.java | 49 +++++++++++++++++++ .../cds/sdm/service/SDMServiceImplTest.java | 20 ++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties b/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties index a6963a4a2..76475650f 100644 --- a/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties +++ b/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties @@ -1 +1,2 @@ SDM.maxCountErrorMessage = Maximum number of attachments reached in English +SDM.userNotAuthorisedError = You do not have the required permissions to upload attachments. Please contact your administrator for access updated message for translation. diff --git a/sdm/src/main/java/com/sap/cds/sdm/service/SDMServiceImpl.java b/sdm/src/main/java/com/sap/cds/sdm/service/SDMServiceImpl.java index faa3ca9bb..15699f182 100644 --- a/sdm/src/main/java/com/sap/cds/sdm/service/SDMServiceImpl.java +++ b/sdm/src/main/java/com/sap/cds/sdm/service/SDMServiceImpl.java @@ -354,7 +354,7 @@ public JSONObject getObject(String objectId, SDMCredentials sdmCredentials, bool try (var response = (CloseableHttpResponse) httpClient.execute(getObjectRequest)) { if (response.getStatusLine().getStatusCode() != 200) { if (response.getStatusLine().getStatusCode() == 403) { - throw new ServiceException(SDMConstants.USER_NOT_AUTHORISED_ERROR); + throw new ServiceException(SDMUtils.getErrorMessage("USER_NOT_AUTHORISED_ERROR")); } return null; } diff --git a/sdm/src/test/java/unit/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandlerTest.java b/sdm/src/test/java/unit/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandlerTest.java index cf16d73d8..a4f1ed451 100644 --- a/sdm/src/test/java/unit/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandlerTest.java +++ b/sdm/src/test/java/unit/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandlerTest.java @@ -1,11 +1,15 @@ package unit.com.sap.cds.sdm.handler.applicationservice; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import com.sap.cds.ql.Select; import com.sap.cds.ql.cqn.CqnSelect; import com.sap.cds.reflect.*; +import com.sap.cds.sdm.caching.CacheConfig; +import com.sap.cds.sdm.caching.ErrorMessageKey; import com.sap.cds.sdm.constants.SDMConstants; +import com.sap.cds.sdm.constants.SDMErrorMessages; import com.sap.cds.sdm.handler.TokenHandler; import com.sap.cds.sdm.handler.applicationservice.SDMReadAttachmentsHandler; import com.sap.cds.sdm.model.RepoValue; @@ -14,9 +18,13 @@ import com.sap.cds.sdm.utilities.SDMUtils; import com.sap.cds.services.cds.CdsReadEventContext; import com.sap.cds.services.persistence.PersistenceService; +import com.sap.cds.services.request.ParameterInfo; import com.sap.cds.services.request.UserInfo; +import com.sap.cds.services.runtime.CdsRuntime; import java.io.IOException; +import java.lang.reflect.Method; import java.util.*; +import org.ehcache.Cache; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -291,4 +299,45 @@ void testProcessBefore_SingleEntityRead_NoDelete() throws IOException { verify(context).setCqn(any(CqnSelect.class)); } } + + @Test + void testSetErrorMessagesInCache_StoresLocalizedString() throws Exception { + CdsRuntime cdsRuntime = Mockito.mock(CdsRuntime.class); + ParameterInfo paramInfo = Mockito.mock(ParameterInfo.class); + when(context.getCdsRuntime()).thenReturn(cdsRuntime); + when(context.getParameterInfo()).thenReturn(paramInfo); + when(paramInfo.getLocale()).thenReturn(Locale.GERMAN); + + // Return a German translation only for the userNotAuthorisedError key; + // all other keys return themselves (no translation found), triggering the English fallback. + String germanTranslation = + "Sie verfügen nicht über die erforderlichen Berechtigungen" + + " zum Hochladen von Anhängen. Bitte wenden Sie sich an Ihren Administrator."; + when(cdsRuntime.getLocalizedMessage( + eq("SDM.userNotAuthorisedError"), isNull(), eq(Locale.GERMAN))) + .thenReturn(germanTranslation); + when(cdsRuntime.getLocalizedMessage( + argThat(k -> k != null && !k.equals("SDM.userNotAuthorisedError")), isNull(), any())) + .thenAnswer(inv -> inv.getArgument(0)); + + CacheConfig.initializeCache(); + + // Clear any previously cached flag so the method actually runs + Cache errorMessageCache = CacheConfig.getErrorMessageCache(); + errorMessageCache.remove(new ErrorMessageKey("localizedErrorMessagesSetInCache")); + + // Invoke the private method via reflection + Method method = + SDMReadAttachmentsHandler.class.getDeclaredMethod( + "setErrorMessagesInCache", CdsReadEventContext.class); + method.setAccessible(true); + method.invoke(sdmReadAttachmentsHandler, context); + + // The cache should now hold the German translation, not the English constant + String cached = SDMUtils.getErrorMessage("USER_NOT_AUTHORISED_ERROR"); + assertEquals(germanTranslation, cached); + + // Verify the English fallback is NOT stored for this key + assertNotEquals(SDMErrorMessages.USER_NOT_AUTHORISED_ERROR, cached); + } } diff --git a/sdm/src/test/java/unit/com/sap/cds/sdm/service/SDMServiceImplTest.java b/sdm/src/test/java/unit/com/sap/cds/sdm/service/SDMServiceImplTest.java index ac569791e..c3e687397 100644 --- a/sdm/src/test/java/unit/com/sap/cds/sdm/service/SDMServiceImplTest.java +++ b/sdm/src/test/java/unit/com/sap/cds/sdm/service/SDMServiceImplTest.java @@ -1512,6 +1512,26 @@ public void testGetObject_Failure() throws IOException { assertNull(objectInfo); } + @Test + public void testGetObject_403_ThrowsServiceExceptionViaUtils() throws IOException { + String objectId = "objectId403"; + SDMServiceImpl sdmServiceImpl = new SDMServiceImpl(binding, connectionPool, tokenHandler); + SDMCredentials sdmCredentials = new SDMCredentials(); + sdmCredentials.setUrl("http://example.com/"); + + when(tokenHandler.getHttpClient(any(), any(), any(), any())).thenReturn(httpClient); + when(httpClient.execute(any(HttpGet.class))).thenReturn(response); + when(response.getStatusLine()).thenReturn(statusLine); + when(statusLine.getStatusCode()).thenReturn(403); + + ServiceException exception = + assertThrows( + ServiceException.class, + () -> sdmServiceImpl.getObject(objectId, sdmCredentials, false)); + + assertEquals(SDMUtils.getErrorMessage("USER_NOT_AUTHORISED_ERROR"), exception.getMessage()); + } + @Test public void testGetObjectThrowsServiceExceptionOnIOException() throws IOException { SDMCredentials mockSdmCredentials = mock(SDMCredentials.class); From 0bd58e7994ba592ee7e4763442e907e61501a234 Mon Sep 17 00:00:00 2001 From: PujaDeshmukh17 <126158971+PujaDeshmukh17@users.noreply.github.com> Date: Mon, 20 Jul 2026 14:11:34 +0530 Subject: [PATCH 2/5] Update messages.properties --- .../demoapp/srv/src/main/resources/messages.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties b/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties index 76475650f..a6963a4a2 100644 --- a/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties +++ b/app/single-tenant/personal-space/demoapp/srv/src/main/resources/messages.properties @@ -1,2 +1 @@ SDM.maxCountErrorMessage = Maximum number of attachments reached in English -SDM.userNotAuthorisedError = You do not have the required permissions to upload attachments. Please contact your administrator for access updated message for translation. From ccf95c62e9ba5ba042be8dca92a83c10f767bb3e Mon Sep 17 00:00:00 2001 From: PujaDeshmukh17 Date: Mon, 20 Jul 2026 14:17:00 +0530 Subject: [PATCH 3/5] sdm version change --- app/single-tenant/personal-space/demoapp/db/pom.xml | 2 +- app/single-tenant/personal-space/demoapp/srv/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/single-tenant/personal-space/demoapp/db/pom.xml b/app/single-tenant/personal-space/demoapp/db/pom.xml index 7a74659e1..dd35aa512 100644 --- a/app/single-tenant/personal-space/demoapp/db/pom.xml +++ b/app/single-tenant/personal-space/demoapp/db/pom.xml @@ -16,7 +16,7 @@ com.sap.cds sdm - 1.0.0-RC1 + 1.10.2-SNAPSHOT diff --git a/app/single-tenant/personal-space/demoapp/srv/pom.xml b/app/single-tenant/personal-space/demoapp/srv/pom.xml index 1a18bebd8..dddee51a5 100644 --- a/app/single-tenant/personal-space/demoapp/srv/pom.xml +++ b/app/single-tenant/personal-space/demoapp/srv/pom.xml @@ -18,7 +18,7 @@ com.sap.cds sdm - 1.0.0-RC1 + 1.10.2-SNAPSHOT From 8e9ad07f9d9dc5796982dbf0faa936d01ea450db Mon Sep 17 00:00:00 2001 From: PujaDeshmukh17 Date: Mon, 20 Jul 2026 14:26:58 +0530 Subject: [PATCH 4/5] updating sdm version --- app/single-tenant/personal-space/demoapp/db/pom.xml | 2 +- app/single-tenant/personal-space/demoapp/srv/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/single-tenant/personal-space/demoapp/db/pom.xml b/app/single-tenant/personal-space/demoapp/db/pom.xml index dd35aa512..fd7082576 100644 --- a/app/single-tenant/personal-space/demoapp/db/pom.xml +++ b/app/single-tenant/personal-space/demoapp/db/pom.xml @@ -16,7 +16,7 @@ com.sap.cds sdm - 1.10.2-SNAPSHOT + 1.10.1-SNAPSHOT diff --git a/app/single-tenant/personal-space/demoapp/srv/pom.xml b/app/single-tenant/personal-space/demoapp/srv/pom.xml index dddee51a5..2a91cb155 100644 --- a/app/single-tenant/personal-space/demoapp/srv/pom.xml +++ b/app/single-tenant/personal-space/demoapp/srv/pom.xml @@ -18,7 +18,7 @@ com.sap.cds sdm - 1.10.2-SNAPSHOT + 1.10.1-SNAPSHOT From 433139ba53f1390bda91a22dc459460301e0bfc5 Mon Sep 17 00:00:00 2001 From: PujaDeshmukh17 Date: Mon, 20 Jul 2026 20:13:28 +0530 Subject: [PATCH 5/5] Reverting sdm version --- app/single-tenant/personal-space/demoapp/db/pom.xml | 2 +- app/single-tenant/personal-space/demoapp/srv/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/single-tenant/personal-space/demoapp/db/pom.xml b/app/single-tenant/personal-space/demoapp/db/pom.xml index fd7082576..7a74659e1 100644 --- a/app/single-tenant/personal-space/demoapp/db/pom.xml +++ b/app/single-tenant/personal-space/demoapp/db/pom.xml @@ -16,7 +16,7 @@ com.sap.cds sdm - 1.10.1-SNAPSHOT + 1.0.0-RC1 diff --git a/app/single-tenant/personal-space/demoapp/srv/pom.xml b/app/single-tenant/personal-space/demoapp/srv/pom.xml index 2a91cb155..1a18bebd8 100644 --- a/app/single-tenant/personal-space/demoapp/srv/pom.xml +++ b/app/single-tenant/personal-space/demoapp/srv/pom.xml @@ -18,7 +18,7 @@ com.sap.cds sdm - 1.10.1-SNAPSHOT + 1.0.0-RC1