diff --git a/src/main/java/eu/dissco/core/handlemanager/exceptions/CopyDatabaseException.java b/src/main/java/eu/dissco/core/handlemanager/exceptions/CopyDatabaseException.java deleted file mode 100644 index cd261867..00000000 --- a/src/main/java/eu/dissco/core/handlemanager/exceptions/CopyDatabaseException.java +++ /dev/null @@ -1,9 +0,0 @@ -package eu.dissco.core.handlemanager.exceptions; - -public class CopyDatabaseException extends Exception { - - public CopyDatabaseException(String s) { - super(s); - } - -} diff --git a/src/main/java/eu/dissco/core/handlemanager/repository/BatchInserter.java b/src/main/java/eu/dissco/core/handlemanager/repository/BatchInserter.java index 3660d641..e01d7934 100644 --- a/src/main/java/eu/dissco/core/handlemanager/repository/BatchInserter.java +++ b/src/main/java/eu/dissco/core/handlemanager/repository/BatchInserter.java @@ -2,7 +2,7 @@ import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleAttribute; import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleFullRow; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; +import eu.dissco.core.handlemanager.exceptions.PidCreationException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -21,7 +21,7 @@ public class BatchInserter { private final CopyManager copyManager; public void batchCopy(long recordTimestamp, List<HandleAttribute> handleAttributes) - throws CopyDatabaseException { + throws PidCreationException { var rows = handleAttributes.stream() .map(attribute -> new HandleFullRow(attribute, recordTimestamp)).toList(); try (var outputStream = new ByteArrayOutputStream()) { @@ -29,19 +29,10 @@ public void batchCopy(long recordTimestamp, List<HandleAttribute> handleAttribut outputStream.write(row.getCsvRow()); } var inputStream = new ByteArrayInputStream(outputStream.toByteArray()); - var rowsChanged = copyManager.copyIn("COPY handles FROM stdin DELIMITER ','", inputStream); - verifyAllRowsPosted(rowsChanged, handleAttributes.size()); + copyManager.copyIn("COPY handles FROM stdin DELIMITER ','", inputStream); } catch (IOException | SQLException e) { log.error("Sql error: ", e); - throw new CopyDatabaseException(e.getMessage()); - } - } - - private void verifyAllRowsPosted(long rowsChanged, int rowsToPost) - throws CopyDatabaseException { - if (rowsChanged != rowsToPost) { - log.error("Expected to post {} rows, but only {} rows changed", rowsToPost, rowsChanged); - throw new CopyDatabaseException("Failed to post correct rows"); + throw new PidCreationException("Unable to insert handles into database."); } } } diff --git a/src/main/java/eu/dissco/core/handlemanager/repository/PidRepository.java b/src/main/java/eu/dissco/core/handlemanager/repository/PidRepository.java index da12a7ea..f4d3ff30 100644 --- a/src/main/java/eu/dissco/core/handlemanager/repository/PidRepository.java +++ b/src/main/java/eu/dissco/core/handlemanager/repository/PidRepository.java @@ -8,7 +8,7 @@ import static eu.dissco.core.handlemanager.domain.FdoProfile.PRIMARY_SPECIMEN_OBJECT_ID; import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleAttribute; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; +import eu.dissco.core.handlemanager.exceptions.PidCreationException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashSet; @@ -147,7 +147,7 @@ private HandleAttribute mapToAttribute(Record4<Integer, byte[], byte[], byte[]> // Post public void postAttributesToDb(long recordTimestamp, List<HandleAttribute> handleAttributes) - throws CopyDatabaseException { + throws PidCreationException { batchInserter.batchCopy(recordTimestamp, handleAttributes); } diff --git a/src/main/java/eu/dissco/core/handlemanager/service/DoiService.java b/src/main/java/eu/dissco/core/handlemanager/service/DoiService.java index 2701a91d..46dcf6b3 100644 --- a/src/main/java/eu/dissco/core/handlemanager/service/DoiService.java +++ b/src/main/java/eu/dissco/core/handlemanager/service/DoiService.java @@ -14,7 +14,6 @@ import eu.dissco.core.handlemanager.domain.requests.objects.DigitalSpecimenRequest; import eu.dissco.core.handlemanager.domain.requests.objects.MediaObjectRequest; import eu.dissco.core.handlemanager.domain.requests.vocabulary.specimen.ObjectType; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; import eu.dissco.core.handlemanager.exceptions.InvalidRequestException; import eu.dissco.core.handlemanager.exceptions.PidCreationException; import eu.dissco.core.handlemanager.exceptions.PidResolutionException; @@ -94,14 +93,9 @@ public JsonApiWrapperWrite createRecords( log.info("Persisting new DOIs to db"); var recordTimestamp = Instant.now().getEpochSecond(); - try { - pidRepository.postAttributesToDb(recordTimestamp, handleAttributes); - } catch (CopyDatabaseException e) { - log.info("Rolling back handles"); - var handlesString = handles.stream().map(h -> new String(h, StandardCharsets.UTF_8)).toList(); - rollbackHandles(handlesString); - throw new PidCreationException("Unable to insert handles into database"); - } + + pidRepository.postAttributesToDb(recordTimestamp, handleAttributes); + return new JsonApiWrapperWrite(formatCreateRecords(handleAttributes, recordTypes)); } diff --git a/src/main/java/eu/dissco/core/handlemanager/service/HandleService.java b/src/main/java/eu/dissco/core/handlemanager/service/HandleService.java index d3785158..5651193c 100644 --- a/src/main/java/eu/dissco/core/handlemanager/service/HandleService.java +++ b/src/main/java/eu/dissco/core/handlemanager/service/HandleService.java @@ -21,7 +21,6 @@ import eu.dissco.core.handlemanager.domain.requests.objects.OrganisationRequest; import eu.dissco.core.handlemanager.domain.requests.objects.SourceSystemRequest; import eu.dissco.core.handlemanager.domain.requests.vocabulary.specimen.ObjectType; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; import eu.dissco.core.handlemanager.exceptions.InvalidRequestException; import eu.dissco.core.handlemanager.exceptions.PidCreationException; import eu.dissco.core.handlemanager.exceptions.PidResolutionException; @@ -145,14 +144,7 @@ public JsonApiWrapperWrite createRecords( validateDigitalSpecimens(digitalSpecimenList); log.info("Persisting new handles to db"); - try { - pidRepository.postAttributesToDb(recordTimestamp, handleAttributes); - } catch (CopyDatabaseException e) { - log.info("Rolling back handles"); - var handlesString = handles.stream().map(h -> new String(h, StandardCharsets.UTF_8)).toList(); - rollbackHandles(handlesString); - throw new PidCreationException("Unable to insert handles into database"); - } + pidRepository.postAttributesToDb(recordTimestamp, handleAttributes); return new JsonApiWrapperWrite(formatCreateRecords(handleAttributes, recordTypes)); } diff --git a/src/test/java/eu/dissco/core/handlemanager/repository/BatchInserterTest.java b/src/test/java/eu/dissco/core/handlemanager/repository/BatchInserterTest.java index e8851fbc..bc710fa0 100644 --- a/src/test/java/eu/dissco/core/handlemanager/repository/BatchInserterTest.java +++ b/src/test/java/eu/dissco/core/handlemanager/repository/BatchInserterTest.java @@ -10,7 +10,7 @@ import eu.dissco.core.handlemanager.database.jooq.tables.Handles; import eu.dissco.core.handlemanager.domain.FdoProfile; import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleAttribute; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; +import eu.dissco.core.handlemanager.exceptions.PidCreationException; import java.nio.charset.StandardCharsets; import java.sql.DriverManager; import java.sql.SQLException; @@ -55,7 +55,7 @@ void testBatchInsertIllegalChar() { ); // Then - assertThrows(CopyDatabaseException.class, + assertThrows(PidCreationException.class, () -> batchInserter.batchCopy(CREATED.getEpochSecond(), attributes)); } diff --git a/src/test/java/eu/dissco/core/handlemanager/service/DoiServiceTest.java b/src/test/java/eu/dissco/core/handlemanager/service/DoiServiceTest.java index 338439e6..707fce3a 100644 --- a/src/test/java/eu/dissco/core/handlemanager/service/DoiServiceTest.java +++ b/src/test/java/eu/dissco/core/handlemanager/service/DoiServiceTest.java @@ -10,7 +10,6 @@ import static eu.dissco.core.handlemanager.testUtils.TestUtils.RECORD_TYPE_HANDLE; import static eu.dissco.core.handlemanager.testUtils.TestUtils.genCreateRecordRequest; import static eu.dissco.core.handlemanager.testUtils.TestUtils.genDigitalSpecimenAttributes; -import static eu.dissco.core.handlemanager.testUtils.TestUtils.genDoiRecordAttributes; import static eu.dissco.core.handlemanager.testUtils.TestUtils.givenDigitalSpecimenRequestObjectNullOptionals; import static eu.dissco.core.handlemanager.testUtils.TestUtils.givenDoiRecordRequestObject; import static eu.dissco.core.handlemanager.testUtils.TestUtils.givenRecordResponseWriteSmallResponse; @@ -18,18 +17,13 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mockStatic; import eu.dissco.core.handlemanager.Profiles; import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleAttribute; import eu.dissco.core.handlemanager.domain.requests.vocabulary.specimen.ObjectType; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; import eu.dissco.core.handlemanager.exceptions.InvalidRequestException; -import eu.dissco.core.handlemanager.exceptions.PidCreationException; import eu.dissco.core.handlemanager.properties.ProfileProperties; import eu.dissco.core.handlemanager.repository.PidRepository; import java.nio.charset.StandardCharsets; @@ -122,29 +116,6 @@ void testCreateDoiRecordDoiProfile() throws Exception { assertThat(responseReceived).isEqualTo(responseExpected); } - @Test - void testCreateDoiRecordDbException() throws Exception { - // Given - byte[] handle = handles.get(0); - var request = genCreateRecordRequest(givenDigitalSpecimenRequestObjectNullOptionals(), - RECORD_TYPE_DS); - List<HandleAttribute> doiRecord = genDoiRecordAttributes(handle, ObjectType.DIGITAL_SPECIMEN); - - given(pidNameGeneratorService.genHandleList(1)).willReturn(new ArrayList<>(List.of(handle))); - given(fdoRecordService.prepareDigitalSpecimenRecordAttributes(any(), any(), - eq(ObjectType.DIGITAL_SPECIMEN))).willReturn( - doiRecord); - doThrow(CopyDatabaseException.class).when(pidRepository) - .postAttributesToDb(CREATED.getEpochSecond(), doiRecord); - - // When - assertThrows(PidCreationException.class, () -> service.createRecords(List.of(request))); - - // Then - then(pidRepository).should() - .rollbackHandles(List.of(new String(handle, StandardCharsets.UTF_8))); - } - @Test void testCreateInvalidType() { // Given diff --git a/src/test/java/eu/dissco/core/handlemanager/service/HandleServiceTest.java b/src/test/java/eu/dissco/core/handlemanager/service/HandleServiceTest.java index c62ee732..80cf8526 100644 --- a/src/test/java/eu/dissco/core/handlemanager/service/HandleServiceTest.java +++ b/src/test/java/eu/dissco/core/handlemanager/service/HandleServiceTest.java @@ -63,7 +63,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mockStatic; import com.fasterxml.jackson.databind.JsonNode; @@ -73,7 +72,6 @@ import eu.dissco.core.handlemanager.domain.jsonapi.JsonApiWrapperWrite; import eu.dissco.core.handlemanager.domain.repsitoryobjects.HandleAttribute; import eu.dissco.core.handlemanager.domain.requests.vocabulary.specimen.ObjectType; -import eu.dissco.core.handlemanager.exceptions.CopyDatabaseException; import eu.dissco.core.handlemanager.exceptions.InvalidRequestException; import eu.dissco.core.handlemanager.exceptions.PidCreationException; import eu.dissco.core.handlemanager.exceptions.PidResolutionException; @@ -344,27 +342,6 @@ void testCreateDoiRecord() throws Exception { assertThat(responseReceived).isEqualTo(responseExpected); } - @Test - void testCreateDoiRecordDbException() throws Exception { - // Given - byte[] handle = handles.get(0); - var request = genCreateRecordRequest(givenDoiRecordRequestObject(), RECORD_TYPE_DOI); - List<HandleAttribute> doiRecord = genDoiRecordAttributes(handle, ObjectType.HANDLE); - - given(pidNameGeneratorService.genHandleList(1)).willReturn(new ArrayList<>(List.of(handle))); - given(fdoRecordService.prepareDoiRecordAttributes(any(), any(), eq(ObjectType.DOI))).willReturn( - doiRecord); - doThrow(CopyDatabaseException.class).when(pidRepository) - .postAttributesToDb(CREATED.getEpochSecond(), doiRecord); - - // When - assertThrows(PidCreationException.class, () -> service.createRecords(List.of(request))); - - // Then - then(pidRepository).should() - .rollbackHandles(List.of(new String(handle, StandardCharsets.UTF_8))); - } - @Test void testCreateDigitalSpecimen() throws Exception { // Given