From 94c2a3bb21c6ea8ddc4552acb23b7b043578e601 Mon Sep 17 00:00:00 2001 From: Marvin Lindner Date: Tue, 16 Jun 2026 09:08:45 +0200 Subject: [PATCH 1/3] move handler to proper package --- .../feature/aicore/core/AICoreServiceConfiguration.java | 2 ++ .../aicore/core/{ => handler}/AICoreSetupHandler.java | 9 ++++++--- .../core/{ => handler}/MockAICoreSetupHandler.java | 7 +++---- 3 files changed, 11 insertions(+), 7 deletions(-) rename cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/{ => handler}/AICoreSetupHandler.java (95%) rename cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/{ => handler}/MockAICoreSetupHandler.java (87%) diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreServiceConfiguration.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreServiceConfiguration.java index 2b94030..202ed8d 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreServiceConfiguration.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreServiceConfiguration.java @@ -9,10 +9,12 @@ import com.sap.ai.sdk.core.client.ResourceGroupApi; import com.sap.cds.feature.aicore.api.AICoreService; import com.sap.cds.feature.aicore.core.handler.AICoreApiHandler; +import com.sap.cds.feature.aicore.core.handler.AICoreSetupHandler; import com.sap.cds.feature.aicore.core.handler.ActionHandler; import com.sap.cds.feature.aicore.core.handler.ConfigurationHandler; import com.sap.cds.feature.aicore.core.handler.DeploymentHandler; import com.sap.cds.feature.aicore.core.handler.MockAICoreApiHandler; +import com.sap.cds.feature.aicore.core.handler.MockAICoreSetupHandler; import com.sap.cds.feature.aicore.core.handler.MockEntityHandler; import com.sap.cds.feature.aicore.core.handler.ResourceGroupHandler; import com.sap.cds.services.environment.CdsProperties; diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreSetupHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/AICoreSetupHandler.java similarity index 95% rename from cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreSetupHandler.java rename to cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/AICoreSetupHandler.java index 57a56ac..1c07e5f 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/AICoreSetupHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/AICoreSetupHandler.java @@ -1,10 +1,13 @@ /* * © 2026 SAP SE or an SAP affiliate company and cds-ai contributors. */ -package com.sap.cds.feature.aicore.core; +package com.sap.cds.feature.aicore.core.handler; import com.sap.ai.sdk.core.model.BckndResourceGroup; import com.sap.ai.sdk.core.model.BckndResourceGroupList; +import com.sap.cds.feature.aicore.core.AICoreClients; +import com.sap.cds.feature.aicore.core.AICoreConfig; +import com.sap.cds.feature.aicore.core.DeploymentResolver; import com.sap.cds.services.ErrorStatuses; import com.sap.cds.services.ServiceException; import com.sap.cds.services.handler.EventHandler; @@ -33,7 +36,7 @@ public AICoreSetupHandler(AICoreClients clients, DeploymentResolver resolver) { this.resolver = resolver; } - @After(event = DeploymentService.EVENT_SUBSCRIBE) + @After @HandlerOrder(HandlerOrder.LATE) public void afterSubscribe(SubscribeEventContext context) { String tenantId = context.getTenant(); @@ -50,7 +53,7 @@ public void afterSubscribe(SubscribeEventContext context) { } } - @Before(event = DeploymentService.EVENT_UNSUBSCRIBE) + @Before @HandlerOrder(HandlerOrder.EARLY) public void beforeUnsubscribe(UnsubscribeEventContext context) { String tenantId = context.getTenant(); diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/MockAICoreSetupHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockAICoreSetupHandler.java similarity index 87% rename from cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/MockAICoreSetupHandler.java rename to cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockAICoreSetupHandler.java index 77a0983..bdcf880 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/MockAICoreSetupHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockAICoreSetupHandler.java @@ -1,9 +1,8 @@ /* * © 2026 SAP SE or an SAP affiliate company and cds-ai contributors. */ -package com.sap.cds.feature.aicore.core; +package com.sap.cds.feature.aicore.core.handler; -import com.sap.cds.feature.aicore.core.handler.MockAICoreApiHandler; import com.sap.cds.services.handler.EventHandler; import com.sap.cds.services.handler.annotations.After; import com.sap.cds.services.handler.annotations.Before; @@ -26,7 +25,7 @@ public MockAICoreSetupHandler(MockAICoreApiHandler mockHandler) { this.mockHandler = mockHandler; } - @After(event = DeploymentService.EVENT_SUBSCRIBE) + @After @HandlerOrder(HandlerOrder.LATE) public void afterSubscribe(SubscribeEventContext context) { String tenantId = context.getTenant(); @@ -35,7 +34,7 @@ public void afterSubscribe(SubscribeEventContext context) { logger.info("Mock created in-memory resource group for tenant {}", tenantId); } - @Before(event = DeploymentService.EVENT_UNSUBSCRIBE) + @Before @HandlerOrder(HandlerOrder.EARLY) public void beforeUnsubscribe(UnsubscribeEventContext context) { String tenantId = context.getTenant(); From 6fddf9e6003943b5535c0ffdeb7ec081bfc9dc18 Mon Sep 17 00:00:00 2001 From: Marvin Lindner Date: Tue, 16 Jun 2026 09:09:12 +0200 Subject: [PATCH 2/3] cleanup not relevant params in Before/After annotation --- .../core/handler/ConfigurationHandler.java | 2 +- .../core/handler/DeploymentHandler.java | 4 ++-- .../core/handler/MockEntityHandler.java | 21 +++++++++---------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/ConfigurationHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/ConfigurationHandler.java index d7a60df..bf4e1d8 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/ConfigurationHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/ConfigurationHandler.java @@ -75,7 +75,7 @@ public void onRead(CdsReadEventContext context) { } } - @On(entity = Configurations_.CDS_NAME) + @On public void onCreate(CdsCreateEventContext context, List entries) { List> results = new ArrayList<>(); diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/DeploymentHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/DeploymentHandler.java index 6e21697..4657bc4 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/DeploymentHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/DeploymentHandler.java @@ -69,7 +69,7 @@ public void onRead(CdsReadEventContext context) { } } - @On(entity = Deployments_.CDS_NAME) + @On public void onCreate(CdsCreateEventContext context, List entries) { List> results = new ArrayList<>(); @@ -94,7 +94,7 @@ public void onCreate(CdsCreateEventContext context, List entries) { context.setResult(results); } - @On(entity = Deployments_.CDS_NAME) + @On public void onUpdate(CdsUpdateEventContext context, List entries) { if (entries.isEmpty()) { throw new ServiceException(ErrorStatuses.BAD_REQUEST, "No update payload provided"); diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java index cef5666..c7483e9 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java @@ -15,7 +15,6 @@ import com.sap.cds.services.cds.CdsDeleteEventContext; import com.sap.cds.services.cds.CdsReadEventContext; import com.sap.cds.services.cds.CdsUpdateEventContext; -import com.sap.cds.services.cds.CqnService; import com.sap.cds.services.handler.EventHandler; import com.sap.cds.services.handler.annotations.On; import com.sap.cds.services.handler.annotations.ServiceName; @@ -34,7 +33,7 @@ public class MockEntityHandler implements EventHandler { // --- Resource Groups --- - @On(event = CqnService.EVENT_READ, entity = AICoreService.RESOURCE_GROUPS) + @On(entity = AICoreService.RESOURCE_GROUPS) public void readResourceGroups(CdsReadEventContext context) { CqnSelect select = context.getCqn(); CdsModel model = context.getModel(); @@ -50,7 +49,7 @@ public void readResourceGroups(CdsReadEventContext context) { } } - @On(event = CqnService.EVENT_CREATE, entity = AICoreService.RESOURCE_GROUPS) + @On(entity = AICoreService.RESOURCE_GROUPS) public void createResourceGroups(CdsCreateEventContext context) { CqnInsert insert = context.getCqn(); List> results = new ArrayList<>(); @@ -65,7 +64,7 @@ public void createResourceGroups(CdsCreateEventContext context) { context.setResult(results); } - @On(event = CqnService.EVENT_UPDATE, entity = AICoreService.RESOURCE_GROUPS) + @On(entity = AICoreService.RESOURCE_GROUPS) public void updateResourceGroups(CdsUpdateEventContext context) { CqnUpdate update = context.getCqn(); CdsModel model = context.getModel(); @@ -81,7 +80,7 @@ public void updateResourceGroups(CdsUpdateEventContext context) { context.setResult(List.of(CdsData.create(existing))); } - @On(event = CqnService.EVENT_DELETE, entity = AICoreService.RESOURCE_GROUPS) + @On(entity = AICoreService.RESOURCE_GROUPS) public void deleteResourceGroups(CdsDeleteEventContext context) { CqnDelete delete = context.getCqn(); CdsModel model = context.getModel(); @@ -94,7 +93,7 @@ public void deleteResourceGroups(CdsDeleteEventContext context) { // --- Deployments --- - @On(event = CqnService.EVENT_READ, entity = AICoreService.DEPLOYMENTS) + @On(entity = AICoreService.DEPLOYMENTS) public void readDeployments(CdsReadEventContext context) { CqnSelect select = context.getCqn(); CdsModel model = context.getModel(); @@ -110,7 +109,7 @@ public void readDeployments(CdsReadEventContext context) { } } - @On(event = CqnService.EVENT_CREATE, entity = AICoreService.DEPLOYMENTS) + @On(entity = AICoreService.DEPLOYMENTS) public void createDeployments(CdsCreateEventContext context) { CqnInsert insert = context.getCqn(); List> results = new ArrayList<>(); @@ -125,7 +124,7 @@ public void createDeployments(CdsCreateEventContext context) { context.setResult(results); } - @On(event = CqnService.EVENT_UPDATE, entity = AICoreService.DEPLOYMENTS) + @On(entity = AICoreService.DEPLOYMENTS) public void updateDeployments(CdsUpdateEventContext context) { CqnUpdate update = context.getCqn(); CdsModel model = context.getModel(); @@ -141,7 +140,7 @@ public void updateDeployments(CdsUpdateEventContext context) { context.setResult(List.of(CdsData.create(existing))); } - @On(event = CqnService.EVENT_DELETE, entity = AICoreService.DEPLOYMENTS) + @On(entity = AICoreService.DEPLOYMENTS) public void deleteDeployments(CdsDeleteEventContext context) { CqnDelete delete = context.getCqn(); CdsModel model = context.getModel(); @@ -154,7 +153,7 @@ public void deleteDeployments(CdsDeleteEventContext context) { // --- Configurations --- - @On(event = CqnService.EVENT_READ, entity = AICoreService.CONFIGURATIONS) + @On(entity = AICoreService.CONFIGURATIONS) public void readConfigurations(CdsReadEventContext context) { CqnSelect select = context.getCqn(); CdsModel model = context.getModel(); @@ -170,7 +169,7 @@ public void readConfigurations(CdsReadEventContext context) { } } - @On(event = CqnService.EVENT_CREATE, entity = AICoreService.CONFIGURATIONS) + @On(entity = AICoreService.CONFIGURATIONS) public void createConfigurations(CdsCreateEventContext context) { CqnInsert insert = context.getCqn(); List> results = new ArrayList<>(); From 80748f088d771ba97e51aa18913c7938a155e541 Mon Sep 17 00:00:00 2001 From: Marvin Lindner Date: Tue, 16 Jun 2026 10:05:21 +0200 Subject: [PATCH 3/3] fix local test --- .../aicore/core/handler/MockEntityHandler.java | 16 ++++++++++++++-- .../aicore/core/AICoreSetupHandlerTest.java | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java index c7483e9..2ac76ab 100644 --- a/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java +++ b/cds-feature-ai-core/src/main/java/com/sap/cds/feature/aicore/core/handler/MockEntityHandler.java @@ -5,6 +5,7 @@ import com.sap.cds.CdsData; import com.sap.cds.feature.aicore.api.AICoreService; +import com.sap.cds.ql.cqn.AnalysisResult; import com.sap.cds.ql.cqn.CqnAnalyzer; import com.sap.cds.ql.cqn.CqnDelete; import com.sap.cds.ql.cqn.CqnInsert; @@ -38,14 +39,25 @@ public void readResourceGroups(CdsReadEventContext context) { CqnSelect select = context.getCqn(); CdsModel model = context.getModel(); CqnAnalyzer analyzer = CqnAnalyzer.create(model); - Map keys = analyzer.analyze(select).targetKeys(); + AnalysisResult analysis = analyzer.analyze(select); + Map keys = analysis.targetKeys(); String id = (String) keys.get("resourceGroupId"); if (id != null) { Map rg = resourceGroups.get(id); context.setResult(rg != null ? List.of(rg) : List.of()); } else { - context.setResult(List.copyOf(resourceGroups.values())); + Map values = analysis.targetValues(); + String tenantId = (String) values.get("tenantId"); + if (tenantId != null) { + List> filtered = + resourceGroups.values().stream() + .filter(rg -> tenantId.equals(rg.get("tenantId"))) + .toList(); + context.setResult(filtered); + } else { + context.setResult(List.copyOf(resourceGroups.values())); + } } } diff --git a/cds-feature-ai-core/src/test/java/com/sap/cds/feature/aicore/core/AICoreSetupHandlerTest.java b/cds-feature-ai-core/src/test/java/com/sap/cds/feature/aicore/core/AICoreSetupHandlerTest.java index a379857..9233690 100644 --- a/cds-feature-ai-core/src/test/java/com/sap/cds/feature/aicore/core/AICoreSetupHandlerTest.java +++ b/cds-feature-ai-core/src/test/java/com/sap/cds/feature/aicore/core/AICoreSetupHandlerTest.java @@ -18,6 +18,7 @@ import com.sap.ai.sdk.core.client.ResourceGroupApi; import com.sap.ai.sdk.core.model.BckndResourceGroup; import com.sap.ai.sdk.core.model.BckndResourceGroupList; +import com.sap.cds.feature.aicore.core.handler.AICoreSetupHandler; import com.sap.cds.services.ServiceException; import com.sap.cds.services.mt.UnsubscribeEventContext; import com.sap.cloud.sdk.services.openapi.apache.core.OpenApiRequestException;