Fix for the Comperator used in the SeriesExtraXMLGenerator for sorting the volumes of series. The comperator failed under some conditions with a NPE.

git-svn-id: https://svn.libreccm.org/ccm/trunk@2624 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2014-04-25 09:42:04 +00:00
parent 76b9482c9b
commit a73152cd05
1 changed files with 39 additions and 24 deletions

View File

@ -54,7 +54,7 @@ import javax.servlet.http.HttpServletRequest;
/** /**
* *
* @author Jens Pelzetter * @author Jens Pelzetter
* @version $Id$ * @version $Id$
*/ */
public class SeriesExtraXmlGenerator implements ExtraXMLGenerator { public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
@ -80,14 +80,15 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
authorFilter = new TextFilter(AUTHOR_PARAM, "authorsStr"); authorFilter = new TextFilter(AUTHOR_PARAM, "authorsStr");
} }
@Override
public void generateXML(final ContentItem item, public void generateXML(final ContentItem item,
final Element element, final Element element,
final PageState state) { final PageState state) {
if (!(item instanceof Series)) { if (!(item instanceof Series)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"ExtraXMLGenerator '%s' only supports items of type '%s'.", "ExtraXMLGenerator '%s' only supports items of type '%s'.",
getClass().getName(), getClass().getName(),
Series.class.getName())); Series.class.getName()));
} }
final Series series = (Series) item; final Series series = (Series) item;
@ -188,8 +189,15 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
@Override @Override
public int compare(final VolumeEntry entry1, public int compare(final VolumeEntry entry1,
final VolumeEntry entry2) { final VolumeEntry entry2) {
if (entry1.getVolumeOfSeries() == null) { // if (entry1.getVolumeOfSeries() == null) {
return -1; // return -1;
// } else if ((entry1.getVolumeOfSeries() == null)
// && (entry2.getVolumeOfSeries() == null)) {
// return 0;
if ((entry1.getVolumeOfSeries() == null)
|| entry2.getVolumeOfSeries() == null) {
return entry1.getPublication().getName().compareTo(entry2.getPublication().
getName());
} else { } else {
return entry1.getVolumeOfSeries().compareTo(entry2.getVolumeOfSeries()); return entry1.getVolumeOfSeries().compareTo(entry2.getVolumeOfSeries());
} }
@ -201,8 +209,15 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
@Override @Override
public int compare(final VolumeEntry entry1, public int compare(final VolumeEntry entry1,
final VolumeEntry entry2) { final VolumeEntry entry2) {
if (entry2.getVolumeOfSeries() == null) { // if (entry2.getVolumeOfSeries() == null) {
return -1; // return -1;
// } else if ((entry2.getVolumeOfSeries() == null)
// && (entry1.getVolumeOfSeries() == null)) {
// return 0;
if ((entry2.getVolumeOfSeries() == null)
|| entry1.getVolumeOfSeries() == null) {
return entry2.getPublication().getName().compareTo(entry1.getPublication().
getName());
} else { } else {
return entry2.getVolumeOfSeries().compareTo(entry1.getVolumeOfSeries()); return entry2.getVolumeOfSeries().compareTo(entry1.getVolumeOfSeries());
} }
@ -237,13 +252,13 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
Integer.toString(cal.get(Calendar.MONTH))); Integer.toString(cal.get(Calendar.MONTH)));
generator.addItemAttribute(String.format("%sDay", prefix), generator.addItemAttribute(String.format("%sDay", prefix),
Integer.toString(cal.get( Integer.toString(cal.get(
Calendar.DAY_OF_MONTH))); Calendar.DAY_OF_MONTH)));
final Locale locale = GlobalizationHelper.getNegotiatedLocale(); final Locale locale = GlobalizationHelper.getNegotiatedLocale();
final DateFormat dateFormat = DateFormat.getDateInstance( final DateFormat dateFormat = DateFormat.getDateInstance(
DateFormat.MEDIUM, locale); DateFormat.MEDIUM, locale);
final DateFormat longDateFormat = DateFormat.getDateInstance( final DateFormat longDateFormat = DateFormat.getDateInstance(
DateFormat.LONG, locale); DateFormat.LONG, locale);
generator.addItemAttribute(String.format("%sDate", prefix), generator.addItemAttribute(String.format("%sDate", prefix),
dateFormat.format(date)); dateFormat.format(date));
generator.addItemAttribute(String.format("%sLongDate", prefix), generator.addItemAttribute(String.format("%sLongDate", prefix),
@ -259,10 +274,10 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
final BigDecimal seriesId, final BigDecimal seriesId,
final String objectType) { final String objectType) {
final Publication publication = (Publication) DomainObjectFactory. final Publication publication = (Publication) DomainObjectFactory.
newInstance(new OID(objectType, publicationId)); newInstance(new OID(objectType, publicationId));
final DataQuery query = SessionManager.getSession().retrieveQuery( final DataQuery query = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getVolumeOfSeries"); "com.arsdigita.cms.contenttypes.getVolumeOfSeries");
query.setParameter("seriesId", seriesId); query.setParameter("seriesId", seriesId);
query.setParameter("publicationId", publication.getPublicationBundle().getID()); query.setParameter("publicationId", publication.getPublicationBundle().getID());
@ -285,10 +300,10 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
final Element parent, final Element parent,
final PageState state) { final PageState state) {
final Publication publication = (Publication) DomainObjectFactory. final Publication publication = (Publication) DomainObjectFactory.
newInstance(new OID(objectType, publicationId)); newInstance(new OID(objectType, publicationId));
final DataQuery query = SessionManager.getSession().retrieveQuery( final DataQuery query = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getVolumeOfSeries"); "com.arsdigita.cms.contenttypes.getVolumeOfSeries");
query.setParameter("seriesId", seriesId); query.setParameter("seriesId", seriesId);
query.setParameter("publicationId", publication.getPublicationBundle().getID()); query.setParameter("publicationId", publication.getPublicationBundle().getID());
@ -361,10 +376,10 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
private DataCollection getData(final Series series) { private DataCollection getData(final Series series) {
final DataQuery publicationBundlesQuery = SessionManager.getSession().retrieveQuery( final DataQuery publicationBundlesQuery = SessionManager.getSession().retrieveQuery(
"com.arsdigita.cms.contenttypes.getIdsOfPublicationsForSeries"); "com.arsdigita.cms.contenttypes.getIdsOfPublicationsForSeries");
publicationBundlesQuery. publicationBundlesQuery.
setParameter("seriesId", series.getSeriesBundle().getID().toString()); setParameter("seriesId", series.getSeriesBundle().getID().toString());
final StringBuilder filterBuilder = new StringBuilder(); final StringBuilder filterBuilder = new StringBuilder();
while (publicationBundlesQuery.next()) { while (publicationBundlesQuery.next()) {
@ -374,7 +389,7 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
filterBuilder.append(publicationBundlesQuery.get("publicationId").toString()); filterBuilder.append(publicationBundlesQuery.get("publicationId").toString());
} }
final DataCollection publicationsQuery = SessionManager.getSession().retrieve( final DataCollection publicationsQuery = SessionManager.getSession().retrieve(
Publication.BASE_DATA_OBJECT_TYPE); Publication.BASE_DATA_OBJECT_TYPE);
if (filterBuilder.length() == 0) { if (filterBuilder.length() == 0) {
//No publications return null to indicate //No publications return null to indicate
@ -386,18 +401,18 @@ public class SeriesExtraXmlGenerator implements ExtraXMLGenerator {
if (Kernel.getConfig().languageIndependentItems()) { if (Kernel.getConfig().languageIndependentItems()) {
final FilterFactory filterFactory = publicationsQuery.getFilterFactory(); final FilterFactory filterFactory = publicationsQuery.getFilterFactory();
final Filter filter = filterFactory.or(). final Filter filter = filterFactory.or().
addFilter(filterFactory.equals("language", GlobalizationHelper. addFilter(filterFactory.equals("language", GlobalizationHelper.
getNegotiatedLocale().getLanguage())). getNegotiatedLocale().getLanguage())).
addFilter(filterFactory.and(). addFilter(filterFactory.and().
addFilter(filterFactory.equals("language", GlobalizationHelper.LANG_INDEPENDENT)). addFilter(filterFactory.equals("language", GlobalizationHelper.LANG_INDEPENDENT)).
addFilter(filterFactory.notIn("parent", addFilter(filterFactory.notIn("parent",
"com.arsdigita.navigation.getParentIDsOfMatchedItems"). "com.arsdigita.navigation.getParentIDsOfMatchedItems").
set( set(
"language", GlobalizationHelper.getNegotiatedLocale().getLanguage()))); "language", GlobalizationHelper.getNegotiatedLocale().getLanguage())));
publicationsQuery.addFilter(filter); publicationsQuery.addFilter(filter);
} else { } else {
publicationsQuery.addEqualsFilter("language", GlobalizationHelper.getNegotiatedLocale(). publicationsQuery.addEqualsFilter("language", GlobalizationHelper.getNegotiatedLocale().
getLanguage()); getLanguage());
} }
return publicationsQuery; return publicationsQuery;