Go back to the Song class and add to it an attribute called owner which will be
ID: 3737132 • Letter: G
Question
Go back to the Song class and add to it an attribute called owner which will be a User object representing the user who happens to own this copy of this song. Note that a Song object may only be owned by one User and that many users can have copies of the same song. Set it to null initially. In the User class, adjust the addSong() method so that it sets the owner properly.
In the User class, add a method called requestCompleteSonglist(MusicExchangeCenter m). This method should gather the list of all available songs from all users that are online at the given music exchange center (i.e., the union of all of their local song lists), and then return an ArrayList formatted as follows:
Notice that the songs are numbered and that the title, artist, time and owner are all lined up nicely. You should use the String.format() method as described in the notes. Recall that %-30s in the format string will allow you to display a left-justified 30-character string. Also, %2d and %02d will allow you to display numbers so that they take 2 places, the 0 indicating that a leading zero character is desired.
In the User class, add a method called requestSonglistByArtist(MusicExchangeCenter m, String artist). This method should gather the list of all available songs by the given artist from all users that are online at the given music exchange center (i.e., the union of all of their local song lists), and then return an ArrayList formatted similar to that shown above.
In the MusicExchangeCenter class, add a method called getSong(String title, String ownerName) which returns the Song object with the given title owned by the user with the given ownerName, provided that the user is currently online and that the song exists. Return null otherwise. (Hint: you will need to search through the center’s users to find User with the matching ownerName and then search through that user’s songs to find the Song with the given title. It may be a good idea to write an extra helper method in the User class called songWithTitle() that you can make use of).
In the User class, add a downloadSong(MusicExchangeCenter m, String title, String ownerName) method that simulates the downloading of one of the songs in the catalog. It should use the getSong() method that you just wrote, and add the downloaded song to the user’s songList (if not null).
Test your code now with the following program:
// User.java
import java.util.ArrayList;
public class User {
private String userName;
private boolean online;
// array list of songs
ArrayList<Song> songList;
public User() {
this("");
}
public User(String u) {
userName = u;
>
// initializing songs list
songList = new ArrayList<Song>();
}
// getter method for songs list
public ArrayList<Song> getSongList() {
return songList;
}
public String getUserName() {
return userName;
}
public boolean isOnline() {
return online;
}
public String toString() {
// will show the number of songs also
String s = "" + userName + ": " + songList.size() + " songs (";
if (!online)
s += "not ";
return s + "online)";
}
/**
* method to add a song to the list
*/
public void addSong(Song song) {
songList.add(song);
}
/**
* method to find the total play time of all songs in the list
*/
public int totalSongTime() {
int total = 0;
for (Song s : songList) {
// adding the duration to the total
total += s.getDuration();
}
return total;
}
/**
* method to register the current user in a MusicExchangeCenter
*/
public void register(MusicExchangeCenter m) {
m.registerUser(this);
}
/**
* method to login the current user into a MusicExchangeCenter, only if
* he/she is a member
*/
public void logon(MusicExchangeCenter m) {
if (m.userWithName(userName) != null) {
>
}
}
/**
* method to logoff the current user into a MusicExchangeCenter, only if
* he/she is a member
*/
public void logoff(MusicExchangeCenter m) {
if (m.userWithName(userName) != null) {
>
}
}
// Various Users for test purposes
public static User DiscoStew() {
User discoStew = new User("Disco Stew");
discoStew.addSong(new Song("Hey Jude", "The Beatles", 4, 35));
discoStew.addSong(new Song("Barbie Girl", "Aqua", 3, 54));
discoStew.addSong(new Song("Only You Can Rock Me", "UFO", 4, 59));
discoStew.addSong(new Song("Paper Soup Cats", "Jaw", 4, 18));
return discoStew;
}
public static User SleepingSam() {
User sleepingSam = new User("Sleeping Sam");
sleepingSam.addSong(new Song("Meadows", "Sleepfest", 7, 15));
sleepingSam.addSong(new Song("Calm is Good", "Waterfall", 6, 22));
return sleepingSam;
}
public static User RonnieRocker() {
User ronnieRocker = new User("Ronnie Rocker");
ronnieRocker.addSong(new Song("Rock is Cool", "Yeah", 4, 17));
ronnieRocker.addSong(new Song("My Girl is Mean to Me",
"Can't Stand Up", 3, 29));
ronnieRocker.addSong(new Song("Only You Can Rock Me", "UFO", 4, 52));
ronnieRocker.addSong(new Song("We're Not Gonna Take It",
"Twisted Sister", 3, 9));
return ronnieRocker;
}
public static User CountryCandy() {
User countryCandy = new User("Country Candy");
countryCandy.addSong(new Song("If I Had a Hammer", "Long Road", 4, 15));
countryCandy.addSong(new Song("My Man is a 4x4 Driver", "Ms. Lonely",
3, 7));
countryCandy.addSong(new Song("This Song is for Johnny", "Lone Wolf",
4, 22));
return countryCandy;
}
public static User PeterPunk() {
User peterPunk = new User("Peter Punk");
peterPunk.addSong(new Song("Bite My Arms Off", "Jaw", 4, 12));
peterPunk
.addSong(new Song("Where's My Sweater", "The Knitters", 3, 41));
peterPunk.addSong(new Song("Is that My Toenail ?", "Clip", 4, 47));
peterPunk.addSong(new Song("Anvil Headache", "Clip", 4, 34));
peterPunk.addSong(new Song("My Hair is on Fire", "Jaw", 3, 55));
return peterPunk;
}
}
// MusicExchangeCenter.java
import java.util.ArrayList;
public class MusicExchangeCenter {
// array list of all available users
private ArrayList<User> users;
public MusicExchangeCenter() {
// initializing users list
users = new ArrayList<User>();
}
/**
* returns all online users
*/
public ArrayList<User> onlineUsers() {
ArrayList<User> ArrayList<User>();
for (User u : users) {
if (u.isOnline()) {
online.add(u);
}
}
return online;
}
/**
* returns all available songs from all online users
*/
public ArrayList<Song> allAvailableSongs() {
ArrayList<Song> availableSongs = new ArrayList<Song>();
for (User u : onlineUsers()) {
availableSongs.addAll(u.getSongList());
}
return availableSongs;
}
@Override
public String toString() {
// returning a string in proper format
return "Music Exchange Center (" + onlineUsers().size()
+ " users online, " + allAvailableSongs().size()
+ " songs available)";
}
/**
* returns the User with given name if found
*
* @param s
* - user name
* @return - User object if found, else null
*/
public User userWithName(String s) {
for (User u : users) {
if (u.getUserName().equalsIgnoreCase(s)) {
return u;
}
}
return null;
}
/**
* method to register a user, if not already exist
*/
public void registerUser(User x) {
if (userWithName(x.getUserName()) == null) {
users.add(x);
}
}
/**
* returns all available songs by a specific artist , from all online users
*/
public ArrayList<Song> availableSongsByArtist(String artist) {
ArrayList<Song> songsByArtist = new ArrayList<Song>();
for (Song s : allAvailableSongs()) {
if (s.getArtist().equalsIgnoreCase(artist)) {
songsByArtist.add(s);
}
}
return songsByArtist;
}
}
// Song.java
Explanation / Answer
MusicExchangeTestProgram.java
public class MusicExchangeTestProgram {
public static void main(String args[]) {
// Create a new music exchange center
MusicExchangeCenter mec = new MusicExchangeCenter();
// Create some users and give them some songs
User discoStew = User.DiscoStew();
User sleepingSam = User.SleepingSam();
User ronnieRocker = User.RonnieRocker();
User countryCandy = User.CountryCandy();
User peterPunk = User.PeterPunk();
// Register the users, except SleepingSam
discoStew.register(mec);
ronnieRocker.register(mec);
countryCandy.register(mec);
peterPunk.register(mec);
// Display the state of things before anyone logs on
System.out.println("Status: " + mec);
System.out.println("On-Line Users: " + mec.onlineUsers());
System.out.println("Available Songs: " + mec.allAvailableSongs() + " ");
// Attempt to log on two registered users and one unregistered user
discoStew.logon(mec);
sleepingSam.logon(mec); // Should not work
ronnieRocker.logon(mec);
System.out.println("Status: " + mec);
System.out.println("On-Line Users: " + mec.onlineUsers());
System.out.println("Available Songs: " + mec.allAvailableSongs() + " ");
// Log on two more users
countryCandy.logon(mec);
peterPunk.logon(mec);
System.out.println("Status: " + mec);
System.out.println("On-Line Users: " + mec.onlineUsers());
System.out.println("Available Songs: " + mec.allAvailableSongs());
System.out.println("Available Songs By Jaw: " +
mec.availableSongsByArtist("Jaw") + " ");
// Log off three users (one is not even logged in)
countryCandy.logoff(mec);
discoStew.logoff(mec);
sleepingSam.logoff(mec);
System.out.println("Status: " + mec);
System.out.println("On-Line Users: " + mec.onlineUsers());
System.out.println("Available Songs: " + mec.allAvailableSongs());
System.out.println("Available Songs By Jaw: " +
mec.availableSongsByArtist("Jaw") + " ");
// Log off the last two users
peterPunk.logoff(mec);
ronnieRocker.logoff(mec);
System.out.println("Status: " + mec);
System.out.println("On-Line Users: " + mec.onlineUsers());
System.out.println("Available Songs: " + mec.allAvailableSongs());
System.out.println("Available Songs By Jaw: " +
mec.availableSongsByArtist("Jaw") + " ");
}
}
MusicExchangeCenter.java
import javafx.util.Pair;
import java.util.*;
public class MusicExchangeCenter {
Map<String, Double> royalties = new HashMap<String, Double>();
ArrayList<User> users;
private ArrayList<Song> downloadedSongs = new ArrayList<Song>();
public ArrayList<Song> getDownloadedSongs() {
return downloadedSongs;
}
public MusicExchangeCenter() {
users = new ArrayList<>();
}
public static ArrayList removeDuplicate(ArrayList list) {
ArrayList newlist = list;
try {
for (int i = 0; i < list.size(); i++) {
//print("" + list.size());
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) {
newlist.remove(j);
//print("I removed something");
}
}
}
} catch (IndexOutOfBoundsException e) {
return removeDuplicate(newlist);
}
return list;
}
public TreeSet<Song> uniqueDownloads() {
TreeSet<Song> aTreeSet = new TreeSet<>(new Comparator<Song>() {
@Override
public int compare(Song o1, Song o2) {
return o1.getTitle().compareTo(o2.getTitle());
}
});
for (Song song : downloadedSongs) {
aTreeSet.add(song);
}
return aTreeSet;
}
public ArrayList<Pair<Integer, Song>> songsByPopularity() {
ArrayList<Pair<Integer, Song>> anArray = new ArrayList<>();
int downloadCount;
for (Song song : uniqueDownloads()) {
downloadCount = 0;
for (Song songinlist : downloadedSongs) {
if (song.getTitle().equals(songinlist.getTitle())) {
downloadCount++;
}
}
anArray.add(new Pair<>(downloadCount, song));
}
anArray.sort(new Comparator<Pair<Integer, Song>>() {
public int compare(Pair<Integer, Song> p1, Pair<Integer, Song> p2) {
if (p1.getKey() < p2.getKey()) {
return 1;
}
return -1;
}
});
return anArray;
}
public void setRoyalties(Song s) {
if (royalties.get(s.getArtist()) != null) {
royalties.put(s.getArtist(), royalties.get(s.getArtist()) + .25);
} else {
royalties.put(s.getArtist(), 0.25);
}
}
public void displayRoyalties() {
print(String.format("%-8s%-10s%n------------------", "Amount", "Artist"));
for (String artist : royalties.keySet()) {
print(String.format("%n$%-7.2f%-10s", royalties.get(artist), (artist)));
}
}
public void print(String s) {
System.out.printf(s);
}
public ArrayList onlineUsers() {
ArrayList<User> ArrayList<>();
for (User user : users) {
if (user.isOnline()) {
onlineUsers.add(user);
}
}
return onlineUsers;
}
public ArrayList<Song> allAvailableSongs() {
ArrayList<Song> availableSongs = new ArrayList<>();
for (User user : users) {
if (user.isOnline()) {
for (Song s : user.getSongList()) {
availableSongs.add(s);
}
}
}
return (ArrayList<Song>) removeDuplicate(availableSongs);
}
@Override
public String toString() {
return String.format("Music Exchange Center (%s users on-line, %s songs available)", (onlineUsers().isEmpty()) ? 0 : onlineUsers().size(), (allAvailableSongs().isEmpty()) ? 0 : allAvailableSongs().size());
}
public User userWithName(String s) {
for (User user : users) {
if (user.getUserName().equals(s)) {
return user;
}
}
return null;
}
public void registerUser(User x) {
if (userWithName(x.getUserName()) == null) {
users.add(x);
}
}
public Song getSong(String title, String ownerName) {
for (User u : users) {
if (u.getUserName().equals(ownerName)) {
if (u.isOnline()) {
for (Song song : u.getSongList()) {
if (title.equals(song.getTitle())) {
return song;
}
}
}
}
}
return null;
}
public ArrayList<Song> availableSongsByArtist(String artist) {
ArrayList<Song> songByArtist = new ArrayList<>();
for (Song s : allAvailableSongs()) {
if (s.getArtist().equals(artist)) {
songByArtist.add(s);
}
}
return songByArtist;
}
}
User.java
import java.util.ArrayList;
public class User {
private String userName;
private boolean online;
private ArrayList<Song> songList;
public User() {
this("");
}
public User(String u) {
userName = u;
> songList = new ArrayList<Song>();
}
// Various Users for test purposes
public static User DiscoStew() {
User discoStew = new User("Disco Stew");
discoStew.addSong(new Song("Hey Jude", "The Beatles", 4, 35));
discoStew.addSong(new Song("Barbie Girl", "Aqua", 3, 54));
discoStew.addSong(new Song("Only You Can Rock Me", "UFO", 4, 59));
discoStew.addSong(new Song("Paper Soup Cats", "Jaw", 4, 18));
return discoStew;
}
public ArrayList<Song> getSongList() {
return songList;
}
public void register(MusicExchangeCenter m) {
m.registerUser(this);
}
public void logon(MusicExchangeCenter m) {
if (m.userWithName(userName) != null) {
> }
}
public void logoff(MusicExchangeCenter m) {
if (m.userWithName(userName) != null) {
> }
}
public Song getSongByTitle(String s) {
for (Song song : songList) {
if (song.getTitle().equals(s)) {
return song;
}
}
return null;
}
public boolean containsDuplicates() {
for (int i = 0; i < songList.size(); i++) {
for (int j = i + 1; j < songList.size(); j++) {
//print(String.format("%n%s ==== %s", songList.get(i), songList.get(j)));
if (songList.get(i).getTitle().equals(songList.get(j).getTitle())) {
return true;
}
}
}
return false;
}
public void downloadSong(MusicExchangeCenter m, String title, String ownerName) {
Song songToDownload = m.getSong(title, ownerName);
if (songToDownload != null) {
Song newSong = new Song(songToDownload.getTitle(), songToDownload.getArtist(), songToDownload.getMinutes(), songToDownload.getSeconds());
newSong.owner = this;
songList.add(newSong);
m.setRoyalties(newSong);
m.getDownloadedSongs().add(newSong);
}
}
public static User SleepingSam() {
User sleepingSam = new User("Sleeping Sam");
sleepingSam.addSong(new Song("Meadows", "Sleepfest", 7, 15));
sleepingSam.addSong(new Song("Calm is Good", "Waterfall", 6, 22));
return sleepingSam;
}
public static User RonnieRocker() {
User ronnieRocker = new User("Ronnie Rocker");
ronnieRocker.addSong(new Song("Rock is Cool", "Yeah", 4, 17));
ronnieRocker.addSong(new Song("My Girl is Mean to Me", "Can't Stand Up", 3, 29));
ronnieRocker.addSong(new Song("Only You Can Rock Me", "UFO", 4, 52));
ronnieRocker.addSong(new Song("We're Not Gonna Take It", "Twisted Sister", 3, 9));
return ronnieRocker;
}
public static User CountryCandy() {
User countryCandy = new User("Country Candy");
countryCandy.addSong(new Song("If I Had a Hammer", "Long Road", 4, 15));
countryCandy.addSong(new Song("My Man is a 4x4 Driver", "Ms. Lonely", 3, 7));
countryCandy.addSong(new Song("This Song is for Johnny", "Lone Wolf", 4, 22));
return countryCandy;
}
public static User PeterPunk() {
User peterPunk = new User("Peter Punk");
peterPunk.addSong(new Song("Bite My Arms Off", "Jaw", 4, 12));
peterPunk.addSong(new Song("Where's My Sweater", "The Knitters", 3, 41));
peterPunk.addSong(new Song("Is that My Toenail ?", "Clip", 4, 47));
peterPunk.addSong(new Song("Anvil Headache", "Clip", 4, 34));
peterPunk.addSong(new Song("My Hair is on Fire", "Jaw", 3, 55));
return peterPunk;
}
public String getUserName() {
return userName;
}
public void addSong(Song s) {
songList.add(s);
s.owner = this;
}
public void print(String s) {
System.out.println(s);
}
public ArrayList<String> requestCompleteSonglist(MusicExchangeCenter m) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add(String.format("%3s %-25s %-15s %-6s %-10s", "", "TITLE", "ARTIST", "TIME", "OWNER"));
for (Song s : m.allAvailableSongs()) {
stringList.add(String.format("%2s. %-25s %-15s %-1s:%-4s %-10s", stringList.size(), s.getTitle(), s.getArtist(), s.getMinutes(), s.getSeconds(), s.owner.getUserName()));
}
for (String s : stringList) {
//print(s);
}
return stringList;
}
public ArrayList<String> requestSonglistByArtist(MusicExchangeCenter m, String artist) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add(String.format("%3s %-25s %-15s %-6s %-10s%n", "", "TITLE", "ARTIST", "TIME", "OWNER"));
for (Song s : m.availableSongsByArtist(artist)) {
stringList.add(String.format("%2s. %-25s %-15s %-1s:%-4s %-10s", stringList.size(), s.getTitle(), s.getArtist(), s.getMinutes(), s.getSeconds(), s.owner.getUserName()));
}
return stringList;
}
public int totalSongTime() {
int total = 0;
for (Song song : songList) {
total += song.getSeconds();
}
return total;
}
public boolean isOnline() {
return online;
}
public String toString() {
String s = "" + userName + ": " + songList.size() + " songs (";
if (!online) s += "not ";
return s + "online)";
}
}
Song.java
public class Song {
public User owner = null;
private String title;
private String artist;
private int duration;
public Song() {
this("", "", 0, 0);
}
public Song(String t, String a, int m, int s) {
title = t;
artist = a;
duration = m * 60 + s;
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public int getDuration() {
return duration;
}
public int getMinutes() {
return duration / 60;
}
public int getSeconds() {
return duration % 60;
}
public String toString() {
return (""" + title + "" by " + artist + " " + (duration / 60) + ":" + (duration % 60));
}
}
MusicExchangeTestProgram2.java
import java.util.ArrayList;
public class MusicExchangeTestProgram2 {
public static void main(String args[]) {
ArrayList<String> catalog;
// Create a new music exchange center
MusicExchangeCenter mec = new MusicExchangeCenter();
// Create some users and give them some songs
User discoStew = User.DiscoStew();
User sleepingSam = User.SleepingSam();
User ronnieRocker = User.RonnieRocker();
User countryCandy = User.CountryCandy();
User peterPunk = User.PeterPunk();
// Register the users
discoStew.register(mec);
ronnieRocker.register(mec);
sleepingSam.register(mec);
countryCandy.register(mec);
peterPunk.register(mec);
// Log on all users
discoStew.logon(mec);
sleepingSam.logon(mec);
ronnieRocker.logon(mec);
countryCandy.logon(mec);
peterPunk.logon(mec);
System.out.println("Status: " + mec);
// Simulate a user requesting a list of songs
catalog = discoStew.requestCompleteSonglist(mec);
System.out.println("Complete Song List: ");
for (String s : catalog)
System.out.println(" " + s);
// Simulate a user downloading 3 songs from the list
System.out.println(" Disco Stew before downloading: " + discoStew);
discoStew.downloadSong(mec, "Bite My Arms Off", "Peter Punk");
discoStew.downloadSong(mec, "Meadows", "Sleeping Sam");
discoStew.downloadSong(mec, "If I Had a Hammer", "Country Candy");
discoStew.downloadSong(mec, "Sandy Toes", "Country Candy");
ronnieRocker.logoff(mec); // log off Ronnie, next download should fail
discoStew.downloadSong(mec, "Only You Can Rock Me", "Ronnie Rocker");
System.out.println("Disco Stew after downloading: " + discoStew);
ronnieRocker.logon(mec); // log on Ronnie, next download should work
discoStew.downloadSong(mec, "Only You Can Rock Me", "Ronnie Rocker");
System.out.println("Disco Stew after downloading Ronnie's: " + discoStew + " ");
// Simulate a user requesting a list of songs by a specific artist
catalog = discoStew.requestSonglistByArtist(mec, "Jaw");
System.out.println("Song's by Jaw: ");
for (String s : catalog)
System.out.println(" " + s);
}
}
MusicExchangeTestProgram3.java
import javafx.util.Pair;
public class MusicExchangeTestProgram3 {
public static void main(String args[]) {
// Create a new music exchange center
MusicExchangeCenter mec = new MusicExchangeCenter();
// Create some users and give them some songs
User discoStew = User.DiscoStew();
User sleepingSam = User.SleepingSam();
User ronnieRocker = User.RonnieRocker();
User countryCandy = User.CountryCandy();
User peterPunk = User.PeterPunk();
// Register the users
discoStew.register(mec);
ronnieRocker.register(mec);
sleepingSam.register(mec);
countryCandy.register(mec);
peterPunk.register(mec);
// Log on all users
discoStew.logon(mec);
sleepingSam.logon(mec);
ronnieRocker.logon(mec);
countryCandy.logon(mec);
peterPunk.logon(mec);
System.out.println("Status: " + mec);
// Simulate users downloading various songs
discoStew.downloadSong(mec, "Bite My Arms Off", "Peter Punk");
discoStew.downloadSong(mec, "Meadows", "Sleeping Sam");
discoStew.downloadSong(mec, "If I Had a Hammer", "Country Candy");
discoStew.downloadSong(mec, "Is that My Toenail ?", "Peter Punk");
sleepingSam.downloadSong(mec, "Anvil Headache", "Peter Punk");
sleepingSam.downloadSong(mec, "Is that My Toenail ?", "Disco Stew");
sleepingSam.downloadSong(mec, "If I Had a Hammer", "Country Candy");
countryCandy.downloadSong(mec, "Anvil Headache", "Peter Punk");
countryCandy.downloadSong(mec, "Meadows", "Sleeping Sam");
countryCandy.downloadSong(mec, "If I Had a Hammer", "Peter Punk");
countryCandy.downloadSong(mec, "Only You Can Rock Me", "Ronnie Rocker");
countryCandy.downloadSong(mec, "Is that My Toenail ?", "Disco Stew");
peterPunk.downloadSong(mec, "Is that My Toenail ?", "Country Candy");
peterPunk.downloadSong(mec, "Rock is Cool", "Ronnie Rocker");
peterPunk.downloadSong(mec, "What?", "Ronnie Rocker");
peterPunk.downloadSong(mec, "Meadows", "Sleeping Sam");
// Display the downloaded songs
System.out.println(" Here are the downloaded songs: ");
for (Song s : mec.getDownloadedSongs())
System.out.println(s);
// Display the downloaded songs alphabetically
System.out.println(" Here are the unique downloaded songs alphabetically: ");
for (Song s : mec.uniqueDownloads())
System.out.println(s);
// Display the downloaded songs in order of popularity
System.out.println(" Here are the downloaded songs by populariry: ");
for (Pair<Integer, Song> p : mec.songsByPopularity())
System.out.println("(" + p.getKey() + " downloads) " + p.getValue());
// Display the royalties
System.out.println(" Here are the royalties: ");
mec.displayRoyalties();
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.