Add method to get all artists for a track.
[demoscenemusic.git] / src / main / java / net / pterodactylus / demoscenemusic / data / DataManager.java
1 /*
2  * DemosceneMusic - DataManager.java - Copyright © 2012 David Roden
3  *
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.
8  *
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.
13  *
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/>.
16  */
17
18 package net.pterodactylus.demoscenemusic.data;
19
20 import java.sql.ResultSet;
21 import java.sql.SQLException;
22 import java.util.Collection;
23 import java.util.List;
24 import java.util.concurrent.Callable;
25
26 import net.pterodactylus.util.collection.Memoizer;
27 import net.pterodactylus.util.database.Database;
28 import net.pterodactylus.util.database.DatabaseException;
29 import net.pterodactylus.util.database.Field;
30 import net.pterodactylus.util.database.Join;
31 import net.pterodactylus.util.database.Join.JoinType;
32 import net.pterodactylus.util.database.ObjectCreator;
33 import net.pterodactylus.util.database.OrderField;
34 import net.pterodactylus.util.database.Parameter.StringParameter;
35 import net.pterodactylus.util.database.Query;
36 import net.pterodactylus.util.database.Query.Type;
37 import net.pterodactylus.util.database.ValueField;
38 import net.pterodactylus.util.database.ValueFieldWhereClause;
39
40 /**
41  * TODO
42  *
43  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
44  */
45 public class DataManager {
46
47         private final ObjectCreator<Artist> artistCreator = new ArtistCreator();
48         private final ObjectCreator<Group> groupCreator = new GroupCreator();
49         private final ObjectCreator<Track> trackCreator = new TrackCreator();
50
51         private final Database database;
52
53         public DataManager(Database database) {
54                 this.database = database;
55         }
56
57         public Collection<Artist> getAllArtists() throws DatabaseException {
58                 Query query = new Query(Type.SELECT, "ARTISTS");
59                 query.addField(new Field("ARTISTS.*"));
60                 return database.getMultiple(query, artistCreator);
61         }
62
63         public Artist getArtistById(String id) throws DatabaseException {
64                 Query query = new Query(Type.SELECT, "ARTISTS");
65                 query.addField(new Field("ARTISTS.*"));
66                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(id))));
67                 return database.getSingle(query, artistCreator);
68         }
69
70         public Collection<Artist> getArtistsByGroup(String groupId) throws DatabaseException {
71                 Query query = new Query(Type.SELECT, "ARTISTS");
72                 query.addField(new Field("ARTISTS.*"));
73                 query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST")));
74                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.GROUP_", new StringParameter(groupId))));
75                 return database.getMultiple(query, artistCreator);
76         }
77
78         public List<Artist> getArtistsByTrack(String trackId) throws DatabaseException {
79                 Query query = new Query(Type.SELECT, "ARTISTS");
80                 query.addField(new Field("ARTISTS.*"));
81                 query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACK_ARTISTS.ARTIST"), new Field("ARTISTS.ID")));
82                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.TRACK", new StringParameter(trackId))));
83                 query.addOrderField(new OrderField(new Field("TRACK_ARTISTS.DISPLAY_ORDER")));
84                 return database.getMultiple(query, artistCreator);
85         }
86
87         public Track trackById(String id) throws DatabaseException {
88                 Query query = new Query(Type.SELECT, "TRACKS");
89                 query.addField(new Field("TRACKS.*"));
90                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACKS.ID", new StringParameter(id))));
91                 return database.getSingle(query, trackCreator);
92         }
93
94         public Collection<Track> getTracksByArtist(String artistId) throws DatabaseException {
95                 Query query = new Query(Type.SELECT, "TRACKS");
96                 query.addField(new Field("TRACKS.*"));
97                 query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACKS.ID"), new Field("TRACK_ARTISTS.TRACK")));
98                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.ARTIST", new StringParameter(artistId))));
99                 return database.getMultiple(query, trackCreator);
100         }
101
102         public Collection<Group> getGroupsByArtist(String artistId) throws DatabaseException {
103                 Query query = new Query(Type.SELECT, "GROUPS");
104                 query.addField(new Field("GROUPS.*"));
105                 query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("GROUPS.ID"), new Field("GROUP_ARTISTS.GROUP_")));
106                 query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.ARTIST", new StringParameter(artistId))));
107                 return database.getMultiple(query, groupCreator);
108         }
109
110         private class LazyArtist extends DefaultArtist {
111
112                 private final Memoizer<Void> tracksMemoizer = new Memoizer<Void>(new Callable<Void>() {
113                         public Void call() throws DatabaseException {
114                                 if (!hasValue("tracks")) {
115                                         value("tracks", Collection.class).set(getTracksByArtist(id()));
116                                 }
117                                 return null;
118                         }
119                 });
120
121                 private final Memoizer<Void> groupsMemoizer = new Memoizer<Void>(new Callable<Void>() {
122
123                         @Override
124                         public Void call() throws Exception {
125                                 if (!hasValue("groups")) {
126                                         value("groups", Collection.class).set(getGroupsByArtist(id()));
127                                 }
128                                 return null;
129                         }
130
131                 });
132
133                 public LazyArtist(String id) {
134                         super(id);
135                 }
136
137                 /**
138                  * {@inheritDoc}
139                  */
140                 @Override
141                 public Collection<Group> groups() {
142                         groupsMemoizer.get();
143                         return super.groups();
144                 }
145
146                 public Collection<Track> tracks() {
147                         tracksMemoizer.get();
148                         return super.tracks();
149                 }
150
151         }
152
153         private class ArtistCreator implements ObjectCreator<Artist> {
154
155                 /**
156                  * {@inheritDoc}
157                  */
158                 @Override
159                 public Artist createObject(ResultSet resultSet) throws SQLException {
160                         return new LazyArtist(resultSet.getString("ARTISTS.ID")).name(resultSet.getString("ARTISTS.NAME"));
161                 }
162
163         }
164
165         private class LazyGroup extends DefaultGroup {
166
167                 private final Memoizer<Void> artistsMemoizer = new Memoizer<Void>(new Callable<Void>() {
168
169                         @Override
170                         public Void call() throws Exception {
171                                 if (!hasValue("artists")) {
172                                         value("artists", Collection.class).set(getArtistsByGroup(id()));
173                                 }
174                                 return null;
175                         }
176
177                 });
178
179                 public LazyGroup(String id) {
180                         super(id);
181                 }
182
183                 /**
184                  * {@inheritDoc}
185                  */
186                 @Override
187                 public Collection<Artist> artists() {
188                         artistsMemoizer.get();
189                         return super.artists();
190                 }
191
192         }
193
194         private class GroupCreator implements ObjectCreator<Group> {
195
196                 /**
197                  * {@inheritDoc}
198                  */
199                 @Override
200                 public Group createObject(ResultSet resultSet) throws SQLException {
201                         return new LazyGroup(resultSet.getString("GROUPS.ID")).name(resultSet.getString("GROUPS.NAME")).url(resultSet.getString("GROUPS.URL"));
202                 }
203
204         }
205
206         private class LazyTrack extends DefaultTrack {
207
208                 private final Memoizer<Void> artistsMemoizer = new Memoizer<Void>(new Callable<Void>() {
209
210                         @Override
211                         public Void call() throws Exception {
212                                 if (!hasValue("artists")) {
213                                         value("artists", List.class).set(getArtistsByTrack(id()));
214                                 }
215                                 return null;
216                         }
217
218                 });
219
220                 /**
221                  * @param id
222                  */
223                 public LazyTrack(String id) {
224                         super(id);
225                 }
226
227                 /**
228                  * {@inheritDoc}
229                  */
230                 @Override
231                 public List<Artist> artists() {
232                         artistsMemoizer.get();
233                         return super.artists();
234                 }
235
236                 /**
237                  * {@inheritDoc}
238                  */
239                 @Override
240                 public Collection<Style> styles() {
241                         // TODO Auto-generated method stub
242                         return super.styles();
243                 }
244
245         }
246
247         private class TrackCreator implements ObjectCreator<Track> {
248
249                 /**
250                  * {@inheritDoc}
251                  */
252                 @Override
253                 public Track createObject(ResultSet resultSet) throws SQLException {
254                         return new LazyTrack(resultSet.getString("TRACKS.ID")).name(resultSet.getString("TRACKS.NAME"));
255                 }
256
257         }
258
259 }