From e7ba0e4822c6059497a75cacc28afb65e3bd0db0 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 27 Sep 2022 19:21:23 +0200 Subject: [PATCH] ObjectIdResolvers for Import and Export for SciPublications part II --- .../publications/GreyLiterature.java | 7 +++ .../GreyLiteratureIdResolver.java | 58 +++++++++++++++++++ .../publications/InProceedings.java | 9 +++ .../publications/InProceedingsIdResolver.java | 58 +++++++++++++++++++ .../publications/InternetArticle.java | 9 +++ .../InternetArticleIdResolver.java | 57 ++++++++++++++++++ .../scientificcms/publications/Monograph.java | 12 ++-- .../publications/MonographIdResolver.java | 56 ++++++++++++++++++ .../publications/Proceedings.java | 9 +++ .../publications/ProceedingsIdResolver.java | 56 ++++++++++++++++++ .../org/scientificcms/publications/Talk.java | 12 ++-- .../publications/TalkIdResolver.java | 58 +++++++++++++++++++ .../publications/UnPublished.java | 7 +++ .../publications/UnPublishedIdResolver.java | 57 ++++++++++++++++++ .../publications/WorkingPaper.java | 7 +++ .../publications/WorkingPaperIdResolver.java | 56 ++++++++++++++++++ 16 files changed, 518 insertions(+), 10 deletions(-) create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/GreyLiteratureIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/InProceedingsIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/InternetArticleIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/MonographIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/ProceedingsIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/TalkIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/UnPublishedIdResolver.java create mode 100644 sci-publications/src/main/java/org/scientificcms/publications/WorkingPaperIdResolver.java diff --git a/sci-publications/src/main/java/org/scientificcms/publications/GreyLiterature.java b/sci-publications/src/main/java/org/scientificcms/publications/GreyLiterature.java index 4f248e2..9b95de6 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/GreyLiterature.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/GreyLiterature.java @@ -1,5 +1,7 @@ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import javax.persistence.Column; @@ -15,6 +17,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "GREY_LITERATURE", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = GreyLiteratureIdResolver.class, + property = "uuid" +) public class GreyLiterature extends UnPublished { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/GreyLiteratureIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/GreyLiteratureIdResolver.java new file mode 100644 index 0000000..701ab68 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/GreyLiteratureIdResolver.java @@ -0,0 +1,58 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class GreyLiteratureIdResolver + implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), GreyLiterature.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No GreyLiterature publication with UUID %s found in " + + "the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(Object context) { + return new GreyLiteratureIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof GreyLiteratureIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/InProceedings.java b/sci-publications/src/main/java/org/scientificcms/publications/InProceedings.java index a1d9574..a144b90 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/InProceedings.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/InProceedings.java @@ -1,5 +1,8 @@ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import java.util.Objects; @@ -19,12 +22,18 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "IN_PROCEEDINGS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = InProceedingsIdResolver.class, + property = "uuid" +) public class InProceedings extends Publication { private static final long serialVersionUID = 1L; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PROCEEDINGS_ID") + @JsonIdentityReference(alwaysAsId = true) private Proceedings proceedings; private int startPage; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/InProceedingsIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/InProceedingsIdResolver.java new file mode 100644 index 0000000..4242259 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/InProceedingsIdResolver.java @@ -0,0 +1,58 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class InProceedingsIdResolver + implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), InProceedings.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No InProceedings publication with UUID %s found in " + + "the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new InProceedingsIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof InProceedingsIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/InternetArticle.java b/sci-publications/src/main/java/org/scientificcms/publications/InternetArticle.java index 5641268..717b90b 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/InternetArticle.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/InternetArticle.java @@ -1,5 +1,8 @@ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import org.librecms.assets.Organization; @@ -21,6 +24,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "INTERNET_ARTICLES", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = InternetArticleIdResolver.class, + property = "uuid" +) public class InternetArticle extends Publication { private static final long serialVersionUID = 1L; @@ -57,6 +65,7 @@ public class InternetArticle extends Publication { @OneToOne @JoinColumn(name = "ORGANIZATION_ID") + @JsonIdentityReference(alwaysAsId = true) private Organization organization; public String getPlace() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/InternetArticleIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/InternetArticleIdResolver.java new file mode 100644 index 0000000..69923a4 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/InternetArticleIdResolver.java @@ -0,0 +1,57 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class InternetArticleIdResolver + implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), InternetArticle.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No InternetArticle with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new InternetArticleIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof InternetArticleIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Monograph.java b/sci-publications/src/main/java/org/scientificcms/publications/Monograph.java index 988d6e4..728d991 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Monograph.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Monograph.java @@ -1,10 +1,7 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import java.util.Objects; @@ -22,6 +19,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "MONOGRAPHS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = MonographIdResolver.class, + property = "uuid" +) public class Monograph extends PublicationWithPublisher { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/MonographIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/MonographIdResolver.java new file mode 100644 index 0000000..e908e4e --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/MonographIdResolver.java @@ -0,0 +1,56 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class MonographIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), Monograph.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Monograph with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new MonographIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof MonographIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java b/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java index a54cc5f..2ff2677 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Proceedings.java @@ -1,5 +1,8 @@ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import org.librecms.assets.Organization; @@ -26,6 +29,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "PROCEEDINGS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = ProceedingsIdResolver.class, + property = "uuid" +) public class Proceedings extends PublicationWithPublisher { private static final long serialVersionUID = 1L; @@ -47,6 +55,7 @@ public class Proceedings extends PublicationWithPublisher { private Organization organizer; @OneToMany(fetch = FetchType.LAZY, mappedBy = "proceedings") + @JsonIgnore private List papers; public Proceedings() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsIdResolver.java new file mode 100644 index 0000000..0f7b9d3 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsIdResolver.java @@ -0,0 +1,56 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class ProceedingsIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), Proceedings.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Proceedings with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new ProceedingsIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof ProceedingsIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Talk.java b/sci-publications/src/main/java/org/scientificcms/publications/Talk.java index a539689..30c027c 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Talk.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Talk.java @@ -1,10 +1,7 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import java.time.LocalDate; @@ -23,6 +20,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "TALKS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = TalkIdResolver.class, + property = "uuid" +) public class Talk extends Publication { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/TalkIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/TalkIdResolver.java new file mode 100644 index 0000000..6919271 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/TalkIdResolver.java @@ -0,0 +1,58 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.workflow.TaskIdResolver; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class TalkIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), Talk.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Talk with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new TalkIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof TaskIdResolver; + } + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/UnPublished.java b/sci-publications/src/main/java/org/scientificcms/publications/UnPublished.java index c0b3ea7..d72bce2 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/UnPublished.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/UnPublished.java @@ -5,6 +5,8 @@ */ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import org.librecms.assets.Organization; @@ -25,6 +27,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "UNPUBLISHED", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = UnPublishedIdResolver.class, + property = "uuid" +) public class UnPublished extends Publication { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/UnPublishedIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/UnPublishedIdResolver.java new file mode 100644 index 0000000..6b81055 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/UnPublishedIdResolver.java @@ -0,0 +1,57 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class UnPublishedIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), UnPublished.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No UnPublished publication with UUID %s found in the " + + "database", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new UnPublishedIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof UnPublishedIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaper.java b/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaper.java index baf7215..7da4f0a 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaper.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaper.java @@ -5,6 +5,8 @@ */ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import javax.persistence.Entity; @@ -19,6 +21,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "WORKING_PAPERS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = WorkingPaperIdResolver.class, + property = "uuid" +) public class WorkingPaper extends UnPublished { private static final long serialVersionUID = 1L; diff --git a/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaperIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaperIdResolver.java new file mode 100644 index 0000000..c9508e2 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/WorkingPaperIdResolver.java @@ -0,0 +1,56 @@ +package org.scientificcms.publications; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class WorkingPaperIdResolver implements Serializable, ObjectIdResolver { + + private static final long serialVersionUID = 1L; + + @Override + public void bindItem( + final ObjectIdGenerator.IdKey idKey, + final Object object + ) { + // According to the Jackson JavaDoc, this method can be used to keep + // track of objects directly in a resolver implementation. We don't need + // this here therefore this method is empty. + } + + @Override + public Object resolveId(final ObjectIdGenerator.IdKey id) { + return CdiUtil + .createCdiUtil() + .findBean(PublicationRepository.class) + .findByUuidAndType(id.key.toString(), WorkingPaper.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No WorkingPaper with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new WorkingPaperIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof WorkingPaperIdResolver; + } + +}