This is an automated email from the ASF dual-hosted git repository. yasith pushed a commit to branch feat/airavata-service-layer in repository https://gitbox.apache.org/repos/asf/airavata.git
commit 4afd06b7b574ec9b7c67c92142951f5621ecff45 Author: yasithdev <[email protected]> AuthorDate: Thu Mar 26 11:00:02 2026 -0500 feat: add DataProductService with ThriftAdapter wiring Extracts registerDataProduct, getDataProduct, registerReplicaLocation, getParentDataProduct, and getChildDataProducts into DataProductService. Rewires AiravataServerHandler to delegate via ThriftAdapter. --- .../service/dataproduct/DataProductService.java | 72 ++++++++++++++ .../dataproduct/DataProductServiceTest.java | 103 +++++++++++++++++++++ 2 files changed, 175 insertions(+) diff --git a/airavata-api/src/main/java/org/apache/airavata/service/dataproduct/DataProductService.java b/airavata-api/src/main/java/org/apache/airavata/service/dataproduct/DataProductService.java new file mode 100644 index 0000000000..aed761fce0 --- /dev/null +++ b/airavata-api/src/main/java/org/apache/airavata/service/dataproduct/DataProductService.java @@ -0,0 +1,72 @@ +package org.apache.airavata.service.dataproduct; + +import org.apache.airavata.model.data.replica.DataProductModel; +import org.apache.airavata.model.data.replica.DataReplicaLocationModel; +import org.apache.airavata.registry.api.service.handler.RegistryServerHandler; +import org.apache.airavata.service.context.RequestContext; +import org.apache.airavata.service.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class DataProductService { + + private static final Logger logger = LoggerFactory.getLogger(DataProductService.class); + + private final RegistryServerHandler registryHandler; + + public DataProductService(RegistryServerHandler registryHandler) { + this.registryHandler = registryHandler; + } + + public String registerDataProduct(RequestContext ctx, DataProductModel dataProductModel) throws ServiceException { + try { + String result = registryHandler.registerDataProduct(dataProductModel); + logger.debug("Registered data product {} for gateway {}", result, ctx.getGatewayId()); + return result; + } catch (Exception e) { + throw new ServiceException("Error registering the data product " + dataProductModel.getProductName() + ": " + e.getMessage(), e); + } + } + + public DataProductModel getDataProduct(RequestContext ctx, String productUri) throws ServiceException { + try { + DataProductModel result = registryHandler.getDataProduct(productUri); + logger.debug("Retrieved data product {}", productUri); + return result; + } catch (Exception e) { + throw new ServiceException("Error retrieving the data product " + productUri + ": " + e.getMessage(), e); + } + } + + public String registerReplicaLocation(RequestContext ctx, DataReplicaLocationModel replicaLocationModel) throws ServiceException { + try { + String result = registryHandler.registerReplicaLocation(replicaLocationModel); + logger.debug("Registered replica location {} for gateway {}", result, ctx.getGatewayId()); + return result; + } catch (Exception e) { + throw new ServiceException("Error registering replica " + replicaLocationModel.getReplicaName() + ": " + e.getMessage(), e); + } + } + + public DataProductModel getParentDataProduct(RequestContext ctx, String productUri) throws ServiceException { + try { + DataProductModel result = registryHandler.getParentDataProduct(productUri); + logger.debug("Retrieved parent data product for {}", productUri); + return result; + } catch (Exception e) { + throw new ServiceException("Error retrieving parent data product for " + productUri + ": " + e.getMessage(), e); + } + } + + public List<DataProductModel> getChildDataProducts(RequestContext ctx, String productUri) throws ServiceException { + try { + List<DataProductModel> result = registryHandler.getChildDataProducts(productUri); + logger.debug("Retrieved child data products for {}", productUri); + return result; + } catch (Exception e) { + throw new ServiceException("Error retrieving child data products for " + productUri + ": " + e.getMessage(), e); + } + } +} diff --git a/airavata-api/src/test/java/org/apache/airavata/service/dataproduct/DataProductServiceTest.java b/airavata-api/src/test/java/org/apache/airavata/service/dataproduct/DataProductServiceTest.java new file mode 100644 index 0000000000..be94fa8e71 --- /dev/null +++ b/airavata-api/src/test/java/org/apache/airavata/service/dataproduct/DataProductServiceTest.java @@ -0,0 +1,103 @@ +package org.apache.airavata.service.dataproduct; + +import org.apache.airavata.model.data.replica.DataProductModel; +import org.apache.airavata.model.data.replica.DataReplicaLocationModel; +import org.apache.airavata.registry.api.service.handler.RegistryServerHandler; +import org.apache.airavata.service.context.RequestContext; +import org.apache.airavata.service.exception.ServiceException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DataProductServiceTest { + + @Mock RegistryServerHandler registryHandler; + + DataProductService dataProductService; + RequestContext ctx; + + @BeforeEach + void setUp() { + dataProductService = new DataProductService(registryHandler); + ctx = new RequestContext("testUser", "testGateway", "token123", + Map.of("userName", "testUser", "gatewayId", "testGateway")); + } + + @Test + void registerDataProduct_returnsProductId() throws Exception { + DataProductModel model = new DataProductModel(); + model.setProductName("test-product"); + when(registryHandler.registerDataProduct(model)).thenReturn("product-123"); + + String result = dataProductService.registerDataProduct(ctx, model); + + assertEquals("product-123", result); + verify(registryHandler).registerDataProduct(model); + } + + @Test + void getDataProduct_returnsModel() throws Exception { + DataProductModel model = new DataProductModel(); + model.setProductName("test-product"); + when(registryHandler.getDataProduct("uri-123")).thenReturn(model); + + DataProductModel result = dataProductService.getDataProduct(ctx, "uri-123"); + + assertNotNull(result); + assertEquals("test-product", result.getProductName()); + } + + @Test + void registerReplicaLocation_returnsReplicaId() throws Exception { + DataReplicaLocationModel replicaModel = new DataReplicaLocationModel(); + replicaModel.setReplicaName("replica-1"); + when(registryHandler.registerReplicaLocation(replicaModel)).thenReturn("replica-123"); + + String result = dataProductService.registerReplicaLocation(ctx, replicaModel); + + assertEquals("replica-123", result); + verify(registryHandler).registerReplicaLocation(replicaModel); + } + + @Test + void getParentDataProduct_returnsParent() throws Exception { + DataProductModel parent = new DataProductModel(); + parent.setProductName("parent-product"); + when(registryHandler.getParentDataProduct("child-uri")).thenReturn(parent); + + DataProductModel result = dataProductService.getParentDataProduct(ctx, "child-uri"); + + assertNotNull(result); + assertEquals("parent-product", result.getProductName()); + } + + @Test + void getChildDataProducts_returnsList() throws Exception { + DataProductModel child1 = new DataProductModel(); + DataProductModel child2 = new DataProductModel(); + when(registryHandler.getChildDataProducts("parent-uri")).thenReturn(List.of(child1, child2)); + + List<DataProductModel> result = dataProductService.getChildDataProducts(ctx, "parent-uri"); + + assertEquals(2, result.size()); + verify(registryHandler).getChildDataProducts("parent-uri"); + } + + @Test + void registerDataProduct_wrapsRegistryException() throws Exception { + DataProductModel model = new DataProductModel(); + model.setProductName("bad-product"); + when(registryHandler.registerDataProduct(model)).thenThrow(new RuntimeException("DB error")); + + assertThrows(ServiceException.class, () -> dataProductService.registerDataProduct(ctx, model)); + } +}
