Skip to content

Commit 651ec3f

Browse files
Merge pull request #570 from BIBSYSDEV/NP-3239-SPLIT-HIGHER-LEVEL-EXCEPTIONS-IN-S3
Np 3239 split higher level exceptions in s3
2 parents 0966a60 + 6acdbec commit 651ec3f

13 files changed

+124
-15
lines changed

cristin-import/src/main/java/no/unit/nva/cristin/mapper/AbstractPublicationInstanceBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package no.unit.nva.cristin.mapper;
22

3+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedSecondaryCategoryException;
34
import no.unit.nva.model.instancetypes.PublicationInstance;
45
import no.unit.nva.model.pages.Pages;
56
import nva.commons.core.JacocoGenerated;
@@ -21,8 +22,8 @@ public AbstractPublicationInstanceBuilder(CristinObject cristinObject) {
2122
public abstract PublicationInstance<? extends Pages> build();
2223

2324
@JacocoGenerated
24-
public UnsupportedOperationException unknownSecondaryCategory() {
25-
return new UnsupportedOperationException(ERROR_PARSING_SECONDARY_CATEGORY);
25+
public UnsupportedSecondaryCategoryException unknownSecondaryCategory() {
26+
return new UnsupportedSecondaryCategoryException(ERROR_PARSING_SECONDARY_CATEGORY);
2627
}
2728

2829
@JacocoGenerated

cristin-import/src/main/java/no/unit/nva/cristin/mapper/CristinContributorRoleCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonValue;
5+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedRoleException;
6+
57
import java.util.Arrays;
68

79
public enum CristinContributorRoleCode {
@@ -23,7 +25,7 @@ public static CristinContributorRoleCode fromString(String roleCode) {
2325
return Arrays.stream(CristinContributorRoleCode.values())
2426
.filter(role -> role.getStringValue().equalsIgnoreCase(roleCode))
2527
.findAny()
26-
.orElseThrow(() -> new RuntimeException(UNKNOWN_ROLE_ERROR + roleCode));
28+
.orElseThrow(() -> new UnsupportedRoleException(UNKNOWN_ROLE_ERROR + roleCode));
2729
}
2830

2931
@JsonValue

cristin-import/src/main/java/no/unit/nva/cristin/mapper/CristinMapper.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import no.unit.nva.cristin.mapper.nva.NvaBookBuilder;
3838
import no.unit.nva.cristin.mapper.nva.NvaDegreeBuilder;
3939
import no.unit.nva.cristin.mapper.nva.NvaReportBuilder;
40+
import no.unit.nva.cristin.mapper.nva.exceptions.InvalidIsbnRuntimeException;
41+
import no.unit.nva.cristin.mapper.nva.exceptions.InvalidIssnRuntimeException;
4042
import no.unit.nva.model.AdditionalIdentifier;
4143
import no.unit.nva.model.Contributor;
4244
import no.unit.nva.model.EntityDescription;
@@ -208,14 +210,28 @@ private Reference buildReference() {
208210
= new PublicationInstanceBuilderImpl(cristinObject);
209211
PublicationInstance<? extends Pages> publicationInstance
210212
= publicationInstanceBuilderImpl.build();
211-
PublicationContext publicationContext = attempt(this::buildPublicationContext).orElseThrow();
213+
PublicationContext publicationContext = attempt(this::buildPublicationContext)
214+
.orElseThrow(failure -> handlePublicationContextFailure(failure.getException()));
212215
return new Reference.Builder()
213216
.withPublicationInstance(publicationInstance)
214217
.withPublishingContext(publicationContext)
215218
.withDoi(extractDoi())
216219
.build();
217220
}
218221

222+
private RuntimeException handlePublicationContextFailure(Exception exception) {
223+
if (exception instanceof InvalidIssnException) {
224+
return new InvalidIssnRuntimeException(exception);
225+
}
226+
if (exception instanceof InvalidIsbnException) {
227+
return new InvalidIsbnRuntimeException(exception);
228+
}
229+
if (exception instanceof RuntimeException) {
230+
return (RuntimeException) exception;
231+
}
232+
return new RuntimeException(exception);
233+
}
234+
219235
private PublicationContext buildPublicationContext()
220236
throws InvalidIsbnException, InvalidIssnException, InvalidUnconfirmedSeriesException {
221237
if (isBook(cristinObject)) {

cristin-import/src/main/java/no/unit/nva/cristin/mapper/PublicationInstanceBuilderImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import static no.unit.nva.cristin.mapper.CristinMainCategory.isJournal;
77
import static no.unit.nva.cristin.mapper.CristinMainCategory.isReport;
88
import java.util.Objects;
9+
10+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedMainCategoryException;
11+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedSecondaryCategoryException;
912
import no.unit.nva.model.instancetypes.PublicationInstance;
1013
import no.unit.nva.model.pages.Pages;
1114

@@ -36,9 +39,9 @@ public PublicationInstance<? extends Pages> build() {
3639
} else if (isEvent(cristinObject)) {
3740
return new EventBuilder(cristinObject).build();
3841
} else if (cristinObject.getMainCategory().isUnknownCategory()) {
39-
throw new UnsupportedOperationException(ERROR_PARSING_MAIN_CATEGORY);
42+
throw new UnsupportedMainCategoryException(ERROR_PARSING_MAIN_CATEGORY);
4043
} else if (cristinObject.getSecondaryCategory().isUnknownCategory()) {
41-
throw new UnsupportedOperationException(ERROR_PARSING_SECONDARY_CATEGORY);
44+
throw new UnsupportedSecondaryCategoryException(ERROR_PARSING_SECONDARY_CATEGORY);
4245
}
4346
throw new RuntimeException(ERROR_PARSING_MAIN_OR_SECONDARY_CATEGORIES);
4447
}

cristin-import/src/main/java/no/unit/nva/cristin/mapper/nva/NvaBookSeriesBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import no.unit.nva.cristin.mapper.CristinJournalPublicationJournal;
99
import no.unit.nva.cristin.mapper.CristinObject;
1010
import no.unit.nva.cristin.mapper.Nsd;
11+
import no.unit.nva.cristin.mapper.nva.exceptions.InvalidIssnRuntimeException;
1112
import no.unit.nva.model.contexttypes.BookSeries;
1213
import no.unit.nva.model.contexttypes.Series;
1314
import no.unit.nva.model.contexttypes.UnconfirmedSeries;
@@ -37,7 +38,7 @@ private BookSeries toNvaBookSeries(CristinJournalPublicationJournal bookSeries)
3738
private BookSeries createUnconfirmedBookSeries(CristinJournalPublicationJournal bookSeries) {
3839
return attempt(
3940
() -> new UnconfirmedSeries(bookSeries.getJournalTitle(), bookSeries.getIssn(), bookSeries.getIssnOnline()))
40-
.orElseThrow();
41+
.orElseThrow(failure -> new InvalidIssnRuntimeException(failure.getException()));
4142
}
4243

4344
private BookSeries createConfirmedBookSeries(CristinJournalPublicationJournal b) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.unit.nva.cristin.mapper.nva.exceptions;
2+
3+
public class InvalidIsbnRuntimeException extends RuntimeException {
4+
5+
public InvalidIsbnRuntimeException(Exception cause) {
6+
super(cause);
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.unit.nva.cristin.mapper.nva.exceptions;
2+
3+
public class InvalidIssnRuntimeException extends RuntimeException {
4+
5+
public InvalidIssnRuntimeException(Exception cause) {
6+
super(cause);
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.unit.nva.cristin.mapper.nva.exceptions;
2+
3+
public class UnsupportedMainCategoryException extends RuntimeException {
4+
5+
public UnsupportedMainCategoryException(String message) {
6+
super(message);
7+
}
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.unit.nva.cristin.mapper.nva.exceptions;
2+
3+
public class UnsupportedRoleException extends RuntimeException {
4+
5+
public UnsupportedRoleException(String message) {
6+
super(message);
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package no.unit.nva.cristin.mapper.nva.exceptions;
2+
3+
public class UnsupportedSecondaryCategoryException extends RuntimeException {
4+
5+
public UnsupportedSecondaryCategoryException(String message) {
6+
super(message);
7+
}
8+
}

cristin-import/src/test/java/no/unit/nva/cristin/CristinDataGenerator.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,19 @@ public static JsonNode objectWithoutId() throws JsonProcessingException {
250250
return cristinObject;
251251
}
252252

253+
public static JsonNode objectWithInvalidIsbn() throws JsonProcessingException {
254+
CristinObject cristinObject = randomBook();
255+
cristinObject.getBookOrReportMetadata().setIsbn("123");
256+
return cristinObjectAsObjectNode(cristinObject);
257+
}
258+
259+
public static JsonNode objectWithInvalidIssn() throws JsonProcessingException {
260+
CristinObject cristinObject = randomBook();
261+
cristinObject.getBookOrReportMetadata().getBookSeries().setIssn("123-123-123-132-123");
262+
cristinObject.getBookOrReportMetadata().getBookSeries().setNsdCode(null);
263+
return cristinObjectAsObjectNode(cristinObject);
264+
}
265+
253266
public static CristinObject newCristinObjectWithRoleCode(CristinContributorRoleCode roleCode) {
254267
return createObjectWithCristinContributorRoleCode(0, createContributors(roleCode));
255268
}
@@ -414,6 +427,7 @@ private static CristinJournalPublicationJournal randomBookSeries() {
414427
private static CristinObject createRandomBookWithSpecifiedSecondaryCategory(
415428
CristinSecondaryCategory secondaryCategory) {
416429
return CristinObject.builder()
430+
.withYearReported(2001)
417431
.withCristinTitles(List.of(randomCristinTitle(FIRST_TITLE)))
418432
.withEntryCreationDate(LocalDate.now())
419433
.withMainCategory(CristinMainCategory.BOOK)

cristin-import/src/test/java/no/unit/nva/cristin/lambda/CristinEntryEventConsumerTest.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
import no.unit.nva.cristin.mapper.CristinObject;
4646
import no.unit.nva.cristin.mapper.Identifiable;
4747
import no.unit.nva.cristin.mapper.PublicationInstanceBuilderImpl;
48+
import no.unit.nva.cristin.mapper.nva.exceptions.InvalidIsbnRuntimeException;
49+
import no.unit.nva.cristin.mapper.nva.exceptions.InvalidIssnRuntimeException;
50+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedMainCategoryException;
51+
import no.unit.nva.cristin.mapper.nva.exceptions.UnsupportedSecondaryCategoryException;
4852
import no.unit.nva.events.models.AwsEventBridgeEvent;
4953
import no.unit.nva.model.Publication;
5054
import no.unit.nva.model.PublicationStatus;
@@ -197,7 +201,6 @@ public void handlerSavesErrorReportInS3OutsideTheInputFolderAndWithFilenameTheOb
197201

198202
@Test
199203
public void handlerThrowsExceptionWhenMainCategoryTypeIsNotKnown() throws JsonProcessingException {
200-
201204
JsonNode inputData = CristinDataGenerator.objectWithCustomMainCategory(randomString());
202205
AwsEventBridgeEvent<FileContentsEvent<JsonNode>> awsEvent = CristinDataGenerator.toAwsEvent(inputData);
203206
InputStream inputStream = IoUtils.stringToStream(awsEvent.toJsonString());
@@ -206,7 +209,7 @@ public void handlerThrowsExceptionWhenMainCategoryTypeIsNotKnown() throws JsonPr
206209
RuntimeException exception = assertThrows(RuntimeException.class, action);
207210

208211
Throwable cause = exception.getCause();
209-
assertThat(cause, is(instanceOf(UnsupportedOperationException.class)));
212+
assertThat(cause, is(instanceOf(UnsupportedMainCategoryException.class)));
210213
assertThat(cause.getMessage(), is(equalTo(PublicationInstanceBuilderImpl.ERROR_PARSING_MAIN_CATEGORY)));
211214
}
212215

@@ -263,11 +266,39 @@ public void handlerThrowsExceptionWhenSecondaryCategoryTypeIsNotKnown() throws J
263266
RuntimeException exception = assertThrows(RuntimeException.class, action);
264267

265268
Throwable cause = exception.getCause();
266-
assertThat(cause, is(instanceOf(UnsupportedOperationException.class)));
269+
assertThat(cause, is(instanceOf(UnsupportedSecondaryCategoryException.class)));
267270
assertThat(cause.getMessage(), containsString(PublicationInstanceBuilderImpl.ERROR_PARSING_SECONDARY_CATEGORY));
268271

269272
}
270273

274+
@Test
275+
public void handlerThrowsInvalidIsbnRuntimeExceptionWhenTheIsbnIsInvalid() throws JsonProcessingException {
276+
JsonNode cristinObjectWithInvalidIsbn = CristinDataGenerator.objectWithInvalidIsbn();
277+
AwsEventBridgeEvent<FileContentsEvent<JsonNode>> awsEvent =
278+
CristinDataGenerator.toAwsEvent(cristinObjectWithInvalidIsbn);
279+
InputStream inputStream = IoUtils.stringToStream(awsEvent.toJsonString());
280+
281+
Executable action = () -> handler.handleRequest(inputStream, outputStream, CONTEXT);
282+
283+
RuntimeException exception = assertThrows(RuntimeException.class, action);
284+
Throwable cause = exception.getCause();
285+
assertThat(cause, is(instanceOf(InvalidIsbnRuntimeException.class)));
286+
}
287+
288+
@Test
289+
public void handlerThrowsInvalidIssnRuntimeExceptionWhenTheIssnIsInvalid() throws JsonProcessingException {
290+
JsonNode cristinObjectWithInvalidIssn = CristinDataGenerator.objectWithInvalidIssn();
291+
AwsEventBridgeEvent<FileContentsEvent<JsonNode>> awsEvent =
292+
CristinDataGenerator.toAwsEvent(cristinObjectWithInvalidIssn);
293+
InputStream inputStream = IoUtils.stringToStream(awsEvent.toJsonString());
294+
295+
Executable action = () -> handler.handleRequest(inputStream, outputStream, CONTEXT);
296+
297+
RuntimeException exception = assertThrows(RuntimeException.class, action);
298+
Throwable cause = exception.getCause();
299+
assertThat(cause, is(instanceOf(InvalidIssnRuntimeException.class)));
300+
}
301+
271302
@Test
272303
public void handlerCreatesFileWithCustomNameWhenCristinIdIsNotFound() throws JsonProcessingException {
273304
JsonNode cristinObjectWithoutId = CristinDataGenerator.objectWithoutId();

cristin-import/src/test/java/no/unit/nva/cristin/mapper/CristinMapperTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void mapReturnsResourceWithCristinIdStoredInAdditionalIdentifiers() {
7070
Set<Integer> expectedIds = cristinObjects().map(CristinObject::getId).collect(Collectors.toSet());
7171

7272
Set<Integer> actualIds = cristinObjects()
73-
.map(CristinObject::toPublication)
73+
.map(cristinObject -> cristinObject.toPublication())
7474
.map(Publication::getAdditionalIdentifiers)
7575
.flatMap(Collection::stream)
7676
.map(AdditionalIdentifier::getValue)
@@ -92,10 +92,11 @@ public void mapReturnsResourceWithMainTitleBeingTheTitleAnnotatedAsOriginalTitle
9292
.collect(Collectors.toList());
9393

9494
List<String> actualTitles = cristinObjects.stream()
95-
.map(CristinObject::toPublication)
96-
.map(Publication::getEntityDescription)
97-
.map(EntityDescription::getMainTitle)
98-
.collect(Collectors.toList());
95+
.map(cristinObject -> cristinObject.toPublication())
96+
.map(Publication::getEntityDescription)
97+
.map(EntityDescription::getMainTitle)
98+
.collect(Collectors.toList());
99+
99100
assertThat(expectedTitles, is(not(empty())));
100101
assertThat(actualTitles, containsInAnyOrder(expectedTitles.toArray(String[]::new)));
101102
assertThat(actualTitles.size(), is(equalTo(cristinObjects.size())));

0 commit comments

Comments
 (0)