/* This file is part of Libresonic. Libresonic 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. Libresonic 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 Libresonic. If not, see <http://www.gnu.org/licenses/>. Copyright 2016 (C) Libresonic Authors Based upon Subsonic, Copyright 2009 (C) Sindre Mehus */ package org.libresonic.player.domain; import java.io.Serializable; import java.text.CollationKey; import java.text.Collator; import java.util.ArrayList; import java.util.List; /** * A music index is a mapping from an index string to a list of prefixes. A complete index consists of a list of * <code>MusicIndex</code> instances.<p/> * <p/> * For a normal alphabetical index, such a mapping would typically be <em>"A" -> ["A"]</em>. The index can also be used * to group less frequently used letters, such as <em>"X-Å" -> ["X", "Y", "Z", "Æ", "Ø", "Å"]</em>, or to make multiple * indexes for frequently used letters, such as <em>"SA" -> ["SA"]</em> and <em>"SO" -> ["SO"]</em><p/> * <p/> * 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<String> prefixes = new ArrayList<String>(); /** * 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<String> getPrefixes() { return prefixes; } /** * Returns whether this object is equal to another one. * * @param o Object to compare to. * @return <code>true</code> if, and only if, the other object is a <code>MusicIndex</code> 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 abstract static class SortableArtist implements Comparable<SortableArtist> { private final String name; private final String sortableName; private final CollationKey collationKey; public SortableArtist(String name, String sortableName, Collator collator) { this.name = name; this.sortableName = sortableName; collationKey = collator.getCollationKey(sortableName); } public String getName() { return name; } public String getSortableName() { return sortableName; } public int compareTo(SortableArtist other) { return collationKey.compareTo(other.collationKey); } } public static class SortableArtistWithMediaFiles extends SortableArtist { private final List<MediaFile> mediaFiles = new ArrayList<MediaFile>(); public SortableArtistWithMediaFiles(String name, String sortableName, Collator collator) { super(name, sortableName, collator); } public void addMediaFile(MediaFile mediaFile) { mediaFiles.add(mediaFile); } public List<MediaFile> getMediaFiles() { return mediaFiles; } } public static class SortableArtistWithArtist extends SortableArtist { private final Artist artist; public SortableArtistWithArtist(String name, String sortableName, Artist artist, Collator collator) { super(name, sortableName, collator); this.artist = artist; } public Artist getArtist() { return artist; } } }