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 new file mode 100644 index 0000000..9b759bd --- /dev/null +++ b/sci-publications/src/main/java/com/arsdigita/cms/contenttypes/ui/PublicationSeriesAddForm.java @@ -0,0 +1,120 @@ +/* + * 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 com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.event.FormInitListener; +import com.arsdigita.bebop.event.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.bebop.parameters.ParameterModel; +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.ui.assets.AssetSearchWidget; +import com.arsdigita.cms.ui.authoring.BasicItemForm; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.scientificcms.publications.SciPublicationsConfig; +import org.scientificcms.publications.SciPublicationsConstants; +import org.scientificcms.publications.contenttypes.PublicationItem; + +/** + * + * @author Jens Pelzetter + */ +public class PublicationSeriesAddForm + extends BasicItemForm + implements FormProcessListener, FormInitListener { + + private static final Logger LOGGER = LogManager.getLogger( + PublicationSeriesAddForm.class + ); + + private static final String SERIES_SEARCH = "series"; + + private final static SciPublicationsConfig CONFIG = SciPublicationsConfig + .getConfig(); + + private PublicationPropertiesStep step; + + private AssetSearchWidget seriesSearchWidget; + + private ItemSelectionModel itemModel; + + private TextField volumeOfSeries; + + public PublicationSeriesAddForm(final ItemSelectionModel itemModel, + final StringParameter selectedLanguageParam) { + super("SeriesEntryForm", itemModel, selectedLanguageParam); + this.itemModel = itemModel; + } + + @Override + protected void addWidgets() { + + seriesSearchWidget = new AssetSearchWidget( + SERIES_SEARCH, + Series.class + ); + seriesSearchWidget.setLabel( + new GlobalizedMessage( + "publications.ui.series.select_series", + SciPublicationsConstants.BUNDLE + ) + ); + add(seriesSearchWidget); + + final ParameterModel volumeOfSeriesParam = new StringParameter( + SciPublicationsController.VOLUME_OF_SERIES + ); + volumeOfSeries = new TextField(volumeOfSeriesParam); + volumeOfSeries.setLabel( + new GlobalizedMessage( + "publications.ui.series.volume_of_series", + SciPublicationsConstants.BUNDLE + ) + ); + add(volumeOfSeries); + } + + @Override + public void init(FormSectionEvent event) throws FormProcessException { + + final PageState state = event.getPageState(); + + setVisible(state, true); + } + + @Override + public void process(final FormSectionEvent event) + throws FormProcessException { + + final FormData data = event.getFormData(); + final PageState state = event.getPageState(); + + final PublicationItem item + = (PublicationItem) getItemSelectionModel(). + getSelectedObject(state); + + if (!(getSaveCancelSection().getCancelButton().isSelected(state))) { + + Series series = (Series) data.get(ITEM_SEARCH); + series = (Series) series.getContentBundle().getInstance(item. + getLanguage()); + + item.addSeries(series, (String) data.get( + VolumeInSeriesCollection.VOLUME_OF_SERIES)); + m_itemSearch.publishCreatedItem(data, series); + } + + init(event); + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java index 022e150..c4ba257 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/Publication.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/Publication.java @@ -117,7 +117,7 @@ public class Publication implements Serializable { joinTable = @JoinTable(name = "PUBLICATION_TITLES", schema = DB_SCHEMA, joinColumns = { - @JoinColumn(name = "OBJECT_ID") + @JoinColumn(name = "PUBLICATION_ID") }) ) private LocalizedString title; @@ -128,7 +128,7 @@ public class Publication implements Serializable { joinTable = @JoinTable(name = "PUBLICATION_SHORT_DESCS", schema = DB_SCHEMA, joinColumns = { - @JoinColumn(name = "OBJECT_ID") + @JoinColumn(name = "PUBLICATION_ID") }) ) private LocalizedString shortDescription; @@ -139,7 +139,7 @@ public class Publication implements Serializable { joinTable = @JoinTable(name = "PUBLICATION_ABSTRACTS", schema = DB_SCHEMA, joinColumns = { - @JoinColumn(name = "OBJECT_ID") + @JoinColumn(name = "PUBLICATION_ID") }) ) private LocalizedString publicationAbstract; @@ -150,7 +150,7 @@ public class Publication implements Serializable { joinTable = @JoinTable(name = "PUBLICATION_MISC", schema = DB_SCHEMA, joinColumns = { - @JoinColumn(name = "OBJECT_ID") + @JoinColumn(name = "PUBLICATION_ID") }) ) private LocalizedString misc; @@ -164,12 +164,16 @@ public class Publication implements Serializable { @Column(name = "LANGUAGE_OF_PUBLICATION") private Locale languageOfPublication; + @OneToMany(mappedBy = "publication") + private List series; + public Publication() { authorships = new ArrayList<>(); title = new LocalizedString(); shortDescription = new LocalizedString(); publicationAbstract = new LocalizedString(); misc = new LocalizedString(); + series = new ArrayList<>(); } public long getPublicationId() { @@ -276,6 +280,26 @@ public class Publication implements Serializable { this.languageOfPublication = languageOfPublication; } + public List getSeries() { + if (series == null) { + return null; + } else { + return Collections.unmodifiableList(series); + } + } + + protected void addSeries(final VolumeInSeries series) { + this.series.add(series); + } + + protected void removeSeries(final VolumeInSeries series) { + this.series.remove(series); + } + + protected void setSeries(final List series) { + this.series = series; + } + @Override public int hashCode() { int hash = 5; 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 bf6d121..d8b716d 100644 --- a/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java +++ b/sci-publications/src/main/java/org/scientificcms/publications/PublicationManager.java @@ -309,4 +309,41 @@ public class PublicationManager { publicationRepository.save(publication); } + @AuthorizationRequired + @RequiresPrivilege(ItemPrivileges.EDIT) + @Transactional(Transactional.TxType.REQUIRED) + public void addSeries( + final Series series, + final Publication publication, + final String volumeInSeries + ) { + Objects.requireNonNull(series); + Objects.requireNonNull(publication); + + final boolean alreadyAdded = publication + .getSeries() + .stream() + .map(VolumeInSeries::getSeries) + .anyMatch(obj -> obj.equals(series)); + + if (alreadyAdded) { + throw new IllegalArgumentException( + String.format( + "Publication %s is already a volume of series %s.", + Objects.toString(publication), + Objects.toString(series) + ) + ); + } + + final VolumeInSeries volume = new VolumeInSeries(); + volume.setPublication(publication); + volume.setSeries(series); + volume.setVolumeOfSeries(volumeInSeries); + publication.addSeries(volume); + series.addVolume(volumeInSeries); + seriesRepository.save(series); + publicationRepository.save(publication); + } + } diff --git a/sci-publications/src/main/java/org/scientificcms/publications/Series.java b/sci-publications/src/main/java/org/scientificcms/publications/Series.java new file mode 100644 index 0000000..658371d --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/Series.java @@ -0,0 +1,205 @@ +/* + * 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.libreccm.l10n.LocalizedString; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import javax.persistence.AssociationOverride; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.NamedQueries; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import static org.scientificcms.publications.SciPublicationsConstants.*; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Table(name = "SERIES", schema = DB_SCHEMA) +@Audited +@NamedQueries({}) +public class Series implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "SERIES_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long seriesId; + + @Column(name = "UUID", unique = true, nullable = false) + private String uuid; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "SERIES_TITLES", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "SERIES_ID") + } + ) + ) + private LocalizedString title; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable( + name = "SERIES_DESCRIPTIONS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "SERIES_ID") + } + ) + ) + private LocalizedString description; + + @OneToMany(mappedBy = "series") + private List volumes; + + public Series() { + title = new LocalizedString(); + description = new LocalizedString(); + volumes = new ArrayList<>(); + } + + public long getSeriesId() { + return seriesId; + } + + protected void setSeriesId(final long seriesId) { + this.seriesId = seriesId; + } + + public String getUuid() { + return uuid; + } + + protected void setUuid(final String uuid) { + this.uuid = uuid; + } + + public LocalizedString getTitle() { + return title; + } + + public void setTitle(final LocalizedString title) { + this.title = title; + } + + public LocalizedString getDescription() { + return description; + } + + public void setDescription(final LocalizedString description) { + this.description = description; + } + + public List getVolumes() { + if (volumes == null) { + return null; + } else { + return Collections.unmodifiableList(volumes); + } + } + + protected void addVolume(final VolumeInSeries volume) { + volumes.add(volume); + } + + protected void removeVolume(final VolumeInSeries volume) { + volumes.remove(volume); + } + + protected void setVolumes(final List volumes) { + this.volumes = new ArrayList<>(volumes); + } + + @Override + public int hashCode() { + int hash = 7; + hash = 71 * hash + (int) (seriesId ^ (seriesId >>> 32)); + hash = 71 * hash + Objects.hashCode(uuid); + hash = 71 * hash + Objects.hashCode(title); + hash = 71 * hash + Objects.hashCode(description); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Series)) { + return false; + } + final Series other = (Series) obj; + if (!other.canEqual(this)) { + return false; + } + if (seriesId != other.getSeriesId()) { + return false; + } + if (!Objects.equals(uuid, other.getUuid())) { + return false; + } + if (!Objects.equals(title, other.getTitle())) { + return false; + } + return Objects.equals(description, other.getDescription()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof Series; + } + + @Override + public final String toString() { + return toString(""); + } + + public String toString(final String data) { + + return String.format( + "%s{ " + + "seriesId = %d, " + + "uuid = %s, " + + "title = %s, " + + "description = %s, " + + "volumes = %s%s" + + " }", + super.toString(), + seriesId, + uuid, + Objects.toString(title), + Objects.toString(description), + Objects.toString(volumes), + data + ); + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java b/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java new file mode 100644 index 0000000..8aa497c --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/VolumeInSeries.java @@ -0,0 +1,148 @@ +/* + * 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 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 Jens Pelzetter + */ +@Entity +@Table(name = "VOLUMES_IN_SERIES", schema = DB_SCHEMA) +public class VolumeInSeries implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "VOLUME_ID") + @GeneratedValue(strategy = GenerationType.AUTO) + private long volumeId; + + @Column(name = "UUID", unique = true, nullable = false) + private String uuid; + + @Column(name = "VOLUME_OF_SERIES") + private String volumeOfSeries; + + @ManyToOne + @JoinColumn(name = "PUBLICATION_ID") + private Publication publication; + + @ManyToOne + @JoinColumn(name = "SERIES_ID") + private Series series; + + public long getVolumeId() { + return volumeId; + } + + protected void setVolumeId(long volumeId) { + this.volumeId = volumeId; + } + + public String getUuid() { + return uuid; + } + + protected void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getVolumeOfSeries() { + return volumeOfSeries; + } + + public void setVolumeOfSeries(final String volumeOfSeries) { + this.volumeOfSeries = volumeOfSeries; + } + + public Publication getPublication() { + return publication; + } + + protected void setPublication(final Publication publication) { + this.publication = publication; + } + + public Series getSeries() { + return series; + } + + protected void setSeries(final Series series) { + this.series = series; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 29 * hash + (int) (volumeId ^ (volumeId >>> 32)); + hash = 29 * hash + Objects.hashCode(uuid); + hash = 29 * hash + Objects.hashCode(volumeOfSeries); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof VolumeInSeries)) { + return false; + } + final VolumeInSeries other = (VolumeInSeries) obj; + if (!other.canEqual(this)) { + return false; + } + if (volumeId != other.getVolumeId()) { + return false; + } + if (!Objects.equals(uuid, other.getUuid())) { + return false; + } + return Objects.equals(volumeOfSeries, other.getVolumeOfSeries()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof VolumeInSeries; + } + + @Override + public final String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format( + "%s{ " + + "volumeId = %d, " + + "uuid = %s, " + + "volumeInSeries = \"%s\"%s" + + " }", + super.toString(), + volumeId, + uuid, + volumeOfSeries, + data + ); + } + +} diff --git a/sci-publications/src/main/java/org/scientificcms/publications/assets/SeriesAsset.java b/sci-publications/src/main/java/org/scientificcms/publications/assets/SeriesAsset.java new file mode 100644 index 0000000..0ab00a4 --- /dev/null +++ b/sci-publications/src/main/java/org/scientificcms/publications/assets/SeriesAsset.java @@ -0,0 +1,17 @@ +/* + * 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.assets; + +import javax.persistence.Entity; + +/** + * + * @author Jens Pelzetter + */ +@Entity +public class SeriesAsset { + +}