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()); + } + }