/* This file is part of Subsonic. Subsonic 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 3 of the License, or (at your option) any later version. Subsonic 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 Subsonic. If not, see . Copyright 2009 (C) Sindre Mehus */ package net.sourceforge.subsonic.domain; import java.util.ArrayList; import java.util.List; import java.io.Serializable; /** * A music index is a mapping from an index string to a list of prefixes. A complete index consists of a list of * MusicIndex instances.

*

* For a normal alphabetical index, such a mapping would typically be "A" -> ["A"]. The index can also be used * to group less frequently used letters, such as "X-Å" -> ["X", "Y", "Z", "Æ", "Ø", "Å"], or to make multiple * indexes for frequently used letters, such as "SA" -> ["SA"] and "SO" -> ["SO"]

*

* Clicking on an index in the user interface will typically bring up a list of all music files that are categorized * under that index. * * @author Sindre Mehus */ public class MusicIndex implements Serializable { public static final MusicIndex OTHER = new MusicIndex("#"); private final String index; private final List prefixes = new ArrayList(); /** * Creates a new index with the given index string. * * @param index The index string, e.g., "A" or "The". */ public MusicIndex(String index) { this.index = index; } /** * Adds a prefix to this index. Music files that starts with this prefix will be categorized under this index entry. * * @param prefix The prefix. */ public void addPrefix(String prefix) { prefixes.add(prefix); } /** * Returns the index name. * * @return The index name. */ public String getIndex() { return index; } /** * Returns the list of prefixes. * * @return The list of prefixes. */ public List getPrefixes() { return prefixes; } /** * Returns whether this object is equal to another one. * * @param o Object to compare to. * @return true if, and only if, the other object is a MusicIndex with the same * index name as this one. */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof MusicIndex)) { return false; } final MusicIndex musicIndex = (MusicIndex) o; if (index != null ? !index.equals(musicIndex.index) : musicIndex.index != null) { return false; } return true; } /** * Returns a hash code for this object. * * @return A hash code for this object. */ @Override public int hashCode() { return (index != null ? index.hashCode() : 0); } /** * An artist in an index. */ public static class Artist implements Comparable, Serializable { private final String name; private final String sortableName; private final List mediaFiles = new ArrayList(); public Artist(String name, String sortableName) { this.name = name; this.sortableName = sortableName; } public void addMediaFile(MediaFile mediaFile) { mediaFiles.add(mediaFile); } public String getName() { return name; } public String getSortableName() { return sortableName; } public List getMediaFiles() { return mediaFiles; } public int compareTo(Artist artist) { return sortableName.compareToIgnoreCase(artist.sortableName); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Artist artist = (Artist) o; return sortableName.equalsIgnoreCase(artist.sortableName); } @Override public int hashCode() { return sortableName.hashCode(); } } }