Manager for publications (especially authorships)
parent
d9c8c10ac5
commit
9ed08ad047
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
* @param <T>
|
|
||||||
*/
|
|
||||||
public abstract class AbstractPublicationWithPublisherRepository<T extends PublicationWithPublisher>
|
|
||||||
extends AbstractPublicationRepository<T> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
* @param <T>
|
|
||||||
*/
|
|
||||||
public abstract class AbstractUnPublishedRepository<T extends UnPublished> extends AbstractPublicationRepository<T> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class ArticleInCollectedVolumeRepository
|
|
||||||
extends AbstractPublicationRepository<ArticleInCollectedVolume> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<ArticleInCollectedVolume> getEntityClass() {
|
|
||||||
return ArticleInCollectedVolume.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class ArticleInJournalRepository
|
|
||||||
extends AbstractPublicationRepository<ArticleInJournal>{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<ArticleInJournal> getEntityClass() {
|
|
||||||
return ArticleInJournal.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* 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 org.hibernate.envers.Audited;
|
||||||
|
import org.librecms.assets.Person;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import static org.scientificcms.publications.SciPublicationsConstants.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "AUTHORSHIPS", schema = DB_SCHEMA)
|
||||||
|
@Audited
|
||||||
|
public class Authorship implements Serializable, Comparable<Authorship> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "AUTHORSHIP_ID")
|
||||||
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
|
private long authorshipId;
|
||||||
|
|
||||||
|
@Column(name = "UUID", length = 36, nullable = false)
|
||||||
|
private String uuid;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "PUBLICATION_ID")
|
||||||
|
private Publication publication;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "AUTHOR_ID")
|
||||||
|
private Person author;
|
||||||
|
|
||||||
|
@Column(name = "EDITOR")
|
||||||
|
private boolean editor;
|
||||||
|
|
||||||
|
@Column(name = "AUTHOR_ORDER")
|
||||||
|
private long authorOrder;
|
||||||
|
|
||||||
|
public long getAuthorshipId() {
|
||||||
|
return authorshipId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAuthorshipId(final long authorshipId) {
|
||||||
|
this.authorshipId = authorshipId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUuid(final String uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Publication getPublication() {
|
||||||
|
return publication;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setPublication(final Publication publication) {
|
||||||
|
this.publication = publication;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Person getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAuthor(final Person author) {
|
||||||
|
this.author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEditor() {
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEditor(final boolean editor) {
|
||||||
|
this.editor = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAuthorOrder() {
|
||||||
|
return authorOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthorOrder(final long authorOrder) {
|
||||||
|
this.authorOrder = authorOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int hash = 7;
|
||||||
|
hash = 59 * hash + (int) (authorshipId ^ (authorshipId >>> 32));
|
||||||
|
hash = 59 * hash + Objects.hashCode(uuid);
|
||||||
|
hash = 59 * hash + (editor ? 1 : 0);
|
||||||
|
hash = 59 * hash + (int) (authorOrder ^ (authorOrder >>> 32));
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(final Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!(obj instanceof Authorship)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final Authorship other = (Authorship) obj;
|
||||||
|
if (!other.canEqual(this)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (authorshipId != other.getAuthorshipId()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (editor != other.isEditor()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return authorOrder == other.getAuthorOrder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canEqual(final Object obj) {
|
||||||
|
return obj instanceof Authorship;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(final Authorship other) {
|
||||||
|
return Long.compare(authorOrder, other.getAuthorOrder());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final String toString() {
|
||||||
|
return toString("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(final String data) {
|
||||||
|
|
||||||
|
return String.format("%s{ "
|
||||||
|
+ "authorshipId = %d, "
|
||||||
|
+ "uuid = %s, "
|
||||||
|
+ "author = %s"
|
||||||
|
+ "editor = %b,"
|
||||||
|
+ "authorOrder = %d%s "
|
||||||
|
+ "}",
|
||||||
|
super.toString(),
|
||||||
|
authorshipId,
|
||||||
|
uuid,
|
||||||
|
Objects.toString(author),
|
||||||
|
editor,
|
||||||
|
authorOrder,
|
||||||
|
data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class CollectedVolumeRepository
|
|
||||||
extends AbstractPublicationWithPublisherRepository<CollectedVolume>{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<CollectedVolume> getEntityClass() {
|
|
||||||
return CollectedVolume.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class ExpertiseRepository extends AbstractPublicationRepository<Expertise> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Expertise> getEntityClass() {
|
|
||||||
return Expertise.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class GreyLiteratureRepository
|
|
||||||
extends AbstractUnPublishedRepository<GreyLiterature>{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<GreyLiterature> getEntityClass() {
|
|
||||||
return GreyLiterature.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class InProceedingsRepository extends AbstractPublicationRepository<InProceedings> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<InProceedings> getEntityClass() {
|
|
||||||
return InProceedings.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class InternetArticleRepository extends AbstractPublicationRepository<InternetArticle>{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<InternetArticle> getEntityClass() {
|
|
||||||
return InternetArticle.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class MonographRepository
|
|
||||||
extends AbstractPublicationWithPublisherRepository<Monograph> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Monograph> getEntityClass() {
|
|
||||||
return Monograph.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class ProceedingsRepository
|
|
||||||
extends AbstractPublicationWithPublisherRepository<Proceedings>{
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Proceedings> getEntityClass() {
|
|
||||||
return Proceedings.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -9,13 +9,18 @@ import org.hibernate.envers.Audited;
|
||||||
import org.libreccm.l10n.LocalizedString;
|
import org.libreccm.l10n.LocalizedString;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import javax.persistence.AssociationOverride;
|
import javax.persistence.AssociationOverride;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Embedded;
|
import javax.persistence.Embedded;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
@ -23,6 +28,8 @@ import javax.persistence.Inheritance;
|
||||||
import javax.persistence.InheritanceType;
|
import javax.persistence.InheritanceType;
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.JoinTable;
|
import javax.persistence.JoinTable;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
|
import javax.persistence.OrderBy;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import static org.scientificcms.publications.SciPublicationsConstants.*;
|
import static org.scientificcms.publications.SciPublicationsConstants.*;
|
||||||
|
|
@ -51,6 +58,13 @@ public class Publication implements Serializable {
|
||||||
@Column(name = "YEAR_OF_PUBLICATION")
|
@Column(name = "YEAR_OF_PUBLICATION")
|
||||||
private Integer yearOfPublication;
|
private Integer yearOfPublication;
|
||||||
|
|
||||||
|
@OneToMany(cascade = CascadeType.ALL,
|
||||||
|
fetch = FetchType.LAZY,
|
||||||
|
mappedBy = "author",
|
||||||
|
orphanRemoval = true)
|
||||||
|
@OrderBy("authorOrder")
|
||||||
|
private List<Authorship> authorships;
|
||||||
|
|
||||||
@Embedded
|
@Embedded
|
||||||
@AssociationOverride(
|
@AssociationOverride(
|
||||||
name = "values",
|
name = "values",
|
||||||
|
|
@ -105,6 +119,7 @@ public class Publication implements Serializable {
|
||||||
private Locale languageOfPublication;
|
private Locale languageOfPublication;
|
||||||
|
|
||||||
public Publication() {
|
public Publication() {
|
||||||
|
authorships = new ArrayList<>();
|
||||||
title = new LocalizedString();
|
title = new LocalizedString();
|
||||||
shortDescription = new LocalizedString();
|
shortDescription = new LocalizedString();
|
||||||
publicationAbstract = new LocalizedString();
|
publicationAbstract = new LocalizedString();
|
||||||
|
|
@ -135,6 +150,30 @@ public class Publication implements Serializable {
|
||||||
this.yearOfPublication = yearOfPublication;
|
this.yearOfPublication = yearOfPublication;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Authorship> getAuthorships() {
|
||||||
|
if (authorships == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return Collections.unmodifiableList(authorships);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addAuthorship(final Authorship authorship) {
|
||||||
|
authorships.add(authorship);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removeAuthorship(final Authorship authorship) {
|
||||||
|
authorships.remove(authorship);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAuthorships(final List<Authorship> authorships) {
|
||||||
|
if (authorships == null) {
|
||||||
|
this.authorships = null;
|
||||||
|
} else {
|
||||||
|
this.authorships = new ArrayList<>(authorships);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public LocalizedString getTitle() {
|
public LocalizedString getTitle() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
@ -197,6 +236,7 @@ public class Publication implements Serializable {
|
||||||
hash = 97 * hash + (int) (publicationId ^ (publicationId >>> 32));
|
hash = 97 * hash + (int) (publicationId ^ (publicationId >>> 32));
|
||||||
hash = 97 * hash + Objects.hashCode(uuid);
|
hash = 97 * hash + Objects.hashCode(uuid);
|
||||||
hash = 97 * hash + Objects.hashCode(yearOfPublication);
|
hash = 97 * hash + Objects.hashCode(yearOfPublication);
|
||||||
|
hash = 97 * hash + Objects.hashCode(authorships);
|
||||||
hash = 97 * hash + Objects.hashCode(title);
|
hash = 97 * hash + Objects.hashCode(title);
|
||||||
hash = 97 * hash + Objects.hashCode(shortDescription);
|
hash = 97 * hash + Objects.hashCode(shortDescription);
|
||||||
hash = 97 * hash + Objects.hashCode(publicationAbstract);
|
hash = 97 * hash + Objects.hashCode(publicationAbstract);
|
||||||
|
|
@ -232,6 +272,9 @@ public class Publication implements Serializable {
|
||||||
if (!Objects.equals(yearOfPublication, other.getYearOfPublication())) {
|
if (!Objects.equals(yearOfPublication, other.getYearOfPublication())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!Objects.equals(authorships, other.getAuthorships())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!Objects.equals(title, other.getTitle())) {
|
if (!Objects.equals(title, other.getTitle())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -266,6 +309,7 @@ public class Publication implements Serializable {
|
||||||
+ "publicationId = %d, "
|
+ "publicationId = %d, "
|
||||||
+ "uuid = \"%s\""
|
+ "uuid = \"%s\""
|
||||||
+ "yearOfPublication = %d, "
|
+ "yearOfPublication = %d, "
|
||||||
|
+ "authorships = %s, "
|
||||||
+ "title = %s, "
|
+ "title = %s, "
|
||||||
+ "shortDescription = %s, "
|
+ "shortDescription = %s, "
|
||||||
+ "publicationAbstract = %s, "
|
+ "publicationAbstract = %s, "
|
||||||
|
|
@ -278,6 +322,7 @@ public class Publication implements Serializable {
|
||||||
publicationId,
|
publicationId,
|
||||||
uuid,
|
uuid,
|
||||||
yearOfPublication,
|
yearOfPublication,
|
||||||
|
authorships,
|
||||||
Objects.toString(title),
|
Objects.toString(title),
|
||||||
Objects.toString(shortDescription),
|
Objects.toString(shortDescription),
|
||||||
Objects.toString(publicationAbstract),
|
Objects.toString(publicationAbstract),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
* 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 org.libreccm.security.AuthorizationRequired;
|
||||||
|
import org.libreccm.security.RequiresPrivilege;
|
||||||
|
import org.librecms.assets.Person;
|
||||||
|
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@RequestScoped
|
||||||
|
public class PublicationManager {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private PublicationRepository publicationRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
public void addAuthor(final Person person,
|
||||||
|
final Publication toPublication) {
|
||||||
|
|
||||||
|
Objects.requireNonNull(person);
|
||||||
|
Objects.requireNonNull(toPublication);
|
||||||
|
|
||||||
|
addAuthor(person,
|
||||||
|
toPublication,
|
||||||
|
false,
|
||||||
|
toPublication.getAuthorships().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAuthor(final Person person,
|
||||||
|
final Publication toPublication,
|
||||||
|
final boolean asEditor) {
|
||||||
|
Objects.requireNonNull(person);
|
||||||
|
Objects.requireNonNull(toPublication);
|
||||||
|
|
||||||
|
addAuthor(person,
|
||||||
|
toPublication,
|
||||||
|
asEditor,
|
||||||
|
toPublication.getAuthorships().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an person as author to a publication.
|
||||||
|
*
|
||||||
|
* @param person
|
||||||
|
* @param toPublication
|
||||||
|
* @param asEditor
|
||||||
|
* @param atPosition
|
||||||
|
*/
|
||||||
|
@AuthorizationRequired
|
||||||
|
@RequiresPrivilege(ItemPrivileges.EDIT)
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public void addAuthor(final Person person,
|
||||||
|
final Publication toPublication,
|
||||||
|
final boolean asEditor,
|
||||||
|
final long atPosition) {
|
||||||
|
|
||||||
|
Objects.requireNonNull(person);
|
||||||
|
Objects.requireNonNull(toPublication);
|
||||||
|
if (atPosition < 0) {
|
||||||
|
throw new IllegalArgumentException("position can't less than 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
// First check if person is already an author.
|
||||||
|
final boolean alreadyAdded = toPublication
|
||||||
|
.getAuthorships()
|
||||||
|
.stream()
|
||||||
|
.map(Authorship::getAuthor)
|
||||||
|
.anyMatch(author -> author.equals(person));
|
||||||
|
if (alreadyAdded) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format(
|
||||||
|
"Person %s is already an author of "
|
||||||
|
+ "publication %s.",
|
||||||
|
Objects.toString(person),
|
||||||
|
Objects.toString(toPublication)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create authorship relation
|
||||||
|
final long numberOfAuthors = toPublication.getAuthorships().size();
|
||||||
|
final Authorship authorship = new Authorship();
|
||||||
|
authorship.setAuthor(person);
|
||||||
|
authorship.setPublication(toPublication);
|
||||||
|
authorship.setEditor(asEditor);
|
||||||
|
if (atPosition >= numberOfAuthors) {
|
||||||
|
authorship.setAuthorOrder(numberOfAuthors);
|
||||||
|
} else {
|
||||||
|
authorship.setAuthorOrder(atPosition);
|
||||||
|
toPublication
|
||||||
|
.getAuthorships()
|
||||||
|
.stream()
|
||||||
|
.filter(obj -> obj.getAuthorOrder() >= atPosition)
|
||||||
|
.forEach(obj -> obj.setAuthorOrder(obj.getAuthorOrder() + 1));
|
||||||
|
|
||||||
|
}
|
||||||
|
toPublication.addAuthorship(authorship);
|
||||||
|
publicationRepository.save(toPublication);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeAuthor(final Person author,
|
||||||
|
final Publication fromPublication) {
|
||||||
|
|
||||||
|
final Optional<Authorship> result = fromPublication
|
||||||
|
.getAuthorships()
|
||||||
|
.stream()
|
||||||
|
.filter(authorship -> authorship.getAuthor().equals(author))
|
||||||
|
.findAny();
|
||||||
|
|
||||||
|
if (!result.isPresent()) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Authorship remove = result.get();
|
||||||
|
fromPublication.removeAuthorship(remove);
|
||||||
|
|
||||||
|
for(int i = 0; i < fromPublication.getAuthorships().size(); i++) {
|
||||||
|
fromPublication.getAuthorships().get(i).setAuthorOrder(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
entityManager.remove(remove);
|
||||||
|
publicationRepository.save(fromPublication);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,13 +7,15 @@ package org.scientificcms.publications;
|
||||||
|
|
||||||
import org.libreccm.core.AbstractEntityRepository;
|
import org.libreccm.core.AbstractEntityRepository;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
* @param <T>
|
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractPublicationRepository<T extends Publication>
|
@RequestScoped
|
||||||
extends AbstractEntityRepository<Long, T> {
|
public class PublicationRepository
|
||||||
|
extends AbstractEntityRepository<Long, Publication> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
@ -23,13 +25,18 @@ public abstract class AbstractPublicationRepository<T extends Publication>
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getIdOfEntity(final T entity) {
|
public Long getIdOfEntity(final Publication entity) {
|
||||||
return entity.getPublicationId();
|
return entity.getPublicationId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isNew(final T entity) {
|
public boolean isNew(final Publication entity) {
|
||||||
return entity.getPublicationId() == 0;
|
return entity.getPublicationId() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Publication> getEntityClass() {
|
||||||
|
return Publication.class;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class TalkRepository extends AbstractPublicationRepository<Talk> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Talk> getEntityClass() {
|
|
||||||
return Talk.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
||||||
*/
|
|
||||||
public class WorkingPaperRepository extends AbstractUnPublishedRepository<WorkingPaper> {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<WorkingPaper> getEntityClass() {
|
|
||||||
return WorkingPaper.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -32,6 +32,7 @@ public class EqualsAndHashCodeTest extends EqualsVerifier {
|
||||||
return Arrays.asList(new Class<?>[]{
|
return Arrays.asList(new Class<?>[]{
|
||||||
ArticleInCollectedVolume.class,
|
ArticleInCollectedVolume.class,
|
||||||
ArticleInJournal.class,
|
ArticleInJournal.class,
|
||||||
|
Authorship.class,
|
||||||
CollectedVolume.class,
|
CollectedVolume.class,
|
||||||
Expertise.class,
|
Expertise.class,
|
||||||
GreyLiterature.class,
|
GreyLiterature.class,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue