- Filter für die Publikationen einer Reihe in der Detailansicht von Series

- Code Cleanup


git-svn-id: https://svn.libreccm.org/ccm/trunk@2273 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-07-26 13:16:20 +00:00
parent 142a0c6969
commit c5306b93b1
7 changed files with 409 additions and 226 deletions

View File

@ -89,7 +89,7 @@ association {
Integer[0..1] publicationOrder = cms_organizationalunits_publications_map.publication_order INTEGER; Integer[0..1] publicationOrder = cms_organizationalunits_publications_map.publication_order INTEGER;
} }
//Retrieves the publications (the ids). Allows filtering for a orgaunit id //Retrieves the publications of an organizational unit (the ids). Allows filtering for a orgaunit id
//The authors are merged into one field in the result, each publication will //The authors are merged into one field in the result, each publication will
//only appear one time //only appear one time
query getIdsOfPublicationsForOrgaUnit { query getIdsOfPublicationsForOrgaUnit {
@ -107,12 +107,52 @@ query getIdsOfPublicationsForOrgaUnit {
join cms_organizationalunits_publications_map on ct_publication_bundles.bundle_id = cms_organizationalunits_publications_map.publication_id join cms_organizationalunits_publications_map on ct_publication_bundles.bundle_id = cms_organizationalunits_publications_map.publication_id
where cms_organizationalunits_publications_map.orgaunit_id in :orgaunitIds where cms_organizationalunits_publications_map.orgaunit_id in :orgaunitIds
} map { } map {
publicationId =ct_publication_bundles.bundle_id; publicationId = ct_publication_bundles.bundle_id;
orgaunitId = cms_organizationalunits_publications_map.orgaunit_id; orgaunitId = cms_organizationalunits_publications_map.orgaunit_id;
name = cms_items.name; name = cms_items.name;
} }
} }
//Retrieves the publications of a series (the ids). Allows filtering for a orgaunit id
//The authors are merged into one field in the result, each publication will
//only appear one time
query getIdsOfPublicationsForSeries {
BigDecimal publicationId;
BigDecimal seriesId;
String name;
String volumeOfSeries;
do {
select distinct on (ct_publication_bundles.bundle_id)
ct_publication_bundles.bundle_id,
cms_items.name,
ct_publications_volume_in_series.series_id,
ct_publications_volume_in_series.volumeOfSeries
from ct_publication_bundles
join cms_items on ct_publication_bundles.bundle_id = cms_items.item_id
join ct_publications_volume_in_series on ct_publication_bundles.bundle_id = ct_publications_volume_in_series.publication_id
where ct_publications_volume_in_series.series_id = :seriesId
} map {
publicationId = ct_publication_bundles.bundle_id;
seriesId = ct_publications_volume_in_series.series_id;
name = cms_items.name;
volumeOfSeries = ct_publications_volume_in_series.volumeOfSeries;
}
}
query getVolumeOfSeries {
String volumeOfSeries;
do {
select ct_publications_volume_in_series.volumeOfSeries
from ct_publications_volume_in_series
where ct_publications_volume_in_series.series_id = :seriesId
and ct_publications_volume_in_series.publication_id = :publicationId
} map {
volumeOfSeries = ct_publications_volume_in_series.volumeOfSeries;
}
}
//Retrieves all publications of an author //Retrieves all publications of an author
query getPublicationsForAuthor { query getPublicationsForAuthor {
BigDecimal publicationId; BigDecimal publicationId;

View File

@ -31,6 +31,7 @@ import java.util.List;
/** /**
* *
* @author Jens Pelzetter * @author Jens Pelzetter
* @version $Id$
*/ */
public class Series extends ContentPage { public class Series extends ContentPage {

View File

@ -27,37 +27,40 @@ import org.apache.log4j.Logger;
/** /**
* *
* @author Jens Pelzetter * @author Jens Pelzetter
* @version $Id$
*/ */
public class VolumeInSeriesCollection extends DomainCollection { public class VolumeInSeriesCollection extends DomainCollection {
public static final String LINK_VOLUME_OF_SERIES = "link.volumeOfSeries"; public static final String LINK_VOLUME = "link.volumeOfSeries";
public static final String VOLUME_OF_SERIES = "volumeOfSeries"; public static final String VOLUME_OF_SERIES = "volumeOfSeries";
public static final Logger s_log = public static final Logger LOGGER = Logger.getLogger(VolumeInSeriesCollection.class);
Logger.getLogger(VolumeInSeriesCollection.class);
public VolumeInSeriesCollection(DataCollection dataCollection) { public VolumeInSeriesCollection(final DataCollection dataCollection) {
super(dataCollection); super(dataCollection);
m_dataCollection.addOrder(LINK_VOLUME_OF_SERIES); m_dataCollection.addOrder(LINK_VOLUME);
} }
public Integer getVolumeOfSeries() { public String getVolumeOfSeries() {
return (Integer) m_dataCollection.get(LINK_VOLUME_OF_SERIES); return (String) m_dataCollection.get(LINK_VOLUME);
} }
public void setVolumeOfSeries(Integer volumeOfSeries) { public void setVolumeOfSeries(final String volumeOfSeries) {
DataObject link = (DataObject) this.get("link"); final DataObject link = (DataObject) this.get("link");
link.set(VOLUME_OF_SERIES, volumeOfSeries); link.set(VOLUME_OF_SERIES, volumeOfSeries);
} }
public Publication getPublication() { public Publication getPublication() {
final PublicationBundle bundle = (PublicationBundle) DomainObjectFactory.newInstance(m_dataCollection.getDataObject()); final PublicationBundle bundle = (PublicationBundle) DomainObjectFactory.newInstance(m_dataCollection.
getDataObject());
return (Publication) bundle.getPrimaryInstance(); return (Publication) bundle.getPrimaryInstance();
} }
public Publication getPublication(final String language) { public Publication getPublication(final String language) {
final PublicationBundle bundle = (PublicationBundle) DomainObjectFactory.newInstance(m_dataCollection.getDataObject()); final PublicationBundle bundle = (PublicationBundle) DomainObjectFactory.newInstance(m_dataCollection.
getDataObject());
return (Publication) bundle.getInstance(language); return (Publication) bundle.getInstance(language);
} }
} }

View File

@ -21,19 +21,32 @@ package com.arsdigita.cms.contenttypes.ui;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentPage;
import com.arsdigita.cms.ExtraXMLGenerator; import com.arsdigita.cms.ExtraXMLGenerator;
import com.arsdigita.cms.contenttypes.EditshipCollection; import com.arsdigita.cms.contenttypes.EditshipCollection;
import com.arsdigita.cms.contenttypes.GenericPerson; import com.arsdigita.cms.contenttypes.GenericPerson;
import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.Publication;
import com.arsdigita.cms.contenttypes.Series; import com.arsdigita.cms.contenttypes.Series;
import com.arsdigita.cms.contenttypes.VolumeInSeriesCollection; import com.arsdigita.cms.contenttypes.ui.panels.SelectFilter;
import com.arsdigita.cms.contenttypes.ui.panels.TextFilter;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator; import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.globalization.Globalization;
import com.arsdigita.globalization.GlobalizationHelper; import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.Filter;
import com.arsdigita.persistence.FilterFactory;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.math.BigDecimal;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
/** /**
* *
@ -43,6 +56,25 @@ import java.util.Locale;
public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
private boolean listMode = false; private boolean listMode = false;
private static final String YEAR_PARAM = "yearOfPublication";
private static final String TITLE_PARAM = "title";
private static final String AUTHOR_PARAM = "author";
private final SelectFilter yearFilter = new SelectFilter(YEAR_PARAM,
YEAR_PARAM,
true,
true,
false,
true,
true);
private final TextFilter titleFilter = new TextFilter(TITLE_PARAM,
ContentPage.TITLE);
private final TextFilter authorFilter;
public SeriesExtraXmlGenerator() {
super();
authorFilter = new TextFilter(AUTHOR_PARAM, "authorsStr");
}
public void generateXML(final ContentItem item, public void generateXML(final ContentItem item,
final Element element, final Element element,
@ -114,18 +146,46 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
private void createVolumesXml(final Series series, private void createVolumesXml(final Series series,
final Element parent, final Element parent,
final PageState state) { final PageState state) {
final VolumeInSeriesCollection volumes = series.getVolumes(); //final VolumeInSeriesCollection volumes = series.getVolumes();
if ((volumes == null) || volumes.isEmpty()) { final DataQuery volumes = getData(series);
if ((volumes == null)) {
return; return;
} }
final HttpServletRequest request = state.getRequest();
final String yearValue = Globalization.decodeParameter(request, YEAR_PARAM);
final String titleValue = Globalization.decodeParameter(request, TITLE_PARAM);
final String authorValue = Globalization.decodeParameter(request, AUTHOR_PARAM);
final Element filtersElem = parent.newChildElement("filters");
yearFilter.setDataQuery(volumes, YEAR_PARAM);
applyYearFilter(volumes, request);
applyTitleFilter(volumes, request);
applyAuthorFilter(volumes, request);
yearFilter.generateXml(filtersElem);
titleFilter.generateXml(filtersElem);
authorFilter.generateXml(filtersElem);
if (volumes.isEmpty()) {
return;
}
final Element volumesElem = parent.newChildElement("volumes"); final Element volumesElem = parent.newChildElement("volumes");
while (volumes.next()) { while (volumes.next()) {
createVolumeXml(volumes.getPublication(GlobalizationHelper. // createVolumeXml(volumes.getPublication(GlobalizationHelper.
getNegotiatedLocale().getLanguage()), // getNegotiatedLocale().getLanguage()),
volumes.getVolumeOfSeries(), // volumes.getVolumeOfSeries(),
// volumesElem,
// state);
createVolumeXml((BigDecimal) volumes.get("id"),
series.getSeriesBundle().getID(),
(String) volumes.get("objectType"),
volumesElem, volumesElem,
state); state);
} }
} }
@ -154,19 +214,39 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
longDateFormat.format(date)); longDateFormat.format(date));
generator.addItemAttribute(String.format("%sMonthName", prefix), generator.addItemAttribute(String.format("%sMonthName", prefix),
cal.getDisplayName(Calendar.MONTH, cal.getDisplayName(Calendar.MONTH,
Calendar.LONG, Calendar.LONG,
locale)); locale));
} }
private void createVolumeXml(final BigDecimal publicationId,
final BigDecimal seriesId,
final String objectType,
final Element parent,
final PageState state) {
final Publication publication = (Publication) DomainObjectFactory.
newInstance(new OID(objectType, publicationId));
final DataQuery query = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getVolumeOfSeries");
query.setParameter("seriesId", seriesId);
query.setParameter("publicationId", publication.getPublicationBundle().getID());
query.next();
final String volume = (String) query.get("volumeOfSeries");
query.close();
createVolumeXml(publication, volume, parent, state);
}
private void createVolumeXml(final Publication publication, private void createVolumeXml(final Publication publication,
final Integer volume, final String volume,
final Element volumesElem, final Element volumesElem,
final PageState state) { final PageState state) {
final XmlGenerator generator = new XmlGenerator(publication); final XmlGenerator generator = new XmlGenerator(publication);
generator.setItemElemName("publication", ""); generator.setItemElemName("publication", "");
if (volume != null) { if (volume != null) {
generator.addItemAttribute("volumeNr", volume.toString()); generator.addItemAttribute("volumeNr", volume);
} }
generator.setListMode(true); generator.setListMode(true);
generator.generateXML(state, volumesElem, ""); generator.generateXML(state, volumesElem, "");
@ -180,6 +260,83 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
this.listMode = listMode; this.listMode = listMode;
} }
private void applyYearFilter(final DataQuery publications,
final HttpServletRequest request) {
final String yearValue = Globalization.decodeParameter(request, YEAR_PARAM);
if ((yearValue != null) && !(yearValue.trim().isEmpty())) {
yearFilter.setValue(yearValue);
}
if ((yearFilter.getFilter() != null)
&& !(yearFilter.getFilter().isEmpty())) {
publications.addFilter(yearFilter.getFilter());
}
}
private void applyTitleFilter(final DataQuery publications,
final HttpServletRequest request) {
final String titleValue = Globalization.decodeParameter(request, TITLE_PARAM);
if ((titleValue != null) && !(titleValue.trim().isEmpty())) {
titleFilter.setValue(titleValue);
}
if ((titleFilter.getFilter() != null)
&& !(titleFilter.getFilter().isEmpty())) {
publications.addFilter(titleFilter.getFilter());
}
}
private void applyAuthorFilter(final DataQuery publications,
final HttpServletRequest request) {
final String authorValue = Globalization.decodeParameter(request, AUTHOR_PARAM);
if ((authorValue != null) && !(authorValue.trim().isEmpty())) {
authorFilter.setValue(authorValue);
}
if ((authorFilter.getFilter() != null)
&& !(authorFilter.getFilter().isEmpty())) {
publications.addFilter(authorFilter.getFilter());
}
}
private DataCollection getData(final Series series) {
final DataQuery publicationBundlesQuery = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getIdsOfPublicationsForSeries");
publicationBundlesQuery.setParameter("seriesId", series.getSeriesBundle().getID().toString());
final StringBuilder filterBuilder = new StringBuilder();
while (publicationBundlesQuery.next()) {
if (filterBuilder.length() > 0) {
filterBuilder.append(',');
}
filterBuilder.append(publicationBundlesQuery.get("publicationId").toString());
}
final DataCollection publicationsQuery = SessionManager.getSession().retrieve(Publication.BASE_DATA_OBJECT_TYPE);
if (filterBuilder.length() == 0) {
//No publications return null to indicate
return null;
}
publicationsQuery.addFilter(String.format("parent.id in (%s)", filterBuilder.toString()));
if (Kernel.getConfig().languageIndependentItems()) {
final FilterFactory filterFactory = publicationsQuery.getFilterFactory();
final Filter filter = filterFactory.or().
addFilter(filterFactory.equals("language", GlobalizationHelper.getNegotiatedLocale().getLanguage())).
addFilter(filterFactory.and().
addFilter(filterFactory.equals("language", GlobalizationHelper.LANG_INDEPENDENT)).
addFilter(filterFactory.notIn("parent", "com.arsdigita.navigation.getParentIDsOfMatchedItems").set(
"language", GlobalizationHelper.getNegotiatedLocale().getLanguage())));
publicationsQuery.addFilter(filter);
} else {
publicationsQuery.addEqualsFilter("language", GlobalizationHelper.getNegotiatedLocale().getLanguage());
}
return publicationsQuery;
}
private class XmlGenerator extends SimpleXMLGenerator { private class XmlGenerator extends SimpleXMLGenerator {
private final ContentItem item; private final ContentItem item;
@ -193,5 +350,6 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
protected ContentItem getContentItem(final PageState state) { protected ContentItem getContentItem(final PageState state) {
return item; return item;
} }
} }
} }

View File

@ -22,11 +22,10 @@ import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.bebop.parameters.ParameterModel; import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.ContentType; import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.contenttypes.Publication; import com.arsdigita.cms.contenttypes.Publication;
@ -35,68 +34,61 @@ import com.arsdigita.cms.contenttypes.VolumeInSeriesCollection;
import com.arsdigita.cms.ui.ItemSearchWidget; import com.arsdigita.cms.ui.ItemSearchWidget;
import com.arsdigita.cms.ui.authoring.BasicItemForm; import com.arsdigita.cms.ui.authoring.BasicItemForm;
import com.arsdigita.cms.ui.authoring.SimpleEditStep; import com.arsdigita.cms.ui.authoring.SimpleEditStep;
import org.apache.log4j.Logger;
/** /**
* *
* @author Jens Pelzetter * @author Jens Pelzetter
* @version $Id$ * @version $Id$
*/ */
@SuppressWarnings("PMD.LongVariable")
public class SeriesVolumeAddForm extends BasicItemForm { public class SeriesVolumeAddForm extends BasicItemForm {
private static final Logger s_log = Logger.getLogger( private static final String ITEM_SEARCH = "volumes";
SeriesVolumeAddForm.class); //private final SeriesPropertiesStep seriesStep;
private SeriesPropertiesStep m_step; private ItemSearchWidget itemSearch;
private ItemSearchWidget m_itemSearch; //private final SaveCancelSection saveCancelSection;
private SaveCancelSection m_saveCancelSection; //private final ItemSelectionModel itemModel;
private final String ITEM_SEARCH = "volumes"; private final SimpleEditStep editStep;
private ItemSelectionModel m_itemModel;
private SimpleEditStep editStep;
private Label selectedVolumeLabel; private Label selectedVolumeLabel;
private TextField volumeOfSeries; private TextField volumeOfSeries;
public SeriesVolumeAddForm(ItemSelectionModel itemModel, public SeriesVolumeAddForm(final ItemSelectionModel itemModel, final SimpleEditStep editStep) {
SimpleEditStep editStep) {
super("VolumesEntryForm", itemModel); super("VolumesEntryForm", itemModel);
m_itemModel = itemModel; //itemModel = itemModel;
this.editStep = editStep; this.editStep = editStep;
} }
@Override @Override
protected void addWidgets() { protected void addWidgets() {
add(new Label((String) PublicationGlobalizationUtil.globalize( add(new Label(PublicationGlobalizationUtil.globalize(
"publications.ui.series.volumes.select_publication"). "publications.ui.series.volumes.select_publication")));
localize())); itemSearch = new ItemSearchWidget(
m_itemSearch = new ItemSearchWidget(
ITEM_SEARCH, ITEM_SEARCH,
ContentType.findByAssociatedObjectType( ContentType.findByAssociatedObjectType(
Publication.class.getName())); Publication.class.getName()));
m_itemSearch.setDisableCreatePane(true); itemSearch.setDisableCreatePane(true);
add(m_itemSearch); add(itemSearch);
selectedVolumeLabel = new Label(""); selectedVolumeLabel = new Label("");
add(selectedVolumeLabel); add(selectedVolumeLabel);
add(new Label((String) PublicationGlobalizationUtil.globalize( add(new Label(PublicationGlobalizationUtil.globalize("publications.ui.series.volume_of_series")));
"publications.ui.series.volume_of_series").localize())); ParameterModel volumeOfSeriesParam = new StringParameter(VolumeInSeriesCollection.VOLUME_OF_SERIES);
ParameterModel volumeOfSeriesParam = new IntegerParameter(
VolumeInSeriesCollection.VOLUME_OF_SERIES);
volumeOfSeries = new TextField(volumeOfSeriesParam); volumeOfSeries = new TextField(volumeOfSeriesParam);
add(volumeOfSeries); add(volumeOfSeries);
} }
@Override @Override
public void init(FormSectionEvent fse) throws FormProcessException { public void init(final FormSectionEvent fse) throws FormProcessException {
FormData data = fse.getFormData(); final FormData data = fse.getFormData();
PageState state = fse.getPageState(); final PageState state = fse.getPageState();
final Publication publication = ((SeriesVolumesStep) editStep). final Publication publication = ((SeriesVolumesStep) editStep).
getSelectedPublication(); getSelectedPublication();
final Integer volume = final String volume = ((SeriesVolumesStep) editStep).getSelectedVolume();
((SeriesVolumesStep) editStep).getSelectedVolume();
if (publication == null) { if (publication == null) {
m_itemSearch.setVisible(state, true); itemSearch.setVisible(state, true);
selectedVolumeLabel.setVisible(state, false); selectedVolumeLabel.setVisible(state, false);
} else { } else {
data.put(ITEM_SEARCH, publication); data.put(ITEM_SEARCH, publication);
@ -106,7 +98,7 @@ public class SeriesVolumeAddForm extends BasicItemForm {
volumeOfSeries.setValue(state, volume); volumeOfSeries.setValue(state, volume);
} }
m_itemSearch.setVisible(state, false); itemSearch.setVisible(state, false);
selectedVolumeLabel.setLabel(publication.getTitle()); selectedVolumeLabel.setLabel(publication.getTitle());
selectedVolumeLabel.setVisible(state, true); selectedVolumeLabel.setVisible(state, true);
} }
@ -115,23 +107,21 @@ public class SeriesVolumeAddForm extends BasicItemForm {
} }
@Override @Override
public void process(FormSectionEvent fse) throws FormProcessException { public void process(final FormSectionEvent fse) throws FormProcessException {
FormData data = fse.getFormData(); final FormData data = fse.getFormData();
PageState state = fse.getPageState(); final PageState state = fse.getPageState();
Series series = (Series) getItemSelectionModel(). final Series series = (Series) getItemSelectionModel().getSelectedObject(state);
getSelectedObject(state);
if (!(this.getSaveCancelSection().getCancelButton(). if (!(this.getSaveCancelSection().getCancelButton().
isSelected(state))) { isSelected(state))) {
Publication volume = ((SeriesVolumesStep) editStep). Publication volume = ((SeriesVolumesStep) editStep).
getSelectedPublication(); getSelectedPublication();
Integer volOfSeries; final String volOfSeries;
if (this.volumeOfSeries.getValue(state) == null) { if (this.volumeOfSeries.getValue(state) == null) {
volOfSeries = null; volOfSeries = null;
} else { } else {
volOfSeries = data.getInteger( volOfSeries = data.getString(VolumeInSeriesCollection.VOLUME_OF_SERIES);
VolumeInSeriesCollection.VOLUME_OF_SERIES);
} }
if (volume == null) { if (volume == null) {
@ -141,7 +131,7 @@ public class SeriesVolumeAddForm extends BasicItemForm {
series.addVolume(volume, (String) data.get(VolumeInSeriesCollection.VOLUME_OF_SERIES)); series.addVolume(volume, (String) data.get(VolumeInSeriesCollection.VOLUME_OF_SERIES));
} else { } else {
VolumeInSeriesCollection volumes = series.getVolumes(); final VolumeInSeriesCollection volumes = series.getVolumes();
while (volumes.next()) { while (volumes.next()) {
if (volumes.getPublication().equals(volume)) { if (volumes.getPublication().equals(volume)) {
@ -162,7 +152,7 @@ public class SeriesVolumeAddForm extends BasicItemForm {
} }
@Override @Override
public void validate(FormSectionEvent fse) throws FormProcessException { public void validate(final FormSectionEvent fse) throws FormProcessException {
final PageState state = fse.getPageState(); final PageState state = fse.getPageState();
final FormData data = fse.getFormData(); final FormData data = fse.getFormData();
boolean editing = false; boolean editing = false;
@ -175,8 +165,7 @@ public class SeriesVolumeAddForm extends BasicItemForm {
return; return;
} }
Series series = (Series) getItemSelectionModel(). final Series series = (Series) getItemSelectionModel().getSelectedObject(state);
getSelectedObject(state);
Publication volume = (Publication) data.get(ITEM_SEARCH); Publication volume = (Publication) data.get(ITEM_SEARCH);
if (volume == null) { if (volume == null) {
volume = ((SeriesVolumesStep) editStep).getSelectedPublication(); volume = ((SeriesVolumesStep) editStep).getSelectedPublication();
@ -185,9 +174,8 @@ public class SeriesVolumeAddForm extends BasicItemForm {
if (!editing) { if (!editing) {
VolumeInSeriesCollection volumes = series.getVolumes(); final VolumeInSeriesCollection volumes = series.getVolumes();
volumes.addFilter( volumes.addFilter(String.format("id = %s", volume.getID().toString()));
String.format("id = %s", volume.getID().toString()));
if (volumes.size() > 0) { if (volumes.size() > 0) {
data.addError(PublicationGlobalizationUtil.globalize( data.addError(PublicationGlobalizationUtil.globalize(
"publications.ui.series.volume_of_series.already_added")); "publications.ui.series.volume_of_series.already_added"));

View File

@ -32,32 +32,30 @@ import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
*/ */
public class SeriesVolumesStep extends SimpleEditStep { public class SeriesVolumesStep extends SimpleEditStep {
@SuppressWarnings("PMD.LongVariable")
protected static final String ADD_VOLUME_SHEET_NAME = "addVolume"; protected static final String ADD_VOLUME_SHEET_NAME = "addVolume";
@SuppressWarnings("PMD.LongVariable")
private Publication selectedPublication; private Publication selectedPublication;
private Integer selectedVolume; private String selectedVolume;
public SeriesVolumesStep( public SeriesVolumesStep(final ItemSelectionModel itemModel,
ItemSelectionModel itemModel, final AuthoringKitWizard parent) {
AuthoringKitWizard parent) {
this(itemModel, parent, null); this(itemModel, parent, null);
} }
public SeriesVolumesStep( public SeriesVolumesStep(final ItemSelectionModel itemModel,
ItemSelectionModel itemModel, final AuthoringKitWizard parent,
AuthoringKitWizard parent, final String prefix) {
String prefix) {
super(itemModel, parent, prefix); super(itemModel, parent, prefix);
BasicItemForm addVolumeSheet = final BasicItemForm addVolumeSheet =
new SeriesVolumeAddForm(itemModel, this); new SeriesVolumeAddForm(itemModel, this);
add(ADD_VOLUME_SHEET_NAME, add(ADD_VOLUME_SHEET_NAME,
(String) PublicationGlobalizationUtil.globalize( PublicationGlobalizationUtil.globalize("publications.ui.series.add_volume"),
"publications.ui.series.add_volume").localize(),
new WorkflowLockedComponentAccess(addVolumeSheet, itemModel), new WorkflowLockedComponentAccess(addVolumeSheet, itemModel),
addVolumeSheet.getSaveCancelSection().getCancelButton()); addVolumeSheet.getSaveCancelSection().getCancelButton());
SeriesVolumesTable volumesTable = new SeriesVolumesTable( final SeriesVolumesTable volumesTable = new SeriesVolumesTable(itemModel, this);
itemModel, this);
setDisplayComponent(volumesTable); setDisplayComponent(volumesTable);
} }
@ -65,15 +63,17 @@ public class SeriesVolumesStep extends SimpleEditStep {
return selectedPublication; return selectedPublication;
} }
@SuppressWarnings("PMD.LongVariable")
public void setSelectedPublication(final Publication selectedPublication) { public void setSelectedPublication(final Publication selectedPublication) {
this.selectedPublication = selectedPublication; this.selectedPublication = selectedPublication;
} }
public Integer getSelectedVolume() { public String getSelectedVolume() {
return selectedVolume; return selectedVolume;
} }
public void setSelectedVolume(final Integer selectedVolume) { public void setSelectedVolume(final String selectedVolume) {
this.selectedVolume = selectedVolume; this.selectedVolume = selectedVolume;
} }
} }

View File

@ -50,27 +50,26 @@ import org.apache.log4j.Logger;
* @author Jens Pelzetter * @author Jens Pelzetter
* @version $Id$ * @version $Id$
*/ */
public class SeriesVolumesTable extends Table implements TableActionListener { public class SeriesVolumesTable extends Table {
private static final Logger s_log = private static final Logger LOGGER = Logger.getLogger(SeriesVolumesTable.class);
Logger.getLogger(SeriesVolumesTable.class); private static final String TABLE_COL_EDIT = "table_col_edit";
private final String TABLE_COL_EDIT = "table_col_edit"; @SuppressWarnings("PMD.LongVariable")
private final String TABLE_COL_EDIT_ASSOC = "table_col_edit_assoc"; private static final String TABLE_COL_EDIT_ASSOC = "table_col_edit_assoc";
private final String TABLE_COL_DEL = "table_col_del"; private static final String TABLE_COL_DEL = "table_col_del";
private ItemSelectionModel m_itemModel; private final ItemSelectionModel m_itemModel;
private SimpleEditStep editStep; private final SimpleEditStep editStep;
public SeriesVolumesTable(ItemSelectionModel itemModel, public SeriesVolumesTable(final ItemSelectionModel itemModel,
SimpleEditStep editStep) { final SimpleEditStep editStep) {
super(); super();
m_itemModel = itemModel; m_itemModel = itemModel;
this.editStep = editStep; this.editStep = editStep;
setEmptyView( setEmptyView(new Label(PublicationGlobalizationUtil.globalize(
new Label(PublicationGlobalizationUtil.globalize(
"publications.ui.series.volumes.none"))); "publications.ui.series.volumes.none")));
TableColumnModel colModel = getColumnModel(); final TableColumnModel colModel = getColumnModel();
colModel.add(new TableColumn( colModel.add(new TableColumn(
0, 0,
PublicationGlobalizationUtil.globalize( PublicationGlobalizationUtil.globalize(
@ -97,54 +96,48 @@ public class SeriesVolumesTable extends Table implements TableActionListener {
colModel.get(2).setCellRenderer(new EditAssocCellRenderer()); colModel.get(2).setCellRenderer(new EditAssocCellRenderer());
colModel.get(3).setCellRenderer(new DeleteCellRenderer()); colModel.get(3).setCellRenderer(new DeleteCellRenderer());
addTableActionListener(this); addTableActionListener(new ActionListener());
} }
private class SeriesVolumesTableModelBuilder private class SeriesVolumesTableModelBuilder extends LockableImpl implements TableModelBuilder {
extends LockableImpl
implements TableModelBuilder {
private ItemSelectionModel m_itemModel; private final ItemSelectionModel m_itemModel;
public SeriesVolumesTableModelBuilder( public SeriesVolumesTableModelBuilder(final ItemSelectionModel itemModel) {
ItemSelectionModel itemModel) {
m_itemModel = itemModel; m_itemModel = itemModel;
} }
public TableModel makeModel(Table table, PageState state) { public TableModel makeModel(final Table table, final PageState state) {
table.getRowSelectionModel().clearSelection(state); table.getRowSelectionModel().clearSelection(state);
Series series = final Series series = (Series) m_itemModel.getSelectedObject(state);
(Series) m_itemModel.getSelectedObject(state); return new SeriesVolumesTableModel(table, series);
return new SeriesVolumesTableModel(table, state, series);
} }
} }
private class SeriesVolumesTableModel implements TableModel { private class SeriesVolumesTableModel implements TableModel {
private final int MAX_DESC_LENGTH = 25; private final Table table;
private Table m_table; private final VolumeInSeriesCollection volumesCollection;
private VolumeInSeriesCollection m_volumesCollection; private Publication publication;
private Publication m_publication;
private SeriesVolumesTableModel( public SeriesVolumesTableModel(final Table table,
Table table, final Series series) {
PageState state, this.table = table;
Series series) { volumesCollection = series.getVolumes();
m_table = table;
m_volumesCollection = series.getVolumes();
} }
@Override @Override
public int getColumnCount() { public int getColumnCount() {
return m_table.getColumnModel().size(); return table.getColumnModel().size();
} }
@Override @Override
public boolean nextRow() { public boolean nextRow() {
boolean ret; boolean ret;
if ((m_volumesCollection != null) && m_volumesCollection.next()) { if ((volumesCollection != null) && volumesCollection.next()) {
m_publication = m_volumesCollection.getPublication(); publication = volumesCollection.getPublication();
ret = true; ret = true;
} else { } else {
ret = false; ret = false;
@ -154,16 +147,15 @@ public class SeriesVolumesTable extends Table implements TableActionListener {
} }
@Override @Override
public Object getElementAt(int columnIndex) { public Object getElementAt(final int columnIndex) {
switch (columnIndex) { switch (columnIndex) {
case 0: case 0:
return m_publication.getTitle(); return publication.getTitle();
case 1: case 1:
return m_volumesCollection.getVolumeOfSeries(); return volumesCollection.getVolumeOfSeries();
case 2: case 2:
return PublicationGlobalizationUtil.globalize( return PublicationGlobalizationUtil.globalize(
"publications.ui.series.volumes.edit_assoc"). "publications.ui.series.volumes.edit_assoc").localize();
localize();
case 3: case 3:
return PublicationGlobalizationUtil.globalize( return PublicationGlobalizationUtil.globalize(
"publication.ui.series.volumes.remove").localize(); "publication.ui.series.volumes.remove").localize();
@ -172,29 +164,32 @@ public class SeriesVolumesTable extends Table implements TableActionListener {
} }
} }
public Object getKeyAt(int columnIndex) { @Override
return m_publication.getID(); public Object getKeyAt(final int columnIndex) {
return publication.getID();
} }
} }
private class EditCellRenderer private class EditCellRenderer extends LockableImpl implements TableCellRenderer {
extends LockableImpl
implements TableCellRenderer { public EditCellRenderer() {
super();
//Nothing
}
@Override @Override
public Component getComponent( public Component getComponent(final Table table,
Table table, final PageState state,
PageState state, final Object value,
Object value, final boolean isSelected,
boolean isSelected, final Object key,
Object key, final int row,
int row, final int col) {
int col) { final SecurityManager securityManager = CMS.getSecurityManager(state);
SecurityManager securityManager = final Series series = (Series) m_itemModel.getSelectedObject(state);
CMS.getSecurityManager(state);
Series series = (Series) m_itemModel.getSelectedObject(state);
boolean canEdit = securityManager.canAccess( final boolean canEdit = securityManager.canAccess(
state.getRequest(), state.getRequest(),
SecurityManager.EDIT_ITEM, SecurityManager.EDIT_ITEM,
series); series);
@ -204,44 +199,46 @@ public class SeriesVolumesTable extends Table implements TableActionListener {
try { try {
volume = new Publication((BigDecimal) key); volume = new Publication((BigDecimal) key);
} catch (ObjectNotFoundException ex) { } catch (ObjectNotFoundException ex) {
s_log.warn(String.format("No object with key '%s' found.", LOGGER.warn(String.format("No object with key '%s' found.",
key), key),
ex); ex);
return new Label(value.toString()); return new Label(value.toString());
} }
ContentSection section = volume.getContentSection();//CMS.getContext().getContentSection(); final ContentSection section = volume.getContentSection();//CMS.getContext().getContentSection();
ItemResolver resolver = section.getItemResolver(); final ItemResolver resolver = section.getItemResolver();
Link link = final Link link = new Link(String.format("%s",
new Link(String.format("%s", value.toString()),
value.toString()), resolver.generateItemURL(state,
resolver.generateItemURL(state, volume,
volume, section,
section, volume.getVersion()));
volume.getVersion()));
return link; return link;
} else { } else {
Publication volume; final Publication volume;
try { try {
volume = new Publication((BigDecimal) key); volume = new Publication((BigDecimal) key);
} catch (ObjectNotFoundException ex) { } catch (ObjectNotFoundException ex) {
s_log.warn(String.format("No object with key '%s' found.", LOGGER.warn(String.format("No object with key '%s' found.",
key), key),
ex); ex);
return new Label(value.toString()); return new Label(value.toString());
} }
Label label = new Label(String.format("%s", final Label label = new Label(String.format("%s",
value.toString())); value.toString()));
return label; return label;
} }
} }
} }
private class EditAssocCellRenderer private class EditAssocCellRenderer extends LockableImpl implements TableCellRenderer {
extends LockableImpl
implements TableCellRenderer { public EditAssocCellRenderer() {
super();
}
public Component getComponent(final Table table, public Component getComponent(final Table table,
final PageState state, final PageState state,
@ -254,96 +251,92 @@ public class SeriesVolumesTable extends Table implements TableActionListener {
CMS.getSecurityManager(state); CMS.getSecurityManager(state);
final Series series = (Series) m_itemModel.getSelectedObject(state); final Series series = (Series) m_itemModel.getSelectedObject(state);
boolean canEdit = securityManager.canAccess( final boolean canEdit = securityManager.canAccess(
state.getRequest(), state.getRequest(),
SecurityManager.EDIT_ITEM, SecurityManager.EDIT_ITEM,
series); series);
if (canEdit) { if (canEdit) {
ControlLink link = new ControlLink(value.toString()); return new ControlLink(value.toString());
return link;
} else { } else {
Label label = new Label(value.toString()); return new Label(value.toString());
return label;
} }
} }
} }
private class DeleteCellRenderer private class DeleteCellRenderer extends LockableImpl implements TableCellRenderer {
extends LockableImpl
implements TableCellRenderer {
@Override @Override
public Component getComponent( public Component getComponent(final Table table,
Table table, final PageState state,
PageState state, final Object value,
Object value, final boolean isSelected,
boolean isSelected, final Object key,
Object key, final int row,
int row, final int col) {
int col) { final SecurityManager securityManager = CMS.getSecurityManager(state);
SecurityManager securityManager = final Series series = (Series) m_itemModel.getSelectedObject(state);
CMS.getSecurityManager(state);
Series series = (Series) m_itemModel.getSelectedObject(state);
boolean canDelete = securityManager.canAccess( final boolean canDelete = securityManager.canAccess(
state.getRequest(), state.getRequest(),
SecurityManager.DELETE_ITEM, SecurityManager.DELETE_ITEM,
series); series);
if (canDelete) { if (canDelete) {
ControlLink link = new ControlLink(value.toString()); final ControlLink link = new ControlLink(value.toString());
link.setConfirmation((String) PublicationGlobalizationUtil. link.setConfirmation((String) PublicationGlobalizationUtil.
globalize( globalize(
"publications.ui.series.volumes.remove.confirm"). "publications.ui.series.volumes.remove.confirm").
localize()); localize());
return link; return link;
} else { } else {
Label label = new Label(value.toString()); final Label label = new Label(value.toString());
return label; return label;
} }
} }
} }
@Override private class ActionListener implements TableActionListener {
public void cellSelected(TableActionEvent event) {
PageState state = event.getPageState();
Publication publication = public ActionListener() {
new Publication(new BigDecimal(event.getRowKey(). //Nothing
toString())); }
Series series = (Series) m_itemModel.getSelectedObject(state); public void cellSelected(final TableActionEvent event) {
final PageState state = event.getPageState();
TableColumn column = getColumnModel().get(event.getColumn().intValue());
final Publication publication = new Publication(new BigDecimal(event.getRowKey().toString()));
VolumeInSeriesCollection volumes = series.getVolumes();
final Series series = (Series) m_itemModel.getSelectedObject(state);
if (TABLE_COL_EDIT.equals(column.getHeaderKey().toString())) {
} else if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey().toString())) { final TableColumn column = getColumnModel().get(event.getColumn().intValue());
while (volumes.next()) {
if (volumes.getPublication(publication.getLanguage()).equals( final VolumeInSeriesCollection volumes = series.getVolumes();
publication)) {
break; if (TABLE_COL_EDIT_ASSOC.equals(column.getHeaderKey().toString())) {
} while (volumes.next()) {
} if (volumes.getPublication(publication.getLanguage()).equals(publication)) {
break;
((SeriesVolumesStep) editStep).setSelectedPublication( }
publication); }
((SeriesVolumesStep) editStep).setSelectedVolume(volumes.
getVolumeOfSeries()); ((SeriesVolumesStep) editStep).setSelectedPublication(publication);
((SeriesVolumesStep) editStep).setSelectedVolume(volumes.getVolumeOfSeries());
volumes.close();
volumes.close();
editStep.showComponent(state,
SeriesVolumesStep.ADD_VOLUME_SHEET_NAME); editStep.showComponent(state,
} else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) { SeriesVolumesStep.ADD_VOLUME_SHEET_NAME);
series.removeVolume(publication); } else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) {
series.removeVolume(publication);
}
}
public void headSelected(final TableActionEvent event) {
//Nothing to do.
} }
}
@Override
public void headSelected(TableActionEvent event) {
//Nothing to do.
} }
} }