Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

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

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:

image text in transcribed

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 centers users to find User with the matching ownerName and then search through that users 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 users songList (if not null).

Test your code now with the following program:

import java.util.ArrayList; public class MusicExchangeTestProgram2 { public static void main(String args[]) { ArrayList 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); } } 

Now....in order to make all of this legal, we must have a way to compensate the musical artists for their hard work and wonderful music. The compensation depends on many factors. An artist should receive 25 cents each time one of their songs is downloaded. Hence, for each artist, we will keep track of how much money in royalties they have. Add the following attributes to the MusicExchangeCenter class:

royalties - a HashMap with the artists name as the keys and the values are floats representing the total amount of royalties for that artist so far. It should only contain artists who have had songs downloaded.

downloadedSongs an ArrayList containing all of the songs that have been downloaded. This list will, in general, contain duplicate Song objects.

Write a method in the MusicExchangeCenter class called displayRoyalties() that displays the royalties for all artists who have had at least one of their songs downloaded. It should display a two-line header and then one line per artist showing the royalty amount as well as the artist name as follows:

image text in transcribed

In the getSong() method in the MusicExchangeCenter, adjust the code so that if the song is found (i.e., able to be downloaded), then it is added to the downloadedSongs list. Write the get method for the downloadedSongs attribute.

Write a method in the MusicExchangeCenter class called uniqueDownloads() that returns (i.e., not displays) a TreeSet of all downloaded Song objects such that the set is sorted alphabetically by song title. There should be no duplicates songs in this set.

Write a method in the MusicExchangeCenter class called songsByPopularity() that returns (i.e., not displays) an ArrayList of Pair objects where the key of the pair is an Integer and the value is the Song object. The integer key should represent the number of times that that song was downloaded. The list returned should be sorted in decreasing order according to the number of times the song was downloaded. To sort a list of Pair objects, you can use the following code:

Collections.sort(popular, new Comparator>() {

public int compare(Pair p1, Pair p2) {

//Put code here

}

});

Just insert the missing code so that it returns an appropriate integer indicating whether pair p1 comes before or after pair p2 in the sort order.

Test your code now with the following program:

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 p: mec.songsByPopularity()) System.out.println("(" + p.getKey() + " downloads) " + p.getValue()); // Display the royalties System.out.println(" Here are the royalties: "); mec.displayRoyalties(); } }

// User.java

import java.util.ArrayList;

public class User {

private String userName;

private boolean online;

// array list of songs

ArrayList songList;

public User() {

this("");

}

public User(String u) {

userName = u;

online = false;

// initializing songs list

songList = new ArrayList();

}

// getter method for songs list

public ArrayList 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) {

online = true;

}

}

/**

* 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) {

online = false;

}

}

// 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 users;

public MusicExchangeCenter() {

// initializing users list

users = new ArrayList();

}

/**

* returns all online users

*/

public ArrayList onlineUsers() {

ArrayList online = new ArrayList();

for (User u : users) {

if (u.isOnline()) {

online.add(u);

}

}

return online;

}

/**

* returns all available songs from all online users

*/

public ArrayList allAvailableSongs() {

ArrayList availableSongs = new ArrayList();

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 availableSongsByArtist(String artist) {

ArrayList songsByArtist = new ArrayList();

for (Song s : allAvailableSongs()) {

if (s.getArtist().equalsIgnoreCase(artist)) {

songsByArtist.add(s);

}

}

return songsByArtist;

}

}

TITLE ARTIST TIME OWNER 1. Hey Jude 2. Barbie Girl . Only You Can Rock Me 4. Paper Soup Cats 5. Rock is Cool 6. My Girl is Mean to Me 7. Only You Can Rock Me 8. We're Not Gonna Take It The Beatles Aqua UFO Jaw Yeah Can't Stand Up 3:29 Ronnie Rocker UFO Twisted Sister 3:09 Ronnie Rocker 4:35 Disco Stew 3:54 Disco Stew 4:59 Disco Stew 4:18 DiscoStew 4:17 Ronnie Rocker 4:52 Ronnie Rocker etc. TITLE ARTIST TIME OWNER 1. Hey Jude 2. Barbie Girl . Only You Can Rock Me 4. Paper Soup Cats 5. Rock is Cool 6. My Girl is Mean to Me 7. Only You Can Rock Me 8. We're Not Gonna Take It The Beatles Aqua UFO Jaw Yeah Can't Stand Up 3:29 Ronnie Rocker UFO Twisted Sister 3:09 Ronnie Rocker 4:35 Disco Stew 3:54 Disco Stew 4:59 Disco Stew 4:18 DiscoStew 4:17 Ronnie Rocker 4:52 Ronnie Rocker etc

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Students also viewed these Databases questions