diff --git a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig.java b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig.java index c43ca1876..abb91d1a8 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig.java @@ -69,6 +69,7 @@ public class PublicationsConfig extends AbstractConfig { private final Parameter defaultArticlesInJournalFolderPath; private final Parameter defaultPublicationsFolderID; private final Parameter defaultPublicationsFolderPath; + private final Parameter seriesVolumesOrder; private final Parameter orgaType; private final Parameter orgaBundleType; private final Parameter enableFirstPublishedProperty; @@ -245,6 +246,11 @@ public class PublicationsConfig extends AbstractConfig { Parameter.OPTIONAL, null); + seriesVolumesOrder = new StringParameter( + "com.arsdigita.cms.contenttypes.publications.series.volumes_order", + Parameter.REQUIRED, + "desc"); + orgaType = new StringParameter( "com.arsdigita.cms.contenttypes.publications.organization_type", Parameter.OPTIONAL, @@ -296,6 +302,7 @@ public class PublicationsConfig extends AbstractConfig { register(defaultArticlesInJournalFolderPath); register(defaultPublicationsFolderID); register(defaultPublicationsFolderPath); + register(seriesVolumesOrder); register(orgaType); register(orgaBundleType); register(enableFirstPublishedProperty); @@ -657,7 +664,7 @@ public class PublicationsConfig extends AbstractConfig { return (Integer) get(defaultInProceedingsFolderID); } } - + public String getDefaultInProceedingsFolderPath() { if (get(defaultInProceedingsFolderPath) == null) { return null; @@ -665,7 +672,7 @@ public class PublicationsConfig extends AbstractConfig { return (String) get(defaultInProceedingsFolderPath); } } - + public Folder getDefaultInProceedingsFolder() { return getDefaultFolder(getDefaultInProceedingsFolderPath(), getDefaultInProceedingsFolderID()); @@ -710,7 +717,7 @@ public class PublicationsConfig extends AbstractConfig { return (Integer) get(defaultPublicationsFolderID); } } - + public String getDefaultPublicationsFolderPath() { if (get(defaultPublicationsFolderPath) == null) { return null; @@ -718,12 +725,16 @@ public class PublicationsConfig extends AbstractConfig { return (String) get(defaultPublicationsFolderPath); } } - + public Folder getDefaultPublicationsFolder() { return getDefaultFolder(getDefaultPublicationsFolderPath(), getDefaultPublicationsFolderID()); } + public String getSeriesVolumeOrder() { + return (String) get(seriesVolumesOrder); + } + public String getOrganizationType() { return (String) get(orgaType); } @@ -739,4 +750,5 @@ public class PublicationsConfig extends AbstractConfig { public Boolean getEnableLanguageProperty() { return (Boolean) get(enableLanguageProperty); } + } diff --git a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig_parameter.properties b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig_parameter.properties index 0a2e7a458..05bbb15a8 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig_parameter.properties +++ b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/PublicationsConfig_parameter.properties @@ -158,6 +158,11 @@ com.arsdigita.cms.contenttypes.publications.default_publications_folder_path.pur com.arsdigita.cms.contenttypes.publications.default_publications_folder_path.example = main:/path/to/publications/folder com.arsdigita.cms.contenttypes.publications.default_publications_folder_path.format = [String] +com.arsdigita.cms.contenttypes.publications.series.volumes_order.title = Series Details view: Order of volumes +com.arsdigita.cms.contenttypes.publications.series.volumes_order.purpose = Determines in which order the volumes of a series are displayed in the detail view of a series (ascending or descending). +com.arsdigita.cms.contenttypes.publications.series.volumes_order.example = DESC +com.arsdigita.cms.contenttypes.publications.series.volumes_order.format = String + com.arsdigita.cms.contenttypes.publications.organization_type.title = Type for imported organizations com.arsdigita.cms.contenttypes.publications.organization_type.purpose = Sets the type used for imported organization. Must be a subtype of com.arsdigita.cms.contenttypes.GenericOrganizationalUnit com.arsdigita.cms.contenttypes.publications.organization_type.example = com.arsdigita.cms.contenttypes.Publisher diff --git a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/ui/SeriesExtraXmlGenerator.java b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/ui/SeriesExtraXmlGenerator.java index 459f84ca6..8bf941ddd 100644 --- a/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/ui/SeriesExtraXmlGenerator.java +++ b/ccm-sci-publications/src/com/arsdigita/cms/contenttypes/ui/SeriesExtraXmlGenerator.java @@ -43,8 +43,12 @@ import com.arsdigita.persistence.SessionManager; import com.arsdigita.xml.Element; import java.math.BigDecimal; import java.text.DateFormat; +import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; +import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; @@ -159,11 +163,11 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { final Element filtersElem = parent.newChildElement("filters"); - yearFilter.setDataQuery(volumes, YEAR_PARAM); + yearFilter.setDataQuery(volumes, YEAR_PARAM); applyYearFilter(volumes, request); applyTitleFilter(volumes, request); applyAuthorFilter(volumes, request); - + yearFilter.generateXml(filtersElem); titleFilter.generateXml(filtersElem); authorFilter.generateXml(filtersElem); @@ -172,20 +176,55 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { return; } - final Element volumesElem = parent.newChildElement("volumes"); + final List volumeList = new ArrayList(); while (volumes.next()) { -// createVolumeXml(volumes.getPublication(GlobalizationHelper. -// getNegotiatedLocale().getLanguage()), -// volumes.getVolumeOfSeries(), + volumeList.add(createVolumeEntry((BigDecimal) volumes.get("id"), + series.getSeriesBundle().getID(), + (String) volumes.get("objectType"))); + } + + if ("asc".equals(Publication.getConfig().getSeriesVolumeOrder())) { + Collections.sort(volumeList, new Comparator() { + @Override + public int compare(final VolumeEntry entry1, + final VolumeEntry entry2) { + if (entry1.getVolumeOfSeries() == null) { + return -1; + } else { + return entry1.getVolumeOfSeries().compareTo(entry2.getVolumeOfSeries()); + } + } + + }); + } else { + Collections.sort(volumeList, new Comparator() { + @Override + public int compare(final VolumeEntry entry1, + final VolumeEntry entry2) { + if (entry2.getVolumeOfSeries() == null) { + return -1; + } else { + return entry2.getVolumeOfSeries().compareTo(entry1.getVolumeOfSeries()); + } + } + + }); + } + + + + final Element volumesElem = parent.newChildElement("volumes"); + for (VolumeEntry entry : volumeList) { + createVolumeXml(entry.getPublication(), entry.getVolumeOfSeries(), volumesElem, state); + } +// while (volumes.next()) { +// createVolumeXml((BigDecimal) volumes.get("id"), +// series.getSeriesBundle().getID(), +// (String) volumes.get("objectType"), // volumesElem, // state); - createVolumeXml((BigDecimal) volumes.get("id"), - series.getSeriesBundle().getID(), - (String) volumes.get("objectType"), - volumesElem, - state); - - } +// +// } } private void createDateAttr(final XmlGenerator generator, @@ -218,6 +257,30 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { } + private VolumeEntry createVolumeEntry(final BigDecimal publicationId, + final BigDecimal seriesId, + final String objectType) { + 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()); + + if (!query.next()) { + return null; + } + final String volume; + if (query.get("volumeOfSeries") == null) { + volume = null; + } else { + volume = (String) query.get("volumeOfSeries"); + } + + return new VolumeEntry(volume, publication); + } + private void createVolumeXml(final BigDecimal publicationId, final BigDecimal seriesId, final String objectType, @@ -302,7 +365,8 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { final DataQuery publicationBundlesQuery = SessionManager.getSession().retrieveQuery( "com.arsdigita.cms.contenttypes.getIdsOfPublicationsForSeries"); - publicationBundlesQuery.setParameter("seriesId", series.getSeriesBundle().getID().toString()); + publicationBundlesQuery. + setParameter("seriesId", series.getSeriesBundle().getID().toString()); final StringBuilder filterBuilder = new StringBuilder(); while (publicationBundlesQuery.next()) { @@ -311,7 +375,8 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { } filterBuilder.append(publicationBundlesQuery.get("publicationId").toString()); } - final DataCollection publicationsQuery = SessionManager.getSession().retrieve(Publication.BASE_DATA_OBJECT_TYPE); + final DataCollection publicationsQuery = SessionManager.getSession().retrieve( + Publication.BASE_DATA_OBJECT_TYPE); if (filterBuilder.length() == 0) { //No publications return null to indicate @@ -323,14 +388,18 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { if (Kernel.getConfig().languageIndependentItems()) { final FilterFactory filterFactory = publicationsQuery.getFilterFactory(); final Filter filter = filterFactory.or(). - addFilter(filterFactory.equals("language", GlobalizationHelper.getNegotiatedLocale().getLanguage())). + 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( + addFilter(filterFactory.notIn("parent", + "com.arsdigita.navigation.getParentIDsOfMatchedItems"). + set( "language", GlobalizationHelper.getNegotiatedLocale().getLanguage()))); publicationsQuery.addFilter(filter); } else { - publicationsQuery.addEqualsFilter("language", GlobalizationHelper.getNegotiatedLocale().getLanguage()); + publicationsQuery.addEqualsFilter("language", GlobalizationHelper.getNegotiatedLocale(). + getLanguage()); } return publicationsQuery; @@ -351,4 +420,24 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { } } + + private class VolumeEntry { + + private final String volumeOfSeries; + private final Publication publication; + + public VolumeEntry(final String volumeOfSeries, final Publication publication) { + this.volumeOfSeries = volumeOfSeries; + this.publication = publication; + } + + public String getVolumeOfSeries() { + return volumeOfSeries; + } + + public Publication getPublication() { + return publication; + } + + } }