diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsTable.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsTable.java index 8c8029a..da9a22c 100644 --- a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsTable.java +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationAuthorsTable.java @@ -20,7 +20,6 @@ import com.arsdigita.bebop.table.TableColumnModel; import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.table.TableModelBuilder; import com.arsdigita.cms.ItemSelectionModel; -import com.arsdigita.cms.ui.authoring.SimpleEditStep; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.util.LockableImpl; @@ -28,7 +27,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.security.PermissionChecker; -import org.librecms.assets.Person; import org.librecms.contentsection.privileges.ItemPrivileges; import org.scientificcms.publications.Authorship; import org.scientificcms.publications.SciPublicationsConstants; @@ -71,7 +69,7 @@ public class PublicationAuthorsTable private final PublicationAuthorsPropertyStep editStep; public PublicationAuthorsTable( - final ItemSelectionModel itemModel, + final ItemSelectionModel itemModel, final PublicationAuthorsPropertyStep editStep ) { super(); @@ -159,6 +157,53 @@ public class PublicationAuthorsTable addTableActionListener(this); } + @Override + public void cellSelected(final TableActionEvent event) + throws FormProcessException { + + final PageState state = event.getPageState(); + final PublicationItem selected = (PublicationItem) itemModel + .getSelectedItem(state); + final SciPublicationsController controller = CdiUtil + .createCdiUtil() + .findBean(SciPublicationsController.class); + final Authorship authorship = controller.findAuthorship( + selected.getPublication().getPublicationId(), + event.getRowKey() + ).get(); + + final TableColumn column = getColumnModel().get(event.getColumn()); + + if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey())) { + editStep.setSelectedAuthor(authorship.getAuthor()); + editStep.setSelectedAuthorEditor(authorship.isEditor()); + + editStep.showComponent(state, "AuthorsEntryForm"); + } else if (TABLE_COL_DEL.equals(column.getHeaderKey())) { + controller.removeAuthor( + selected.getPublication().getPublicationId(), + authorship.getAuthorshipId() + ); + } else if (TABLE_COL_UP.equals(column.getHeaderKey())) { + controller.swapWithPrevAuthorship( + selected.getPublication().getPublicationId(), + authorship.getAuthorshipId() + ); + } else if (TABLE_COL_DOWN.equals(column.getHeaderKey())) { + controller.swapWithNextAuthorship( + selected.getPublication().getPublicationId(), + authorship.getAuthorshipId() + ); + + } + } + + @Override + public void headSelected(final TableActionEvent event) { + + // Nothing + } + private class PublicationAuthorsTableModelBuilder extends LockableImpl implements TableModelBuilder { @@ -182,52 +227,6 @@ public class PublicationAuthorsTable } - @Override - public void cellSelected(final TableActionEvent event) - throws FormProcessException { - - final PageState state = event.getPageState(); - final PublicationItem selected = (PublicationItem) itemModel - .getSelectedItem(state); - final SciPublicationsController controller = CdiUtil - .createCdiUtil() - .findBean(SciPublicationsController.class); - final Authorship authorship = controller.findAuthorship( - selected.getPublication().getPublicationId(), event.getRowKey() - ).get(); - - final TableColumn column = getColumnModel().get(event.getColumn()); - - if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey())) { - editStep.setSelectedAuthor(authorship.getAuthor()); - editStep.setSelectedAuthorEditor(authorship.isEditor()); - - editStep.showComponent(state, "AuthorsEntryForm"); - } else if (TABLE_COL_DEL.equals(column.getHeaderKey())) { - controller.removeAuthor( - selected.getPublication().getPublicationId(), - authorship.getAuthorshipId() - ); - } else if (TABLE_COL_UP.equals(column.getHeaderKey())) { - controller.swapWithPrevAuthorship( - selected.getPublication().getPublicationId(), - authorship.getAuthorshipId() - ); - } else if (TABLE_COL_DOWN.equals(column.getHeaderKey())) { - controller.swapWithNextAuthorship( - selected.getPublication().getPublicationId(), - authorship.getAuthorshipId() - ); - - } - } - - @Override - public void headSelected(final TableActionEvent event) { - - // Nothing - } - private class PublicationAuthorsTableModel implements TableModel { private static final int MAX_DESC_LENGTH = 25; @@ -260,9 +259,7 @@ public class PublicationAuthorsTable @Override public boolean nextRow() { - if (iterator.hasNext()) { - currentRow = iterator.next(); return true; } else { diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesAddForm.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesAddForm.java index dfc3325..1490365 100644 --- a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesAddForm.java +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesAddForm.java @@ -76,7 +76,7 @@ public class PublicationSeriesAddForm add(seriesSearchWidget); final ParameterModel volumeOfSeriesParam = new StringParameter( - SciPublicationsController.VOLUME_OF_SERIES + SciPublicationsController.VOLUME_IN_SERIES ); volumeOfSeries = new TextField(volumeOfSeriesParam); volumeOfSeries.setLabel( diff --git a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java index 3eac2c4..93cd9c9 100644 --- a/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/SciPublicationsController.java @@ -11,6 +11,7 @@ import org.scientificcms.publications.Authorship; import org.scientificcms.publications.Publication; import org.scientificcms.publications.PublicationManager; import org.scientificcms.publications.PublicationRepository; +import org.scientificcms.publications.VolumeInSeries; import java.io.Serializable; import java.util.HashMap; @@ -59,8 +60,14 @@ class SciPublicationsController implements Serializable { public static final String AUTHORSHIP_IS_EDITOR = "isEditor"; public static final String AUTHORSHIP_ORDER = "order"; + + public static final String VOLUME_IN_SERIES = "volumeInSeries"; + + public static final String VOLUME_IN_SERIES_ID = "volumeInSeriesId"; + + public static final String VOLUME_IN_SERIES_TITLE = "volumeInSeriesTitle"; - public static final String VOLUME_OF_SERIES = "volumeOfSeries"; + public static final String VOLUME_IN_SERIES_VOLUME = "volumeInSeriesVolume"; @Inject private PersonRepository personRepository; @@ -252,11 +259,8 @@ class SciPublicationsController implements Serializable { ) ); - final Optional authorship = publication - .getAuthorships() - .stream() - .filter(current -> current.getAuthorshipId() == authorshipId) - .findAny(); + final Optional authorship = findAuthorship(publicationId, + authorshipId); if (authorship.isPresent()) { publicationManager.removeAuthor( @@ -352,26 +356,110 @@ class SciPublicationsController implements Serializable { Authorship authorship = null; int index = -1; for (int i = 0; i < authorships.size(); i++) { - + if (authorships.get(i).getAuthorshipId() == authorshipId) { authorship = authorships.get(i); index = i; break; } } - + if (index < authorships.size() && authorship != null) { final long order = authorship.getAuthorOrder(); final Authorship nextAuthorship = authorships.get(index + 1); final long nextOrder = nextAuthorship.getAuthorOrder(); - + authorship.setAuthorOrder(nextOrder); nextAuthorship.setAuthorOrder(order); - + publicationRepository.save(publication); } } + @Transactional(Transactional.TxType.REQUIRED) + public List> getVolumesInSeries( + final long publicationId + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + return publication + .getSeries() + .stream() + .map(this::buildVolumeInSeriesEntry) + .collect(Collectors.toList()); + } + + private Map buildVolumeInSeriesEntry( + final VolumeInSeries volumeInSeries + ) { + Objects.requireNonNull(volumeInSeries); + + final Map result = new HashMap<>(); + result.put(VOLUME_IN_SERIES_ID, volumeInSeries.getVolumeId()); + result.put( + VOLUME_IN_SERIES_TITLE, volumeInSeries.getSeries().getTitle() + ); + result.put(VOLUME_IN_SERIES_VOLUME, volumeInSeries.getVolumeOfSeries()); + + return result; + } + + @Transactional(Transactional.TxType.REQUIRED) + public Optional findVolumeInSeries( + final long publicationId, final Object key + ) { + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final long volumeId = (long) key; + + return publication + .getSeries() + .stream() + .filter(series -> series.getVolumeId() == volumeId) + .findAny(); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void removeSeries(final long publicationId, + final long volumeInSeriesId) { + + final Publication publication = publicationRepository + .findById(publicationId) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No Publication with ID %d found.", publicationId + ) + ) + ); + + final Optional volumeInSeries = findVolumeInSeries( + publicationId, volumeInSeriesId); + + if (volumeInSeries.isPresent()) { + publicationManager.removeSeries( + volumeInSeries.get().getSeries(), + publication + ); + } + } + private boolean filterAuthorship(final Authorship authorship, final Publication publication, final Person author) { 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 ccaa73b..e671ff5 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java @@ -27,7 +27,7 @@ public class PublicationManager { @Inject private EntityManager entityManager; - + @Inject private PublicationRepository publicationRepository; @@ -322,13 +322,13 @@ public class PublicationManager { ) { Objects.requireNonNull(series); Objects.requireNonNull(publication); - + final boolean alreadyAdded = publication - .getSeries() - .stream() - .map(VolumeInSeries::getSeries) - .anyMatch(obj -> obj.equals(series)); - + .getSeries() + .stream() + .map(VolumeInSeries::getSeries) + .anyMatch(obj -> obj.equals(series)); + if (alreadyAdded) { throw new IllegalArgumentException( String.format( @@ -338,7 +338,7 @@ public class PublicationManager { ) ); } - + final VolumeInSeries volume = new VolumeInSeries(); volume.setPublication(publication); volume.setSeries(series); @@ -349,4 +349,30 @@ public class PublicationManager { publicationRepository.save(publication); } + @AuthorizationRequired + @RequiresPrivilege(ItemPrivileges.EDIT) + @Transactional(Transactional.TxType.REQUIRED) + public void removeSeries( + final Series series, final Publication fromPublication + ) { + Objects.requireNonNull(series); + Objects.requireNonNull(fromPublication); + + final Optional result = fromPublication + .getSeries() + .stream() + .filter(volume -> volume.getSeries().equals(series)) + .findAny(); + + if (!result.isPresent()) { + return; + } + + final VolumeInSeries remove = result.get(); + fromPublication.removeSeries(remove); + + entityManager.remove(remove); + publicationRepository.save(fromPublication); + } + } 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 73c8327..c27ef53 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Series.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Series.java @@ -44,10 +44,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; ), @NamedQuery( name = "Series.findByTitle", - query = "SELECT DISTINCT s " - + "FROM Series s " - + "JOIN s.title.values t " - + "WHERE lower(t) LIKE CONCAT ('%', :title, '%')" + query = "SELECT DISTINCT s FROM Series s JOIN s.title.values t WHERE lower(t) LIKE CONCAT ('%', :title, '%')" ) }) public class Series implements Serializable { 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 8aa497c..feda44b 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,8 @@ */ package org.scientificcms.publications; +import org.hibernate.envers.Audited; + import java.io.Serializable; import java.util.Objects; @@ -25,6 +27,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*; */ @Entity @Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA) +@Audited public class VolumeInSeries implements Serializable { private static final long serialVersionUID = 1L;