import java.util.Collection;
import java.util.List;
+import java.util.Map;
/**
* Data interface for tracks.
public interface Track extends Base {
/**
+ * Defines relationships between tracks.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ public enum Relationship {
+
+ /** The track is the original of a related track. */
+ original,
+
+ /** The track is a remix of a related track. */
+ remix,
+
+ /** The track is a cover version of a related track. */
+ cover,
+
+ }
+
+ /**
* Returns the name of this track.
*
* @return The name of this track
*/
public Track setRemixArtists(List<Artist> remixArtists);
+ /**
+ * Returns all derivatives of this track. A derivative of a MOD file could
+ * be a WAV or MP3 file.
+ *
+ * @return All derivatives of this track
+ */
+ public Collection<TrackDerivative> getDerivatives();
+
+ /**
+ * Sets the derivatives of this track.
+ *
+ * @param derivatives
+ * The derivatives of this track
+ * @return This track
+ */
+ public Track setDerivatives(Collection<TrackDerivative> derivatives);
+
+ /**
+ * Returns all tracks that are somehow related to this track.
+ *
+ * @return All tracks that are related to this track
+ */
+ public Map<Relationship, Collection<Track>> getRelatedTracks();
+
+ /**
+ * Sets all related tracks.
+ *
+ * @param relatedTracks
+ * All related tracks
+ * @return This track
+ */
+ public Track setRelatedTracks(Map<Relationship, Collection<Track>> relatedTracks);
+
}