2 * DemosceneMusic - DataManager.java - Copyright © 2012 David Roden
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.pterodactylus.demoscenemusic.data;
20 import java.sql.ResultSet;
21 import java.sql.SQLException;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.concurrent.Callable;
28 import net.pterodactylus.util.collection.Memoizer;
29 import net.pterodactylus.util.database.Database;
30 import net.pterodactylus.util.database.DatabaseException;
31 import net.pterodactylus.util.database.Field;
32 import net.pterodactylus.util.database.Join;
33 import net.pterodactylus.util.database.Join.JoinType;
34 import net.pterodactylus.util.database.ObjectCreator;
35 import net.pterodactylus.util.database.OrderField;
36 import net.pterodactylus.util.database.OrderField.Order;
37 import net.pterodactylus.util.database.Parameter.StringParameter;
38 import net.pterodactylus.util.database.Query;
39 import net.pterodactylus.util.database.Query.Type;
40 import net.pterodactylus.util.database.ResultProcessor;
41 import net.pterodactylus.util.database.ValueField;
42 import net.pterodactylus.util.database.ValueFieldWhereClause;
47 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
49 public class DataManager {
51 private final ObjectCreator<Artist> artistCreator = new ArtistCreator();
52 private final ObjectCreator<Group> groupCreator = new GroupCreator();
53 private final ObjectCreator<Track> trackCreator = new TrackCreator();
55 private final Database database;
57 public DataManager(Database database) {
58 this.database = database;
61 public Collection<Artist> getAllArtists() throws DatabaseException {
62 Query query = new Query(Type.SELECT, "ARTISTS");
63 query.addField(new Field("ARTISTS.*"));
64 return database.getMultiple(query, artistCreator);
67 public Artist getArtistById(String id) throws DatabaseException {
68 Query query = new Query(Type.SELECT, "ARTISTS");
69 query.addField(new Field("ARTISTS.*"));
70 query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(id))));
71 return database.getSingle(query, artistCreator);
74 public Collection<Artist> getArtistsByGroup(String groupId) throws DatabaseException {
75 Query query = new Query(Type.SELECT, "ARTISTS");
76 query.addField(new Field("ARTISTS.*"));
77 query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST")));
78 query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.GROUP_", new StringParameter(groupId))));
79 return database.getMultiple(query, artistCreator);
82 public Track trackById(String id) throws DatabaseException {
83 Query query = new Query(Type.SELECT, "TRACKS");
84 query.addField(new Field("TRACKS.*"));
85 query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACKS.ID", new StringParameter(id))));
86 return database.getSingle(query, trackCreator);
89 public Collection<Track> getTracksByArtist(String artistId) throws DatabaseException {
90 Query query = new Query(Type.SELECT, "TRACKS");
91 query.addField(new Field("TRACKS.*"));
92 query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACKS.ID"), new Field("TRACK_ARTISTS.TRACK")));
93 query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.ARTIST", new StringParameter(artistId))));
94 return database.getMultiple(query, trackCreator);
97 public Collection<Group> getGroupsByArtist(String artistId) throws DatabaseException {
98 Query query = new Query(Type.SELECT, "GROUPS");
99 query.addField(new Field("GROUPS.*"));
100 query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("GROUPS.ID"), new Field("GROUP_ARTISTS.GROUP_")));
101 query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.ARTIST", new StringParameter(artistId))));
102 return database.getMultiple(query, groupCreator);
105 private class TrackLoader implements ResultProcessor {
107 private final List<Track> loadedTracks = new ArrayList<Track>();
111 return loadedTracks.isEmpty() ? null : loadedTracks.get(0);
114 public List<Track> all() {
121 public void processResult(ResultSet resultSet) throws SQLException {
122 String trackId = resultSet.getString("TRACKS.ID");
123 if ((track == null) || (!track.id().equals(trackId))) {
124 track = new DefaultTrack(trackId).name(resultSet.getString("TRACKS.NAME")).artists(new ArrayList<Artist>()).styles(new HashSet<Style>());
125 loadedTracks.add(track);
127 Artist artist = new LazyArtist(resultSet.getString("ARTISTS.ID")).name(resultSet.getString("ARTISTS.NAME"));
128 if (!track.artists().contains(artist)) {
129 track.artists().add(artist);
131 Style style = new DefaultStyle(resultSet.getString("STYLES.ID")).name(resultSet.getString("STYLES.NAME"));
132 track.styles().add(style);
137 private class ArtistLoader implements ResultProcessor {
139 private final List<Artist> artists = new ArrayList<Artist>();
140 private Artist artist;
142 public Artist get() {
143 return artists.isEmpty() ? null : artists.get(0);
146 public List<Artist> all() {
151 // RESULTPROCESSOR METHODS
157 public void processResult(ResultSet resultSet) throws SQLException {
158 String artistId = resultSet.getString("ARTISTS.ID");
159 if ((artist == null) || (!artist.id().equals(artistId))) {
160 artist = new LazyArtist(artistId).name(resultSet.getString("ARTISTS.NAME")).groups(new HashSet<Group>());
164 Group group = new DefaultGroup(resultSet.getString("GROUPS.ID")).name(resultSet.getString("GROUPS.NAME")).url(resultSet.getString("GROUPS.URL"));
165 artist.groups().add(group);
170 private class LazyArtist extends DefaultArtist {
172 private final Memoizer<Void> tracksMemoizer = new Memoizer<Void>(new Callable<Void>() {
173 public Void call() throws DatabaseException {
174 if (!hasValue("tracks")) {
175 value("tracks", Collection.class).set(getTracksByArtist(id()));
181 private final Memoizer<Void> groupsMemoizer = new Memoizer<Void>(new Callable<Void>() {
184 public Void call() throws Exception {
185 if (!hasValue("groups")) {
186 value("groups", Collection.class).set(getGroupsByArtist(id()));
193 public LazyArtist(String id) {
201 public Collection<Group> groups() {
202 groupsMemoizer.get();
203 return super.groups();
206 public Collection<Track> tracks() {
207 tracksMemoizer.get();
208 return super.tracks();
213 private class ArtistCreator implements ObjectCreator<Artist> {
219 public Artist createObject(ResultSet resultSet) throws SQLException {
220 return new LazyArtist(resultSet.getString("ARTISTS.ID")).name(resultSet.getString("ARTISTS.NAME"));
225 private class LazyGroup extends DefaultGroup {
227 private final Memoizer<Void> artistsMemoizer = new Memoizer<Void>(new Callable<Void>() {
230 public Void call() throws Exception {
231 if (!hasValue("artists")) {
232 value("artists", Collection.class).set(getArtistsByGroup(id()));
239 public LazyGroup(String id) {
247 public Collection<Artist> artists() {
248 artistsMemoizer.get();
249 return super.artists();
254 private class GroupCreator implements ObjectCreator<Group> {
260 public Group createObject(ResultSet resultSet) throws SQLException {
261 return new LazyGroup(resultSet.getString("GROUPS.ID")).name(resultSet.getString("GROUPS.NAME")).url(resultSet.getString("GROUPS.URL"));
266 private class LazyTrack extends DefaultTrack {
268 private final Memoizer<Void> artistsMemoizer = new Memoizer<Void>(new Callable<Void>() {
271 public Void call() throws Exception {
272 if (!hasValue("artists")) {
273 value("artists", List.class).set(getArtistsByTrack(id()));
283 public LazyTrack(String id) {
291 public List<Artist> artists() {
292 artistsMemoizer.get();
293 return super.artists();
300 public Collection<Style> styles() {
301 // TODO Auto-generated method stub
302 return super.styles();
307 private class TrackCreator implements ObjectCreator<Track> {
313 public Track createObject(ResultSet resultSet) throws SQLException {
314 return new LazyTrack(resultSet.getString("TRACKS.ID")).name(resultSet.getString("TRACKS.NAME"));