diff --git a/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetDetails.java b/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetDetails.java new file mode 100644 index 0000000000000000000000000000000000000000..1bad22c7cdd52a19ece3b3174d79a63206c42d5d --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetDetails.java @@ -0,0 +1,21 @@ +package org.opengroup.osdu.core.common.model.status; + +import lombok.Data; + +@Data +public class DatasetDetails { + + private String kind; + private Properties properties; + + @Data + public class Properties { + private String correlationId; + private String datasetId; + private String datasetVersionId; + private DatasetType datasetType; + private int recordCount; + private String timestamp; + } + +} diff --git a/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetType.java b/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetType.java new file mode 100644 index 0000000000000000000000000000000000000000..251ea2cab4204f0e38dd18807d7fd349d8846283 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/model/status/DatasetType.java @@ -0,0 +1,7 @@ +package org.opengroup.osdu.core.common.model.status; + +public enum DatasetType { + + FILE, FILE_COLLECTION; + +} diff --git a/src/main/java/org/opengroup/osdu/core/common/model/status/Status.java b/src/main/java/org/opengroup/osdu/core/common/model/status/Status.java new file mode 100644 index 0000000000000000000000000000000000000000..28fd63c78527abe02d25812f81ab868a25992810 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/model/status/Status.java @@ -0,0 +1,5 @@ +package org.opengroup.osdu.core.common.model.status; + +public enum Status { + SUCCESS, FAILED, IN_PROGRESS, SKIPPED, PARTIAL_SUCCESS; +} diff --git a/src/main/java/org/opengroup/osdu/core/common/model/status/StatusDetails.java b/src/main/java/org/opengroup/osdu/core/common/model/status/StatusDetails.java new file mode 100644 index 0000000000000000000000000000000000000000..17ed5db3ff8ba09021ee0306a1410d582e55f336 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/model/status/StatusDetails.java @@ -0,0 +1,25 @@ +package org.opengroup.osdu.core.common.model.status; + +import lombok.Data; + +@Data +public class StatusDetails { + + private String kind; + private Properties properties; + + @Data + public class Properties { + + private String correlationId; + private String recordId; + private String recordIdVersion; + private String stage; + private Status status; + private String message; + private int errorCode; + private String userEmail; + private String timestamp; + + } +} diff --git a/src/main/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilder.java b/src/main/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..f98e4a885d5b197bbcf483af08414b621dfaa3a4 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilder.java @@ -0,0 +1,70 @@ +package org.opengroup.osdu.core.common.status; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.joda.time.DateTime; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.status.DatasetDetails; +import org.opengroup.osdu.core.common.model.status.DatasetDetails.Properties; +import org.opengroup.osdu.core.common.model.status.DatasetType; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; + +@Lazy +@Component +@RequiredArgsConstructor +public class DatasetDetailsRequestBuilder { + + private static final String KIND = "datasetDetails"; + + private final DpsHeaders dpsHeaders; + private final ObjectMapper mapper; + + public DatasetDetails buildDatasetDetails(String datasetId, DatasetType datasetType, String datasetVersionId, + int recordCount) { + Properties properties = buildDatasetDetailsProperties(datasetId, datasetType, datasetVersionId, recordCount); + DatasetDetails datasetDetails = new DatasetDetails(); + datasetDetails.setKind(KIND); + datasetDetails.setProperties(properties); + return datasetDetails; + } + + public String createDatasetDetailsMessage(String datasetId, DatasetType datasetType, String datasetVersionId, + int recordCount) throws JsonProcessingException { + List statusDetailsList = new ArrayList<>(); + DatasetDetails datasetDetails = buildDatasetDetails(datasetId, datasetType, datasetVersionId, recordCount); + statusDetailsList.add(datasetDetails); + + return mapper.writeValueAsString(statusDetailsList); + } + + public Map createAttributesMap() { + Map attributesMap = new HashMap<>(); + + attributesMap.put(DpsHeaders.CORRELATION_ID, dpsHeaders.getCorrelationId()); + attributesMap.put(DpsHeaders.DATA_PARTITION_ID, dpsHeaders.getPartitionId()); + + return attributesMap; + } + + private Properties buildDatasetDetailsProperties(String datasetId, DatasetType datasetType, String datasetVersionId, + int recordCount) { + DatasetDetails datasetDetails = new DatasetDetails(); + Properties properties = datasetDetails.new Properties(); + properties.setCorrelationId(dpsHeaders.getCorrelationId()); + properties.setDatasetId(datasetId); + properties.setDatasetType(datasetType); + properties.setDatasetVersionId(datasetVersionId); + properties.setRecordCount(recordCount); + properties.setTimestamp(DateTime.now().toString()); + return properties; + } +} diff --git a/src/main/java/org/opengroup/osdu/core/common/status/IEventPublisher.java b/src/main/java/org/opengroup/osdu/core/common/status/IEventPublisher.java new file mode 100644 index 0000000000000000000000000000000000000000..345529d5ac54fba6d3fa98b19494e95289820171 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/status/IEventPublisher.java @@ -0,0 +1,34 @@ +package org.opengroup.osdu.core.common.status; + +import java.util.Map; + +import org.opengroup.osdu.core.common.exception.CoreException; + +/** + * Interface to publish message in event. + * + */ +public interface IEventPublisher { + /** + * This method will publish message to the configured event using data partition + * id and correlation id in attributesMap. Message should be in json format. + * Attributes map should consist both data-partition-id and correlation-id. + * + *
+     * {@code
+     * Map attributesMap() = new HashMap<>();
+     * attributesMap.put("data-partition-id", "partitionId");
+     * attributesMap.put("correlation-id", "abc123");
+     *  
+     * String message = { "data": "value" };
+     *  
+     * iEventpublisher.publish(message, attributesMap);
+     * }
+     * 
+ * + * @param message + * @param attributesMap + * @throws CoreException + */ + void publish(String message, Map attributesMap) throws CoreException; +} diff --git a/src/main/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilder.java b/src/main/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..9359930fe51b45ef509bb8c3e133338d1dc17df4 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilder.java @@ -0,0 +1,70 @@ +package org.opengroup.osdu.core.common.status; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.joda.time.DateTime; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.status.Status; +import org.opengroup.osdu.core.common.model.status.StatusDetails; +import org.opengroup.osdu.core.common.model.status.StatusDetails.Properties; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; + +@Lazy +@Component +@RequiredArgsConstructor +public class StatusDetailsRequestBuilder { + + private static final String KIND = "status"; + + private final DpsHeaders dpsHeaders; + private final ObjectMapper mapper; + + public StatusDetails buildStatusDetails(String msg, String recordId, Status status, String stage, int errorCode) { + Properties properties = buildStatusProperties(msg, recordId, status, stage, errorCode); + StatusDetails statusDetails = new StatusDetails(); + statusDetails.setKind(KIND); + statusDetails.setProperties(properties); + return statusDetails; + } + + public String createStatusDetailsMessage(String msg, String recordId, Status status, String stage, int errorCode) + throws JsonProcessingException { + List statusDetailsList = new ArrayList<>(); + StatusDetails statusDetails = buildStatusDetails(msg, recordId, status, stage, errorCode); + statusDetailsList.add(statusDetails); + + return mapper.writeValueAsString(statusDetailsList); + } + + public Map createAttributesMap() { + Map attributesMap = new HashMap<>(); + + attributesMap.put(DpsHeaders.CORRELATION_ID, dpsHeaders.getCorrelationId()); + attributesMap.put(DpsHeaders.DATA_PARTITION_ID, dpsHeaders.getPartitionId()); + + return attributesMap; + } + + private Properties buildStatusProperties(String msg, String recordId, Status status, String stage, int errorCode) { + StatusDetails statusDetails = new StatusDetails(); + Properties properties = statusDetails.new Properties(); + properties.setCorrelationId(dpsHeaders.getCorrelationId()); + properties.setErrorCode(errorCode); + properties.setMessage(msg); + properties.setRecordId(recordId); + properties.setStage(stage); + properties.setStatus(status); + properties.setTimestamp(DateTime.now().toString()); + properties.setUserEmail(dpsHeaders.getUserEmail()); + return properties; + } +} diff --git a/src/test/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilderTest.java b/src/test/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..39ee0ff286896d5583c1bed5bf592b6825f7e4da --- /dev/null +++ b/src/test/java/org/opengroup/osdu/core/common/status/DatasetDetailsRequestBuilderTest.java @@ -0,0 +1,86 @@ +package org.opengroup.osdu.core.common.status; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; + +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.runners.MockitoJUnitRunner; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.status.DatasetDetails; +import org.opengroup.osdu.core.common.model.status.DatasetType; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(MockitoJUnitRunner.class) +public class DatasetDetailsRequestBuilderTest { + + private static final String DATA_PARTITION_ID = "data-partition-id"; + private static final String CORRELATION_ID = "correlation-id"; + private static final int RECORD_COUNT_1 = 1; + private static final String DATASET_VERSION_ID = "v1"; + private static final String DATASET_ID = "abc123"; + private static final String DATASET_DETAILS = "datasetDetails"; + + @Mock + private DpsHeaders dpsHeaders; + + @Spy + private ObjectMapper mapper = new ObjectMapper(); + + @Mock + private JaxRsDpsLog log; + + @InjectMocks + private DatasetDetailsRequestBuilder requestBuilder; + + @Before + public void setup() { + when(dpsHeaders.getCorrelationId()).thenReturn(CORRELATION_ID); + } + + @Test + public void testBuildDatasetDetails() { + DatasetDetails datasetDetails = requestBuilder.buildDatasetDetails(DATASET_ID, DatasetType.FILE, + DATASET_VERSION_ID, RECORD_COUNT_1); + + assertNotNull(datasetDetails); + assertNotNull(datasetDetails.getProperties()); + assertEquals(DATASET_DETAILS, datasetDetails.getKind()); + assertEquals(DATASET_ID, datasetDetails.getProperties().getDatasetId()); + assertEquals(DatasetType.FILE, datasetDetails.getProperties().getDatasetType()); + assertEquals(DATASET_VERSION_ID, datasetDetails.getProperties().getDatasetVersionId()); + assertEquals(RECORD_COUNT_1, datasetDetails.getProperties().getRecordCount()); + } + + @Test + public void testCreateDatasetDetailsMessage() throws JsonProcessingException { + String datasetDetailsAsString = requestBuilder.createDatasetDetailsMessage(DATASET_ID, DatasetType.FILE, + DATASET_ID, RECORD_COUNT_1); + + assertNotNull(datasetDetailsAsString); + assertFalse(datasetDetailsAsString.isEmpty()); + } + + @Test + public void testCreateAttributesMap() { + when(dpsHeaders.getPartitionId()).thenReturn(DATA_PARTITION_ID); + + Map attributesMap = requestBuilder.createAttributesMap(); + + assertNotNull(attributesMap); + assertEquals(2, attributesMap.size()); + assertEquals(DATA_PARTITION_ID, attributesMap.get(DpsHeaders.DATA_PARTITION_ID)); + assertEquals(CORRELATION_ID, attributesMap.get(DpsHeaders.CORRELATION_ID)); + } +} diff --git a/src/test/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilderTest.java b/src/test/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..962f9a1d5110e2de6701429c9bdceac0b9230bb4 --- /dev/null +++ b/src/test/java/org/opengroup/osdu/core/common/status/StatusDetailsRequestBuilderTest.java @@ -0,0 +1,87 @@ +package org.opengroup.osdu.core.common.status; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; + +import java.util.Map; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.runners.MockitoJUnitRunner; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.model.status.Status; +import org.opengroup.osdu.core.common.model.status.StatusDetails; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(MockitoJUnitRunner.class) +public class StatusDetailsRequestBuilderTest { + + private static final String DATA_PARTITION_ID = "data-partition-id"; + private static final String CORRELATION_ID = "correlation-id"; + private static final String STATUS = "status"; + private static final String STAGE = "STORAGE_SYNC"; + private static final String MSG = "message"; + private static final int BAD_REQUEST_ERROR_CODE = HttpStatus.SC_BAD_REQUEST; + private static final String RECORD_ID = "partition1:abc:1234"; + + @Mock + private DpsHeaders dpsHeaders; + + @Spy + private ObjectMapper mapper = new ObjectMapper(); + + @Mock + private JaxRsDpsLog log; + + @InjectMocks + private StatusDetailsRequestBuilder requestBuilder; + + @Before + public void setup() { + when(dpsHeaders.getCorrelationId()).thenReturn(CORRELATION_ID); + } + + @Test + public void testBuildDatasetDetails() { + StatusDetails statusDetails = requestBuilder.buildStatusDetails(MSG, RECORD_ID, Status.FAILED, STAGE, BAD_REQUEST_ERROR_CODE); + + assertNotNull(statusDetails); + assertNotNull(statusDetails.getProperties()); + assertEquals(STATUS, statusDetails.getKind()); + assertEquals(MSG, statusDetails.getProperties().getMessage()); + assertEquals(RECORD_ID, statusDetails.getProperties().getRecordId()); + assertEquals(Status.FAILED, statusDetails.getProperties().getStatus()); + assertEquals(STAGE, statusDetails.getProperties().getStage()); + assertEquals(BAD_REQUEST_ERROR_CODE, statusDetails.getProperties().getErrorCode()); + } + + @Test + public void testCreateDatasetDetailsMessage() throws JsonProcessingException { + String statusDetailsAsString = requestBuilder.createStatusDetailsMessage(MSG, RECORD_ID, Status.FAILED, STAGE, BAD_REQUEST_ERROR_CODE); + + assertNotNull(statusDetailsAsString); + assertFalse(statusDetailsAsString.isEmpty()); + } + + @Test + public void testCreateAttributesMap() { + when(dpsHeaders.getPartitionId()).thenReturn(DATA_PARTITION_ID); + + Map attributesMap = requestBuilder.createAttributesMap(); + + assertNotNull(attributesMap); + assertEquals(2, attributesMap.size()); + assertEquals(DATA_PARTITION_ID, attributesMap.get(DpsHeaders.DATA_PARTITION_ID)); + assertEquals(CORRELATION_ID, attributesMap.get(DpsHeaders.CORRELATION_ID)); + } +} \ No newline at end of file