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 0895577..14f512e 100644
--- a/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java
+++ b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolume.java
@@ -10,7 +10,6 @@ import org.hibernate.envers.Audited;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeManager.java b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeManager.java
new file mode 100644
index 0000000..c351536
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/CollectedVolumeManager.java
@@ -0,0 +1,77 @@
+/*
+ * 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.contentsection.privileges.ItemPrivileges;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class CollectedVolumeManager implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Inject
+ private PublicationRepository publicationRepository;
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void addArticleToCollectedVolume(
+ final ArticleInCollectedVolume article,
+ final CollectedVolume collectedVolume
+ ) {
+ Objects.requireNonNull(article);
+ Objects.requireNonNull(collectedVolume);
+
+ article.setCollectedVolume(collectedVolume);
+ collectedVolume.addArticle(article);
+
+ publicationRepository.save(article);
+ publicationRepository.save(collectedVolume);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void removeArticleFromCollectedVolume(
+ final ArticleInCollectedVolume article,
+ final CollectedVolume collectedVolume
+ ) {
+ Objects.requireNonNull(article);
+ Objects.requireNonNull(collectedVolume);
+
+ if (!collectedVolume.equals(article.getCollectedVolume())
+ || !collectedVolume.getArticles().contains(article)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "The provided article %s is not an article of the "
+ + "provided collected volume %s.",
+ article.getUuid(),
+ collectedVolume.getUuid()
+ )
+ );
+ }
+
+ article.setCollectedVolume(null);
+ collectedVolume.removeArticle(article);
+
+ publicationRepository.save(article);
+ publicationRepository.save(collectedVolume);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/JournalManager.java b/sci-publications/src/main/java/org/scientificcms/publications/JournalManager.java
new file mode 100644
index 0000000..c609457
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/JournalManager.java
@@ -0,0 +1,74 @@
+/*
+ * 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.contentsection.privileges.ItemPrivileges;
+
+import java.util.Objects;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class JournalManager {
+
+ @Inject
+ private JournalRepository journalRepository;
+
+ @Inject
+ private PublicationRepository publicationRepository;
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void addArticleToJournal(final ArticleInJournal article,
+ final Journal journal) {
+ Objects.requireNonNull(article);
+ Objects.requireNonNull(journal);
+
+ article.setJournal(journal);
+ journal.addArticle(article);
+
+ publicationRepository.save(article);
+ journalRepository.save(journal);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void removeArticleFromJournal(final ArticleInJournal article,
+ final Journal journal) {
+
+ Objects.requireNonNull(article);
+ Objects.requireNonNull(journal);
+
+ if (!journal.equals(article.getJournal())
+ || !journal.getArticles().contains(article)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "The provided article %s is not an article of the "
+ + "provided journal %s.",
+ article.getUuid(),
+ journal.getUuid()
+ )
+ );
+ }
+
+ article.setJournal(null);
+ journal.removeArticle(article);
+
+ publicationRepository.save(article);
+ journalRepository.save(journal);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/JournalRepository.java b/sci-publications/src/main/java/org/scientificcms/publications/JournalRepository.java
index 6afc28e..2d86063 100644
--- a/sci-publications/src/main/java/org/scientificcms/publications/JournalRepository.java
+++ b/sci-publications/src/main/java/org/scientificcms/publications/JournalRepository.java
@@ -7,6 +7,8 @@ package org.scientificcms.publications;
import org.libreccm.core.AbstractEntityRepository;
+import java.util.UUID;
+
/**
*
* @author Jens Pelzetter
@@ -34,5 +36,11 @@ public class JournalRepository extends AbstractEntityRepository{
public boolean isNew(final Journal entity) {
return entity.getJournalId() == 0;
}
+
+ @Override
+ protected void initNewEntity(final Journal entity) {
+ entity.setUuid(UUID.randomUUID().toString());
+ }
+
}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsManager.java b/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsManager.java
new file mode 100644
index 0000000..9abafa2
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/ProceedingsManager.java
@@ -0,0 +1,72 @@
+/*
+ * 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.contentsection.privileges.ItemPrivileges;
+
+import java.util.Objects;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class ProceedingsManager {
+
+ @Inject
+ private PublicationRepository publicationRepository;
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void addPaperToCollectedVolume(final InProceedings paper,
+ final Proceedings proceedings) {
+ Objects.requireNonNull(paper);
+ Objects.requireNonNull(proceedings);
+
+ paper.setProceedings(proceedings);
+ proceedings.addPaper(paper);
+
+ publicationRepository.save(paper);
+ publicationRepository.save(proceedings);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void removeArticleFromCollectedVolume(
+ final InProceedings paper,
+ final Proceedings collectedVolume
+ ) {
+ Objects.requireNonNull(paper);
+ Objects.requireNonNull(collectedVolume);
+
+ if (!collectedVolume.equals(paper.getProceedings())
+ || !collectedVolume.getPapers().contains(paper)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "The provided paper %s is not a paper of the "
+ + "provided proceedings %s.",
+ paper.getUuid(),
+ collectedVolume.getUuid()
+ )
+ );
+ }
+
+ paper.setProceedings(null);
+ collectedVolume.removePaper(paper);
+
+ publicationRepository.save(paper);
+ publicationRepository.save(collectedVolume);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java
index d0244d4..0245ace 100644
--- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java
+++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java
@@ -27,10 +27,13 @@ public class PublicationManager {
@Inject
private PublicationRepository publicationRepository;
-
+
@Inject
private EntityManager entityManager;
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
public void addAuthor(final Person person,
final Publication toPublication) {
@@ -43,6 +46,9 @@ public class PublicationManager {
toPublication.getAuthorships().size());
}
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
public void addAuthor(final Person person,
final Publication toPublication,
final boolean asEditor) {
@@ -69,7 +75,7 @@ public class PublicationManager {
public void addAuthor(final Person person,
final Publication toPublication,
final boolean asEditor,
- final long atPosition) {
+ final int atPosition) {
Objects.requireNonNull(person);
Objects.requireNonNull(toPublication);
@@ -115,27 +121,192 @@ public class PublicationManager {
publicationRepository.save(toPublication);
}
- public void removeAuthor(final Person author,
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void removeAuthor(final Person author,
final Publication fromPublication) {
-
+
final Optional result = fromPublication
- .getAuthorships()
- .stream()
- .filter(authorship -> authorship.getAuthor().equals(author))
- .findAny();
-
+ .getAuthorships()
+ .stream()
+ .filter(authorship -> authorship.getAuthor().equals(author))
+ .findAny();
+
if (!result.isPresent()) {
- return ;
+ return;
}
-
+
final Authorship remove = result.get();
fromPublication.removeAuthorship(remove);
-
- for(int i = 0; i < fromPublication.getAuthorships().size(); i++) {
+
+ for (int i = 0; i < fromPublication.getAuthorships().size(); i++) {
fromPublication.getAuthorships().get(i).setAuthorOrder(i);
}
-
+
entityManager.remove(remove);
publicationRepository.save(fromPublication);
}
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void moveAuthorToPosition(final Publication ofPublication,
+ final Person author,
+ final int toPosition) {
+
+ Objects.requireNonNull(ofPublication);
+ Objects.requireNonNull(author);
+ if (toPosition < 0) {
+ throw new IllegalArgumentException(
+ "Can't move author to a negative position."
+ );
+ }
+
+ final Optional result = ofPublication
+ .getAuthorships()
+ .stream()
+ .filter(authorship -> authorship.getAuthor().equals(author))
+ .findAny();
+
+ if (result.isEmpty()) {
+ throw new IllegalArgumentException(
+ String.format(
+ "Person %s is not an author of the publication %s.",
+ Objects.toString(author),
+ Objects.toString(ofPublication)
+ )
+ );
+ }
+
+ moveAuthorshipToPosition(ofPublication, result.get(), toPosition);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void moveAuthorshipToPosition(final Publication ofPublication,
+ final Authorship moving,
+ final int toPosition) {
+
+ Objects.requireNonNull(ofPublication);
+ Objects.requireNonNull(moving);
+ if (toPosition < 0) {
+ throw new IllegalArgumentException(
+ "Can't move author to a negative position."
+ );
+ }
+
+ if (toPosition < moving.getAuthorOrder()) {
+ ofPublication
+ .getAuthorships()
+ .stream()
+ .filter(
+ authorship -> authorship.getAuthorOrder() >= toPosition
+ && authorship.getAuthorOrder()
+ < moving.getAuthorOrder()
+ )
+ .forEach(
+ authorship -> authorship.setAuthorOrder(
+ authorship.getAuthorOrder() + 1
+ )
+ );
+ moving.setAuthorOrder(toPosition);
+
+ } else if (toPosition > moving.getAuthorOrder()) {
+ ofPublication
+ .getAuthorships()
+ .stream()
+ .filter(
+ authorship -> authorship.getAuthorOrder() > moving
+ .getAuthorOrder()
+ && authorship.getAuthorOrder()
+ <= toPosition
+ )
+ .forEach(
+ authorship -> authorship.setAuthorOrder(
+ authorship.getAuthorOrder() - 1
+ )
+ );
+ } else {
+ // Nothing to do
+ return;
+ }
+
+ publicationRepository.save(ofPublication);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void swapWithPrevious(final Publication publication,
+ final Authorship authorship) {
+
+ Objects.requireNonNull(publication);
+ Objects.requireNonNull(authorship);
+
+ if (!publication.getAuthorships().contains(authorship)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "Provided Authorship entity %s is not part of "
+ + "the provided Publication entity %s.",
+ Objects.toString(authorship),
+ Objects.toString(publication)
+ )
+ );
+ }
+
+ if (authorship.getAuthorOrder() == 0) {
+ return;
+ }
+
+ final Authorship previous = publication
+ .getAuthorships()
+ .get((int) authorship.getAuthorOrder() - 1);
+ final long previousOrder = previous.getAuthorOrder();
+ final long movingOrder = authorship.getAuthorOrder();
+
+ previous.setAuthorOrder(movingOrder);
+ authorship.setAuthorOrder(previousOrder);
+
+ publicationRepository.save(publication);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void swapWithNext(final Publication publication,
+ final Authorship authorship) {
+
+ Objects.requireNonNull(publication);
+ Objects.requireNonNull(authorship);
+
+ if (!publication.getAuthorships().contains(authorship)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "Provided Authorship entity %s is not part of "
+ + "the provided Publication entity %s.",
+ Objects.toString(authorship),
+ Objects.toString(publication)
+ )
+ );
+ }
+
+ if (authorship.getAuthorOrder() > publication
+ .getAuthorships().size() - 1) {
+ return;
+ }
+
+ final Authorship next = publication
+ .getAuthorships()
+ .get((int) authorship.getAuthorOrder() + 1);
+ final long nextOrder = next.getAuthorOrder();
+ final long movingOrder = authorship.getAuthorOrder();
+
+ next.setAuthorOrder(movingOrder);
+ authorship.setAuthorOrder(nextOrder);
+
+ publicationRepository.save(publication);
+ }
+
}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java b/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java
index 714b601..416a17a 100644
--- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java
+++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationRepository.java
@@ -7,6 +7,8 @@ package org.scientificcms.publications;
import org.libreccm.core.AbstractEntityRepository;
+import java.util.UUID;
+
import javax.enterprise.context.RequestScoped;
/**
@@ -38,5 +40,11 @@ public class PublicationRepository
public Class getEntityClass() {
return Publication.class;
}
+
+ @Override
+ public void initNewEntity(final Publication entity) {
+ final String uuid = UUID.randomUUID().toString();
+ entity.setUuid(uuid);
+ }
}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublisherManager.java b/sci-publications/src/main/java/org/scientificcms/publications/PublisherManager.java
new file mode 100644
index 0000000..b587699
--- /dev/null
+++ b/sci-publications/src/main/java/org/scientificcms/publications/PublisherManager.java
@@ -0,0 +1,77 @@
+/*
+ * 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.contentsection.privileges.ItemPrivileges;
+
+import java.util.Objects;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class PublisherManager {
+
+ @Inject
+ private PublicationRepository publicationRepository;
+
+ @Inject
+ private PublisherRepository publisherRepository;
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void addPublicationToPublisher(
+ final PublicationWithPublisher publication,
+ final Publisher publisher
+ ) {
+ Objects.requireNonNull(publication);
+ Objects.requireNonNull(publisher);
+
+ publication.setPublisher(publisher);
+ publisher.addPublication(publication);
+
+ publicationRepository.save(publication);
+ publisherRepository.save(publisher);
+ }
+
+ @AuthorizationRequired
+ @RequiresPrivilege(ItemPrivileges.EDIT)
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void removePublicationFromPublisher(
+ final PublicationWithPublisher publication,
+ final Publisher publisher
+ ) {
+ Objects.requireNonNull(publication);
+ Objects.requireNonNull(publisher);
+
+ if (!publisher.equals(publication.getPublisher())
+ || !publisher.getPublications().contains(publication)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "The provided publication %s is not an publication of the "
+ + "provided publisher %s.",
+ publication.getUuid(),
+ publisher.getUuid()
+ )
+ );
+ }
+
+ publication.setPublisher(null);
+ publisher.removePublication(publication);
+
+ publicationRepository.save(publication);
+ publisherRepository.save(publisher);
+ }
+
+}
diff --git a/sci-publications/src/main/java/org/scientificcms/publications/PublisherRepository.java b/sci-publications/src/main/java/org/scientificcms/publications/PublisherRepository.java
index fd7d0e1..9d1f102 100644
--- a/sci-publications/src/main/java/org/scientificcms/publications/PublisherRepository.java
+++ b/sci-publications/src/main/java/org/scientificcms/publications/PublisherRepository.java
@@ -7,12 +7,14 @@ package org.scientificcms.publications;
import org.libreccm.core.AbstractEntityRepository;
+import java.util.UUID;
+
/**
*
* @author Jens Pelzetter
*/
-public class PublisherRepository
- extends AbstractEntityRepository{
+public class PublisherRepository
+ extends AbstractEntityRepository {
private static final long serialVersionUID = 1L;
@@ -35,5 +37,10 @@ public class PublisherRepository
public boolean isNew(final Publisher entity) {
return entity.getPublisherId() == 0;
}
-
+
+ @Override
+ protected void initNewEntity(final Publisher entity) {
+ entity.setUuid(UUID.randomUUID().toString());
+ }
+
}