Load artist properties with artists.
[demoscenemusic.git] / src / main / java / net / pterodactylus / demoscenemusic / data / DataManager.java
index e6bc6da..8348b2f 100644 (file)
@@ -24,6 +24,7 @@ import java.util.EnumMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.Callable;
 
 import net.pterodactylus.demoscenemusic.data.Track.Relationship;
@@ -93,7 +94,7 @@ public class DataManager {
        public Collection<Artist> getAllArtists() throws DatabaseException {
                Query query = new Query(Type.SELECT, "ARTISTS");
                query.addField(new Field("ARTISTS.*"));
-               return database.getMultiple(query, artistCreator);
+               return loadProperties(database.getMultiple(query, artistCreator));
        }
 
        /**
@@ -110,7 +111,7 @@ public class DataManager {
                Query query = new Query(Type.SELECT, "ARTISTS");
                query.addField(new Field("ARTISTS.*"));
                query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(id))));
-               return database.getSingle(query, artistCreator);
+               return loadProperties(database.getSingle(query, artistCreator));
        }
 
        /**
@@ -127,7 +128,7 @@ public class DataManager {
                query.addField(new Field("ARTISTS.*"));
                query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST")));
                query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.GROUP_", new StringParameter(groupId))));
-               return database.getMultiple(query, artistCreator);
+               return loadProperties(database.getMultiple(query, artistCreator));
        }
 
        /**
@@ -145,7 +146,84 @@ public class DataManager {
                query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACK_ARTISTS.ARTIST"), new Field("ARTISTS.ID")));
                query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.TRACK", new StringParameter(trackId))));
                query.addOrderField(new OrderField(new Field("TRACK_ARTISTS.DISPLAY_ORDER")));
-               return database.getMultiple(query, artistCreator);
+               return loadProperties(database.getMultiple(query, artistCreator));
+       }
+
+       /**
+        * Creates a new artist with the given name.
+        *
+        * @param name
+        *            The name of the artist
+        * @return The created artist
+        * @throws DatabaseException
+        *             if a database error occurs
+        */
+       public Artist createArtist(String name) throws DatabaseException {
+               Query query = new Query(Type.INSERT, "ARTISTS");
+               String id = UUID.randomUUID().toString();
+               query.addValueField(new ValueField("ID", new StringParameter(id)));
+               query.addValueField(new ValueField("NAME", new StringParameter(name)));
+               database.insert(query);
+               return loadProperties(getArtistById(id));
+       }
+
+       /**
+        * Saves the given artist.
+        *
+        * @param artist
+        *            The artist to save
+        * @throws DatabaseException
+        *             if a database error occurs
+        */
+       public void saveArtist(Artist artist) throws DatabaseException {
+               Query query = new Query(Type.UPDATE, "ARTISTS");
+               query.addValueField(new ValueField("NAME", new StringParameter(artist.getName())));
+               query.addWhereClause(new ValueFieldWhereClause(new ValueField("ID", new StringParameter(artist.getId()))));
+               database.update(query);
+       }
+
+       /**
+        * Loads the properties for an artist.
+        *
+        * @param artist
+        *            The artist to load the properties for
+        * @return The artist
+        * @throws DatabaseException
+        *             if a database error occurs
+        */
+       public Artist loadProperties(final Artist artist) throws DatabaseException {
+               Query query = new Query(Type.SELECT, "ARTIST_PROPERTIES");
+               query.addField(new Field("ARTIST_PROPERTIES.PROPERTY"));
+               query.addField(new Field("ARTIST_PROPERTIES.VALUE"));
+               query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTIST", new StringParameter(artist.getId()))));
+               database.process(query, new ResultProcessor() {
+
+                       @Override
+                       public void processResult(ResultSet resultSet) throws SQLException {
+                               if (resultSet.isFirst()) {
+                                       artist.getProperties().removeAll();
+                               }
+                               artist.getProperties().set(resultSet.getString("ARTIST_PROPERTIES.PROPERTY"), resultSet.getString("ARTIST_PROPERTIES.VALUE"));
+                       }
+
+               });
+               return artist;
+       }
+
+       /**
+        * Loads the properties of all given artists.
+        *
+        * @param artists
+        *            The artists to load the properties for
+        * @return The list of artists
+        * @throws DatabaseException
+        *             if a database error occurs
+        */
+       public List<Artist> loadProperties(List<Artist> artists) throws DatabaseException {
+               for (Artist artist : artists) {
+                       loadProperties(artist);
+               }
+               return artists;
        }
 
        /**
@@ -267,6 +345,22 @@ public class DataManager {
        }
 
        /**
+        * Returns the user with the given name.
+        *
+        * @param username
+        *            The name of the user
+        * @return The user, or {@code null} if the user does not exist
+        * @throws DatabaseException
+        *             if a database error occurs
+        */
+       public User getUserByName(String username) throws DatabaseException {
+               Query query = new Query(Type.SELECT, "USERS");
+               query.addField(new Field("USERS.*"));
+               query.addWhereClause(new ValueFieldWhereClause(new ValueField("USERS.NAME", new StringParameter(username))));
+               return database.getSingle(query, userCreator);
+       }
+
+       /**
         * Returns the user connected with the given OpenID.
         *
         * @param openId
@@ -654,7 +748,7 @@ public class DataManager {
                 */
                @Override
                public User createObject(ResultSet resultSet) throws SQLException {
-                       return new LazyUser(resultSet.getString("USERS.ID")).setName(resultSet.getString("USERS.NAME"));
+                       return new LazyUser(resultSet.getString("USERS.ID")).setName(resultSet.getString("USERS.NAME")).setPasswordHash(resultSet.getString("USERS.PASSWORD")).setLevel(resultSet.getInt("USERS.LEVEL"));
                }
 
        }