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() {