/*
* Jajuk
* Copyright (C) The Jajuk Team
* http://jajuk.info
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.jajuk.base;
import java.io.Serializable;
import java.util.Comparator;
/**
* Compares albums.
*
* @TODO Convert criteria from int to an enum
*/
public class AlbumComparator implements Comparator<Album>, Serializable {
/** Generated serialVersionUID. */
private static final long serialVersionUID = -5927167916548652076L;
/*
* This needs to be kept in-sync with what we use in
* CatalogView.initMetaInformation()!
*
* 0 .. genre 1 .. artist 2 .. album 3 .. year 4 .. discovery date 5 .. rate 6 ..
* hits
*/
private int criteria = 0;
/**
* Instantiates a new album comparator.
*
* @param criteria
*/
public AlbumComparator(int criteria) {
this.criteria = criteria;
}
/* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@Override
@SuppressWarnings("ucd")
public int compare(Album album1, Album album2) {
// for albums, perform a fast compare
if (criteria == 2) {
return album1.compareTo(album2);
}
// get a track for each album
Track track1 = album1.getAnyTrack();
Track track2 = album2.getAnyTrack();
// check tracks (normally useless)
if (track1 == null || track2 == null) {
return 0;
}
// @TODO
// beware, this code is not consistent with equals. This should be ok as
// result is used by a List but it could be a drama if we used a Set
// See : http: // java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html
switch (criteria) {
case 0: // genre
// Sort on Genre/Artist/Year/Title
if (track1.getGenre() == track2.getGenre()) {
// [Perf] We can make this '==' comparison because all these strings are
// internalized
if (track1.getArtist() == track2.getArtist()) {
if (track1.getYear() == track2.getYear()) {
return album1.compareTo(album2);
} else {
return track1.getYear().compareTo(track2.getYear());
}
} else {
return track1.getArtist().compareTo(track2.getArtist());
}
} else {
return track1.getGenre().compareTo(track2.getGenre());
}
case 1: // artist
// Sort on Artist/Year/Title
// we use now the album artist
if (track1.getArtist() == track2.getArtist()) {
if (track1.getYear() == track2.getYear()) {
return album1.compareTo(album2);
} else {
return track1.getYear().compareTo(track2.getYear());
}
} else {
return track1.getArtist().compareTo(track2.getArtist());
}
case 3: // year
// Sort on: Year/Artist/Title
if (track1.getYear() == track2.getYear()) {
if (track1.getArtist() == track2.getArtist()) {
return album1.compareTo(album2);
} else {
return track1.getArtist().compareTo(track2.getArtist());
}
} else {
return track1.getYear().compareTo(track2.getYear());
}
case 4: // Discovery date
// Sort on: Discovery date/title
if (track1.getDiscoveryDate().equals(track2.getDiscoveryDate())) {
return album1.compareTo(album2);
} else {
return track2.getDiscoveryDate().compareTo(track1.getDiscoveryDate());
}
case 5: // Rate
// Sort on: Rate/title
if (album1.getRate() == album2.getRate()) {
return album1.compareTo(album2);
} else if (album1.getRate() < album2.getRate()) {
return -1;
} else {
return 1;
}
case 6: // Hits
if (album1.getHits() == album2.getHits()) {
return album1.compareTo(album2);
} else if (album1.getHits() < album2.getHits()) {
return -1;
} else {
return 1;
}
}
return 0;
}
}