Table for Series

pull/1/head
Jens Pelzetter 2019-10-19 17:09:51 +02:00
parent 96aee1917a
commit 6f5e33403a
6 changed files with 185 additions and 74 deletions

View File

@ -20,7 +20,6 @@ import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder; import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
@ -28,7 +27,6 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.librecms.assets.Person;
import org.librecms.contentsection.privileges.ItemPrivileges; import org.librecms.contentsection.privileges.ItemPrivileges;
import org.scientificcms.publications.Authorship; import org.scientificcms.publications.Authorship;
import org.scientificcms.publications.SciPublicationsConstants; import org.scientificcms.publications.SciPublicationsConstants;
@ -159,29 +157,6 @@ public class PublicationAuthorsTable
addTableActionListener(this); addTableActionListener(this);
} }
private class PublicationAuthorsTableModelBuilder
extends LockableImpl
implements TableModelBuilder {
private ItemSelectionModel itemModel;
public PublicationAuthorsTableModelBuilder(
final ItemSelectionModel itemModel
) {
this.itemModel = itemModel;
}
@Override
public TableModel makeModel(final Table table, final PageState state) {
table.getRowSelectionModel().clearSelection(state);
final PublicationItem<?> publication = (PublicationItem) itemModel
.getSelectedObject(state);
return new PublicationAuthorsTableModel(table, state, publication);
}
}
@Override @Override
public void cellSelected(final TableActionEvent event) public void cellSelected(final TableActionEvent event)
throws FormProcessException { throws FormProcessException {
@ -193,7 +168,8 @@ public class PublicationAuthorsTable
.createCdiUtil() .createCdiUtil()
.findBean(SciPublicationsController.class); .findBean(SciPublicationsController.class);
final Authorship authorship = controller.findAuthorship( final Authorship authorship = controller.findAuthorship(
selected.getPublication().getPublicationId(), event.getRowKey() selected.getPublication().getPublicationId(),
event.getRowKey()
).get(); ).get();
final TableColumn column = getColumnModel().get(event.getColumn()); final TableColumn column = getColumnModel().get(event.getColumn());
@ -228,6 +204,29 @@ public class PublicationAuthorsTable
// Nothing // Nothing
} }
private class PublicationAuthorsTableModelBuilder
extends LockableImpl
implements TableModelBuilder {
private ItemSelectionModel itemModel;
public PublicationAuthorsTableModelBuilder(
final ItemSelectionModel itemModel
) {
this.itemModel = itemModel;
}
@Override
public TableModel makeModel(final Table table, final PageState state) {
table.getRowSelectionModel().clearSelection(state);
final PublicationItem<?> publication = (PublicationItem) itemModel
.getSelectedObject(state);
return new PublicationAuthorsTableModel(table, state, publication);
}
}
private class PublicationAuthorsTableModel implements TableModel { private class PublicationAuthorsTableModel implements TableModel {
private static final int MAX_DESC_LENGTH = 25; private static final int MAX_DESC_LENGTH = 25;
@ -260,9 +259,7 @@ public class PublicationAuthorsTable
@Override @Override
public boolean nextRow() { public boolean nextRow() {
if (iterator.hasNext()) { if (iterator.hasNext()) {
currentRow = iterator.next(); currentRow = iterator.next();
return true; return true;
} else { } else {

View File

@ -76,7 +76,7 @@ public class PublicationSeriesAddForm
add(seriesSearchWidget); add(seriesSearchWidget);
final ParameterModel volumeOfSeriesParam = new StringParameter( final ParameterModel volumeOfSeriesParam = new StringParameter(
SciPublicationsController.VOLUME_OF_SERIES SciPublicationsController.VOLUME_IN_SERIES
); );
volumeOfSeries = new TextField(volumeOfSeriesParam); volumeOfSeries = new TextField(volumeOfSeriesParam);
volumeOfSeries.setLabel( volumeOfSeries.setLabel(

View File

@ -11,6 +11,7 @@ import org.scientificcms.publications.Authorship;
import org.scientificcms.publications.Publication; import org.scientificcms.publications.Publication;
import org.scientificcms.publications.PublicationManager; import org.scientificcms.publications.PublicationManager;
import org.scientificcms.publications.PublicationRepository; import org.scientificcms.publications.PublicationRepository;
import org.scientificcms.publications.VolumeInSeries;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
@ -60,7 +61,13 @@ class SciPublicationsController implements Serializable {
public static final String AUTHORSHIP_ORDER = "order"; public static final String AUTHORSHIP_ORDER = "order";
public static final String VOLUME_OF_SERIES = "volumeOfSeries"; 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_IN_SERIES_VOLUME = "volumeInSeriesVolume";
@Inject @Inject
private PersonRepository personRepository; private PersonRepository personRepository;
@ -252,11 +259,8 @@ class SciPublicationsController implements Serializable {
) )
); );
final Optional<Authorship> authorship = publication final Optional<Authorship> authorship = findAuthorship(publicationId,
.getAuthorships() authorshipId);
.stream()
.filter(current -> current.getAuthorshipId() == authorshipId)
.findAny();
if (authorship.isPresent()) { if (authorship.isPresent()) {
publicationManager.removeAuthor( publicationManager.removeAuthor(
@ -372,6 +376,90 @@ class SciPublicationsController implements Serializable {
} }
} }
@Transactional(Transactional.TxType.REQUIRED)
public List<Map<String, Object>> 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<String, Object> buildVolumeInSeriesEntry(
final VolumeInSeries volumeInSeries
) {
Objects.requireNonNull(volumeInSeries);
final Map<String, Object> 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<VolumeInSeries> 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> volumeInSeries = findVolumeInSeries(
publicationId, volumeInSeriesId);
if (volumeInSeries.isPresent()) {
publicationManager.removeSeries(
volumeInSeries.get().getSeries(),
publication
);
}
}
private boolean filterAuthorship(final Authorship authorship, private boolean filterAuthorship(final Authorship authorship,
final Publication publication, final Publication publication,
final Person author) { final Person author) {

View File

@ -324,10 +324,10 @@ public class PublicationManager {
Objects.requireNonNull(publication); Objects.requireNonNull(publication);
final boolean alreadyAdded = publication final boolean alreadyAdded = publication
.getSeries() .getSeries()
.stream() .stream()
.map(VolumeInSeries::getSeries) .map(VolumeInSeries::getSeries)
.anyMatch(obj -> obj.equals(series)); .anyMatch(obj -> obj.equals(series));
if (alreadyAdded) { if (alreadyAdded) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
@ -349,4 +349,30 @@ public class PublicationManager {
publicationRepository.save(publication); 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<VolumeInSeries> 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);
}
} }

View File

@ -44,10 +44,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*;
), ),
@NamedQuery( @NamedQuery(
name = "Series.findByTitle", name = "Series.findByTitle",
query = "SELECT DISTINCT s " query = "SELECT DISTINCT s FROM Series s JOIN s.title.values t WHERE lower(t) LIKE CONCAT ('%', :title, '%')"
+ "FROM Series s "
+ "JOIN s.title.values t "
+ "WHERE lower(t) LIKE CONCAT ('%', :title, '%')"
) )
}) })
public class Series implements Serializable { public class Series implements Serializable {

View File

@ -5,6 +5,8 @@
*/ */
package org.scientificcms.publications; package org.scientificcms.publications;
import org.hibernate.envers.Audited;
import java.io.Serializable; import java.io.Serializable;
import java.util.Objects; import java.util.Objects;
@ -25,6 +27,7 @@ import static org.scientificcms.publications.SciPublicationsConstants.*;
*/ */
@Entity @Entity
@Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA) @Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA)
@Audited
public class VolumeInSeries implements Serializable { public class VolumeInSeries implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;