diff --git a/buildSrc/src/main/groovy/nvadatamodel.java-conventions.gradle b/buildSrc/src/main/groovy/nvadatamodel.java-conventions.gradle index 983fe8cb8..c0ff1c4d6 100644 --- a/buildSrc/src/main/groovy/nvadatamodel.java-conventions.gradle +++ b/buildSrc/src/main/groovy/nvadatamodel.java-conventions.gradle @@ -10,7 +10,7 @@ plugins { group 'com.github.bibsysdev' -version '0.19.27' +version '0.19.28' repositories { mavenCentral() diff --git a/nva-datamodel-java/src/main/java/no/unit/nva/model/Organization.java b/nva-datamodel-java/src/main/java/no/unit/nva/model/Organization.java index dc935f21c..76db7f889 100644 --- a/nva-datamodel-java/src/main/java/no/unit/nva/model/Organization.java +++ b/nva-datamodel-java/src/main/java/no/unit/nva/model/Organization.java @@ -1,85 +1,76 @@ package no.unit.nva.model; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; + import java.net.URI; import java.util.Collections; import java.util.Map; import java.util.Objects; + import nva.commons.core.JacocoGenerated; +import static java.util.Objects.isNull; + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") public class Organization implements Agent { - @JsonProperty("id") - private URI id; - @JsonProperty("labels") - private Map labels; - - public Organization() { + public static final String ID_FIELD = "id"; + public static final String LABELS_FIELD = "labels"; + @JsonProperty(ID_FIELD) + private final URI id; + @JsonProperty(LABELS_FIELD) + private final Map labels; + + @Deprecated + @JsonCreator + public static Organization fromJson(@JsonProperty(ID_FIELD) URI id, + @JsonProperty(LABELS_FIELD) Map labels) { + if (isNull(id)) { + return null; + } + return new Organization(id, labels); } - private Organization(Builder builder) { - setId(builder.id); - setLabels(builder.labels); + public Organization(@JsonProperty(ID_FIELD) URI id, + @JsonProperty(LABELS_FIELD) Map labels) { + this.id = validateId(id); + this.labels = labels; } public URI getId() { return id; } - public void setId(URI id) { - this.id = id; - } - public Map getLabels() { return Objects.nonNull(labels) ? labels : Collections.emptyMap(); } - public void setLabels(Map labels) { - this.labels = labels; + private URI validateId(URI candidate) { + if (isNull(candidate)) { + throw new IllegalArgumentException("The id of an Organization can not be null"); + } + return candidate; } - @JacocoGenerated @Override + @JacocoGenerated public boolean equals(Object o) { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (!(o instanceof Organization)) { return false; } Organization that = (Organization) o; return Objects.equals(getId(), that.getId()) - && Objects.equals(getLabels(), that.getLabels()); + && Objects.equals(getLabels(), that.getLabels()); } - @JacocoGenerated @Override + @JacocoGenerated public int hashCode() { return Objects.hash(getId(), getLabels()); } - - public static final class Builder { - - private URI id; - private Map labels; - - public Builder() { - } - - public Builder withId(URI id) { - this.id = id; - return this; - } - - public Builder withLabels(Map labels) { - this.labels = labels; - return this; - } - - public Organization build() { - return new Organization(this); - } - } } diff --git a/nva-datamodel-java/src/test/java/no/unit/nva/MigrationTestingOrganizationTest.java b/nva-datamodel-java/src/test/java/no/unit/nva/MigrationTestingOrganizationTest.java new file mode 100644 index 000000000..6856fb886 --- /dev/null +++ b/nva-datamodel-java/src/test/java/no/unit/nva/MigrationTestingOrganizationTest.java @@ -0,0 +1,29 @@ +package no.unit.nva; + +import com.fasterxml.jackson.core.JsonProcessingException; +import no.unit.nva.commons.json.JsonUtils; +import no.unit.nva.model.Organization; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +@Deprecated +class MigrationTestingOrganizationTest { + + @ParameterizedTest + @ValueSource(strings = {"{\"type\": \"Organization\"}", + "{\"type\": \"Organization\", \"labels\": {\"en\":\"A label\"}}"}) + void shouldRemoveImperfectlyFormedOrganizations(String value) throws JsonProcessingException { + assertNull(JsonUtils.dtoObjectMapper.readValue(value, Organization.class)); + } + + @ParameterizedTest + @ValueSource(strings = {"{\"type\": \"Organization\", \"id\": \"https://example.org\", " + + "\"labels\": {\"en\":\"A label\"}}", + "{\"type\": \"Organization\", \"id\": \"https://example.org\"}"}) + void shouldRetainWellFormedOrganizations(String value) throws JsonProcessingException { + assertNotNull(JsonUtils.dtoObjectMapper.readValue(value, Organization.class)); + } +} diff --git a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/EntityDescriptionBuilder.java b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/EntityDescriptionBuilder.java index 6b1be5fd5..78c6ed76f 100644 --- a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/EntityDescriptionBuilder.java +++ b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/EntityDescriptionBuilder.java @@ -82,10 +82,7 @@ private static List randomOrganizations() { } private static Organization randomOrganization() { - return new Organization.Builder() - .withLabels(randomLabels()) - .withId(randomUri()) - .build(); + return new Organization(randomUri(), randomLabels()); } private static List randomTags() { diff --git a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationContextBuilder.java b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationContextBuilder.java index be63d6051..fd1801dab 100644 --- a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationContextBuilder.java +++ b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationContextBuilder.java @@ -1,18 +1,5 @@ package no.unit.nva.model.testing; -import static no.unit.nva.model.testing.RandomUtils.randomLabel; -import static no.unit.nva.model.testing.RandomUtils.randomLabels; -import static no.unit.nva.testutils.RandomDataGenerator.randomBoolean; -import static no.unit.nva.testutils.RandomDataGenerator.randomElement; -import static no.unit.nva.testutils.RandomDataGenerator.randomInstant; -import static no.unit.nva.testutils.RandomDataGenerator.randomIsbn13; -import static no.unit.nva.testutils.RandomDataGenerator.randomIssn; -import static no.unit.nva.testutils.RandomDataGenerator.randomString; -import static no.unit.nva.testutils.RandomDataGenerator.randomUri; -import static nva.commons.core.attempt.Try.attempt; -import java.net.URI; -import java.time.Instant; -import java.util.List; import no.unit.nva.model.Agent; import no.unit.nva.model.Organization; import no.unit.nva.model.contexttypes.Artistic; @@ -45,6 +32,21 @@ import no.unit.nva.model.time.Time; import nva.commons.core.JacocoGenerated; +import java.net.URI; +import java.time.Instant; +import java.util.List; + +import static no.unit.nva.model.testing.RandomUtils.randomLabel; +import static no.unit.nva.model.testing.RandomUtils.randomLabels; +import static no.unit.nva.testutils.RandomDataGenerator.randomBoolean; +import static no.unit.nva.testutils.RandomDataGenerator.randomElement; +import static no.unit.nva.testutils.RandomDataGenerator.randomInstant; +import static no.unit.nva.testutils.RandomDataGenerator.randomIsbn13; +import static no.unit.nva.testutils.RandomDataGenerator.randomIssn; +import static no.unit.nva.testutils.RandomDataGenerator.randomString; +import static no.unit.nva.testutils.RandomDataGenerator.randomUri; +import static nva.commons.core.attempt.Try.attempt; + @SuppressWarnings("PMD.CouplingBetweenObjects") @JacocoGenerated public class PublicationContextBuilder { @@ -186,10 +188,7 @@ private static Period randomPeriod(Instant from) { } private static Agent randomAgent() { - return new Organization.Builder() - .withId(randomUri()) - .withLabels(randomLabels()) - .build(); + return new Organization(randomUri(), randomLabels()); } private static Report randomReport() diff --git a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationGenerator.java b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationGenerator.java index 341b28944..130b6355e 100644 --- a/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationGenerator.java +++ b/nva-datamodel-testutils/src/main/java/no/unit/nva/model/testing/PublicationGenerator.java @@ -9,10 +9,13 @@ import static no.unit.nva.testutils.RandomDataGenerator.randomInteger; import static no.unit.nva.testutils.RandomDataGenerator.randomString; import static org.hamcrest.MatcherAssert.assertThat; + import com.github.javafaker.Faker; + import java.net.URI; import java.util.List; import java.util.Set; + import no.unit.nva.identifiers.SortableIdentifier; import no.unit.nva.model.AdditionalIdentifier; import no.unit.nva.model.Approval; @@ -114,11 +117,11 @@ private static MonetaryAmount randomMonetaryAmount() { public static ResearchProject randomResearchProject() { return new ResearchProject.Builder() - .withId(randomUri()) - .withName(randomString()) - .withApprovals(randomApprovals()) - .withGrants(randomGrants()) - .build(); + .withId(randomUri()) + .withName(randomString()) + .withApprovals(randomApprovals()) + .withGrants(randomGrants()) + .build(); } public static List randomGrants() { @@ -127,9 +130,9 @@ public static List randomGrants() { public static Grant randomGrant() { return new Grant.Builder() - .withId(randomString()) - .withSource(randomString()) - .build(); + .withId(randomString()) + .withSource(randomString()) + .build(); } public static List randomApprovals() { @@ -139,11 +142,11 @@ public static List randomApprovals() { public static Approval randomApproval() { return new Approval.Builder() - .withApprovalStatus(randomElement(ApprovalStatus.values())) - .withDate(randomInstant()) - .withApplicationCode(randomString()) - .withApprovedBy(randomElement(ApprovalsBody.values())) - .build(); + .withApprovalStatus(randomElement(ApprovalStatus.values())) + .withDate(randomInstant()) + .withApplicationCode(randomString()) + .withApprovedBy(randomElement(ApprovalsBody.values())) + .build(); } public static AdditionalIdentifier randomAdditionalIdentifier() { @@ -151,32 +154,29 @@ public static AdditionalIdentifier randomAdditionalIdentifier() { } public static Organization randomOrganization() { - return new Organization.Builder() - .withId(randomUri()) - .withLabels(randomLabels()) - .build(); + return new Organization(randomUri(), randomLabels()); } private static Publication buildRandomPublicationFromInstance(Class publicationInstanceClass) { return new Builder() - .withIdentifier(SortableIdentifier.next()) - .withPublisher(randomOrganization()) - .withSubjects(List.of(randomUri())) - .withStatus(randomElement(PublicationStatus.values())) - .withPublishedDate(randomInstant()) - .withModifiedDate(randomInstant()) - .withAdditionalIdentifiers(Set.of(randomAdditionalIdentifier())) - .withProjects(randomProjects()) - .withFundings(randomFundings()) - .withResourceOwner(randomResourceOwner()) - .withLink(randomUri()) - .withIndexedDate(randomInstant()) - .withHandle(randomUri()) - .withDoi(randomDoi()) - .withCreatedDate(randomInstant()) - .withEntityDescription(randomEntityDescription(publicationInstanceClass)) - .withAssociatedArtifacts(AssociatedArtifactsGenerator.randomAssociatedArtifacts()) - .build(); + .withIdentifier(SortableIdentifier.next()) + .withPublisher(randomOrganization()) + .withSubjects(List.of(randomUri())) + .withStatus(randomElement(PublicationStatus.values())) + .withPublishedDate(randomInstant()) + .withModifiedDate(randomInstant()) + .withAdditionalIdentifiers(Set.of(randomAdditionalIdentifier())) + .withProjects(randomProjects()) + .withFundings(randomFundings()) + .withResourceOwner(randomResourceOwner()) + .withLink(randomUri()) + .withIndexedDate(randomInstant()) + .withHandle(randomUri()) + .withDoi(randomDoi()) + .withCreatedDate(randomInstant()) + .withEntityDescription(randomEntityDescription(publicationInstanceClass)) + .withAssociatedArtifacts(AssociatedArtifactsGenerator.randomAssociatedArtifacts()) + .build(); } private static ResourceOwner randomResourceOwner() {