diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolume.java b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolume.java index e3202e8..d970e5b 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolume.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolume.java @@ -5,6 +5,9 @@ */ 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; @@ -24,12 +27,18 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "ARTICLES_IN_COLLECTED_VOLUME", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = ArticleInCollectedVolumeIdResolver.class, + property = "uuid" +) public class ArticleInCollectedVolume extends Publication { private static final long serialVersionUID = 1L; @ManyToOne @JoinColumn(name = "COLLECTED_VOLUME_ID") + @JsonIdentityReference(alwaysAsId = true) private CollectedVolume collectedVolume; @Column(name = "START_PAGE") diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolumeIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolumeIdResolver.java new file mode 100644 index 0000000..f128640 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInCollectedVolumeIdResolver.java @@ -0,0 +1,62 @@ +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 ArticleInCollectedVolumeIdResolver + 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(), + ArticleInCollectedVolume.class + ) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No ArticleInCollectedVolume with UUID %s in the " + + "database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new ArticleInCollectedVolumeIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof ArticleInCollectedVolumeIdResolver; + } + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournal.java b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournal.java index 44fae14..93353fe 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournal.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournal.java @@ -5,6 +5,9 @@ */ 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.time.LocalDate; @@ -25,12 +28,18 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "ARTICLES_IN_JOURNAL", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = ArticleInCollectedVolumeIdResolver.class, + property = "uuid" +) public class ArticleInJournal extends Publication { private static final long serialVersionUID = 1L; @ManyToOne @JoinColumn(name = "JOURNAL_ID") + @JsonIdentityReference(alwaysAsId = true) private Journal journal; @Column(name = "VOLUME") diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournalIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournalIdResolver.java new file mode 100644 index 0000000..92f8bbb --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ArticleInJournalIdResolver.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 ArticleInJournalIdResolver + 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(), ArticleInJournal.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No ArticleInJournal with UUID %s found in the " + + "database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new ArticleInJournalIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof ArticleInJournalIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Authorship.java b/sci-publications/src/main/java/org/scientificcms/publications/Authorship.java index 0e38a86..41ccd4f 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Authorship.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Authorship.java @@ -5,6 +5,9 @@ */ 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.Person; @@ -29,6 +32,10 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "AUTHORSHIPS", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) public class Authorship implements Serializable, Comparable { private static final long serialVersionUID = 1L; @@ -43,10 +50,12 @@ public class Authorship implements Serializable, Comparable { @ManyToOne @JoinColumn(name = "PUBLICATION_ID") + @JsonIdentityReference(alwaysAsId = true) private Publication publication; @ManyToOne @JoinColumn(name = "AUTHOR_ID") + @JsonIdentityReference(alwaysAsId = true) private Person author; @Column(name = "EDITOR") diff --git a/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java index c28723d..4cf672a 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java @@ -5,6 +5,9 @@ */ 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 java.util.ArrayList; @@ -25,12 +28,18 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "COLLECTED_VOLUMES", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = CollectedVolumeIdResolver.class, + property = "uuid" +) public class CollectedVolume extends PublicationWithPublisher { private static final long serialVersionUID = 1L; @OneToMany(mappedBy = "collectedVolume") @OrderBy("chapter") + @JsonIgnore private List articles; public CollectedVolume() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeIdResolver.java new file mode 100644 index 0000000..c9120f4 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeIdResolver.java @@ -0,0 +1,55 @@ +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; + +/** + * + * @author Jens Pelzetter + */ +public class CollectedVolumeIdResolver + 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(), CollectedVolume.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No CollectedVolume with UUID found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new CollectedVolumeIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof CollectedVolumeIdResolver; + } + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Expertise.java b/sci-publications/src/main/java/org/scientificcms/publications/Expertise.java index 8fb553e..57096e2 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Expertise.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Expertise.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; @@ -20,6 +23,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "EXPERTISES", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = ExpertiseIdResolver.class, + property = "uuid" +) public class Expertise extends Publication { private static final long serialVersionUID = 1L; @@ -32,10 +40,12 @@ public class Expertise extends Publication { @OneToOne @JoinColumn(name = "ORGANIZATION_ID") + @JsonIdentityReference(alwaysAsId = true) private Organization organization; @OneToOne @JoinColumn(name = "ORDERER_ID") + @JsonIdentityReference(alwaysAsId = true) private Organization orderer; public String getPlace() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ExpertiseIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/ExpertiseIdResolver.java new file mode 100644 index 0000000..c380664 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/ExpertiseIdResolver.java @@ -0,0 +1,53 @@ +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; + +/** + * + * @author Jens Pelzetter + */ +public class ExpertiseIdResolver 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(), Expertise.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Expertise with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new ExpertiseIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof ExpertiseIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Journal.java b/sci-publications/src/main/java/org/scientificcms/publications/Journal.java index bfda684..8a378eb 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Journal.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Journal.java @@ -5,6 +5,9 @@ */ 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.libreccm.l10n.LocalizedString; @@ -48,6 +51,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; + "WHERE LOWER(j.title) LIKE CONCAT('%', :title, '%')" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = JournalIdResolver.class, + property = "uuid" +) public class Journal implements Serializable { private static final long serialVersionUID = 1L; @@ -102,6 +110,7 @@ public class Journal implements Serializable { private String symbol; @OneToMany(mappedBy = "journal") + @JsonIgnore private List articles; public Journal() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/JournalIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/JournalIdResolver.java new file mode 100644 index 0000000..1194d16 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/JournalIdResolver.java @@ -0,0 +1,53 @@ +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; + +/** + * + * @author Jens Pelzetter + */ +public class JournalIdResolver 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(JournalRepository.class) + .findByUuid(id.key.toString()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Journa with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new JournalIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof JournalIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java index 81ce637..59965a0 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java @@ -5,6 +5,9 @@ */ 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.annotations.NamedQueries; import org.hibernate.annotations.NamedQuery; import org.hibernate.envers.Audited; @@ -93,6 +96,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; + "AND TYPE(p) = :type" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = PublicationIdResolver.class, + property = "uuid" +) public class Publication implements Serializable { private static final long serialVersionUID = 1L; @@ -115,6 +123,7 @@ public class Publication implements Serializable { orphanRemoval = true ) @OrderBy("authorOrder") + @JsonIgnore private List authorships; @Embedded @@ -179,6 +188,7 @@ public class Publication implements Serializable { private Locale languageOfPublication; @OneToMany(mappedBy = "publication") + @JsonIgnore private List series; public Publication() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationIdResolver.java new file mode 100644 index 0000000..075d4f0 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationIdResolver.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 PublicationIdResolver 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) + .findByUuid(id.key.toString()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publiation with UUID %s found in database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new PublicationIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof PublicationIdResolver; + } + + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisher.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisher.java index c71ad8b..334ef7a 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisher.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisher.java @@ -5,6 +5,11 @@ */ package org.scientificcms.publications; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.hibernate.envers.Audited; import org.libreccm.l10n.LocalizedString; @@ -53,11 +58,17 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; + "WHERE p.isbn13 = :isbn" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = PublicationWithPublisherIdResolver.class, + property = "uuid" +) public class PublicationWithPublisher extends Publication { private static final long serialVersionUID = 1L; @ManyToOne + @JsonIdentityReference(alwaysAsId = true) private Publisher publisher; @Column(name = "ISBN10", length = 13) diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisherIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisherIdResolver.java new file mode 100644 index 0000000..f89bea5 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationWithPublisherIdResolver.java @@ -0,0 +1,61 @@ +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 PublicationWithPublisherIdResolver + 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(), + PublicationWithPublisher.class + ) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No PublicationWithPublisher with UUID %s found in " + + "database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new PublicationWithPublisherIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof PublicationWithPublisherIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Publisher.java b/sci-publications/src/main/java/org/scientificcms/publications/Publisher.java index dc47da0..93c06be 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Publisher.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Publisher.java @@ -5,6 +5,9 @@ */ 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 java.io.Serializable; @@ -43,6 +46,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; + "WHERE p.name LIKE CONCAT('%', :name, '%')" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = PublisherIdResolver.class, + property = "uuid" +) public class Publisher implements Serializable { private static final long serialVersionUID = 1L; @@ -70,6 +78,7 @@ public class Publisher implements Serializable { private String place; @OneToMany(mappedBy = "publisher") + @JsonIgnore private List publications; public Publisher() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublisherIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/PublisherIdResolver.java new file mode 100644 index 0000000..60acaa8 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublisherIdResolver.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; + +/** + * + * @author Jens Pelzetter + */ +public class PublisherIdResolver 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(PublisherRepository.class) + .findByUuid(id.key.toString()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Pubisher with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new PublicationIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof PublicationIdResolver; + } + + + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Series.java b/sci-publications/src/main/java/org/scientificcms/publications/Series.java index c7da6bf..b743800 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Series.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Series.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.libreccm.l10n.LocalizedString; @@ -42,6 +45,11 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; query = "SELECT DISTINCT s FROM Series s JOIN s.title.values t WHERE lower(t) LIKE CONCAT ('%', :title, '%')" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = SeriesIdResolver.class, + property = "uuid" +) public class Series implements Serializable { private static final long serialVersionUID = 1L; @@ -81,6 +89,7 @@ public class Series implements Serializable { private LocalizedString description; @OneToMany(mappedBy = "series") + @JsonIgnore private List volumes; public Series() { diff --git a/sci-publications/src/main/java/org/scientificcms/publications/SeriesIdResolver.java b/sci-publications/src/main/java/org/scientificcms/publications/SeriesIdResolver.java new file mode 100644 index 0000000..757f4d6 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/SeriesIdResolver.java @@ -0,0 +1,53 @@ +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; + +/** + * + * @author Jens Pelzetter + */ +public class SeriesIdResolver 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(SeriesRepository.class) + .findByUuid(id.key.toString()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Series with UUID %s found in the database.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new SeriesIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof SeriesIdResolver; + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java b/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java index feda44b..bf0dc2e 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java @@ -5,6 +5,9 @@ */ 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.io.Serializable; @@ -28,6 +31,10 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; @Entity @Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA) @Audited +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) public class VolumeInSeries implements Serializable { private static final long serialVersionUID = 1L; @@ -45,10 +52,12 @@ public class VolumeInSeries implements Serializable { @ManyToOne @JoinColumn(name = "PUBLICATION_ID") + @JsonIdentityReference(alwaysAsId = true) private Publication publication; @ManyToOne @JoinColumn(name = "SERIES_ID") + @JsonIdentityReference(alwaysAsId = true) private Series series; public long getVolumeId() { diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java index bc6a9cd..1186f54 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Contact.java @@ -5,6 +5,9 @@ */ package org.scientificcms.contenttypes.sciproject; +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.libreccm.core.CcmObjects; import org.librecms.assets.ContactableEntity; @@ -30,6 +33,10 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; @Entity @Audited @Table(name = "PROJECT_CONTACTS", schema = DB_SCHEMA) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) public class Contact implements Serializable { private static final long serialVersionUID = 1L; @@ -47,10 +54,12 @@ public class Contact implements Serializable { @ManyToOne @JoinColumn(name = "PROJECT_ID") + @JsonIdentityReference(alwaysAsId = true) private SciProject project; @ManyToOne @JoinColumn(name = "CONTACTABLE_ID") + @JsonIdentityReference(alwaysAsId = true) private ContactableEntity contactable; public long getContactId() { diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java index df9c6d6..d0ab075 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Membership.java @@ -5,6 +5,9 @@ */ package org.scientificcms.contenttypes.sciproject; +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.libreccm.core.CcmObjects; import org.librecms.assets.Person; @@ -32,6 +35,10 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; @Entity @Audited @Table(name = "PROJECT_MEMBERSHIPS", schema = DB_SCHEMA) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) public class Membership implements Serializable { private static final long serialVersionUID = 1L; @@ -50,10 +57,12 @@ public class Membership implements Serializable { @ManyToOne @JoinColumn(name = "PROJECT_ID") + @JsonIdentityReference(alwaysAsId = true) private SciProject project; @ManyToOne @JoinColumn(name = "MEMBER_ID") + @JsonIdentityReference(alwaysAsId = true) private Person member; public long getMembershipId() { diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java index bb7a438..7fc269a 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProject.java @@ -5,6 +5,11 @@ */ package org.scientificcms.contenttypes.sciproject; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; + import javax.persistence.Entity; import org.hibernate.envers.Audited; @@ -88,6 +93,11 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; + "WHERE m.member = :member" ) }) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + resolver = SciProjectIdResolver.class, + property = "uuid" +) public class SciProject extends ContentItem implements Serializable { private static final long serialVersionUID = 1L; @@ -142,17 +152,20 @@ public class SciProject extends ContentItem implements Serializable { ) private LocalizedString fundingVolume; + @OneToMany(cascade = CascadeType.ALL, mappedBy = "project") @OrderBy("order ASC") + @JsonIgnore private List contacts; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) -// @OrderBy("member.personName ASC") @OrderBy("member ASC") + @JsonIgnore private List members; @OneToMany(mappedBy = "project", cascade = CascadeType.ALL) @OrderBy("order ASC") + @JsonIgnore private List sponsoring; public SciProject() { diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectIdResolver.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectIdResolver.java new file mode 100644 index 0000000..a81b8e0 --- /dev/null +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/SciProjectIdResolver.java @@ -0,0 +1,57 @@ +package org.scientificcms.contenttypes.sciproject; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdResolver; +import org.libreccm.cdi.utils.CdiUtil; +import org.librecms.contentsection.ContentItemRepository; + +import java.io.Serializable; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class SciProjectIdResolver 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(ContentItemRepository.class) + .findByUuid(id.key.toString(), SciProject.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No SciProject with UUID %s found in the datbase.", + id.key.toString() + ) + ) + ); + } + + @Override + public ObjectIdResolver newForDeserialization(final Object context) { + return new SciProjectIdResolver(); + } + + @Override + public boolean canUseFor(final ObjectIdResolver resolverType) { + return resolverType instanceof SciProjectIdResolver; + } + +} diff --git a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java index 47049b6..e54ca32 100644 --- a/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java +++ b/sci-types-project/src/main/java/org/scientificcms/contenttypes/sciproject/Sponsoring.java @@ -5,6 +5,9 @@ */ package org.scientificcms.contenttypes.sciproject; +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.libreccm.core.CcmObjects; import org.librecms.assets.Organization; @@ -30,6 +33,10 @@ import static org.scientificcms.contenttypes.sciproject.SciProjectConstants.*; @Entity @Audited @Table(name = "SPONSORING", schema = DB_SCHEMA) +@JsonIdentityInfo( + generator = ObjectIdGenerators.PropertyGenerator.class, + property = "uuid" +) public class Sponsoring implements Serializable { private static final long serialVersionUID = 1L; @@ -47,10 +54,12 @@ public class Sponsoring implements Serializable { @ManyToOne @JoinColumn(name = "PROJECT_ID") + @JsonIdentityReference(alwaysAsId = true) private SciProject project; @ManyToOne @JoinColumn(name = "SPONSOR_ID") + @JsonIdentityReference(alwaysAsId = true) private Organization sponsor; public long getSponsoringId() {