Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.xml.crypto.Data;
- import java.awt.*;
- import java.io.Serializable;
- import java.net.*;
- import java.io.IOException;
- import java.sql.Array;
- import java.sql.SQLOutput;
- import java.util.ArrayList;
- import java.util.Scanner;
- import java.io.*;
- import static java.lang.Thread.sleep;
- class User implements Serializable {
- private String username, password, user_type;
- public User(String username, String password, String user_type) {
- this.username = username;
- this.password = password;
- this.user_type = user_type;
- }
- public String getUsername() {
- return username;
- }
- public String getPassword() {
- return password;
- }
- public String getUser_type() { return user_type; }
- public void setUser_type(String user_type) {
- this.user_type = user_type;
- }
- }
- class Music implements Serializable {
- private String artist, genre, album, name; //Nao sei se fica String album ou se mudo para Album album
- private int duration;
- //ArrayList <User> user;
- public Music(String artist, String genre, String album, String name, int duration) {
- this.artist = artist;
- this.genre = genre;
- this.album = album;
- this.name = name;
- this.duration = duration;
- }
- public String getArtist() {
- return artist;
- }
- public String getGenre() {
- return genre;
- }
- public String getAlbum_title() {
- return album;
- }
- public String getName() {
- return name;
- }
- public int getDuration() {
- return duration;
- }
- public void setArtist(String artist) {
- this.artist = artist;
- }
- public void setGenre(String genre) {
- this.genre = genre;
- }
- public void setAlbum(String album) {
- this.album = album;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setDuration(int duration) {
- this.duration = duration;
- }
- }
- class Album implements Serializable {
- private String album_name, description;
- private double rating; //rating médio //Nao sei se fica cá ou se o retiro
- private String artist;
- ArrayList <Music> music_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
- ArrayList <Review> review_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
- public Album(String album_name, String artist, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list) {
- this.album_name = album_name;
- this.description = description;
- this.rating = rating;
- this.artist = artist;
- this.music_list = music_list;
- this.review_list = review_list;
- }
- public String getAlbum_name() {
- return album_name;
- }
- public String getDescription() {
- return description;
- }
- public double getRating() {
- rating = average_rating();
- return rating;
- }
- public ArrayList<Music> getMusic_list() {
- return music_list;
- }
- public ArrayList<Review> getReview_list() {
- return review_list;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public String getArtist() {
- return artist;
- }
- public double average_rating (){
- int soma = 0;
- int size = review_list.size();
- double average_rating;
- for (Review r: review_list){
- soma += r.getRating();
- }
- average_rating = (double) soma / size;
- return average_rating;
- }
- public void setAlbum_name(String album_name) {
- this.album_name = album_name;
- }
- public void setRating(double rating) {
- this.rating = rating;
- }
- public void setArtist(String artist) {
- this.artist = artist;
- }
- }
- class Review implements Serializable { //AINDA TENHO QUE VER PRECISA DE SERIALIZABLE OU NÃO
- private String text;
- private int rating;
- private String user;
- public Review(String text, int rating, String user) {
- this.text = text;
- this.rating = rating;
- this.user = user;
- }
- public String getText() {
- return text;
- }
- public int getRating() {
- return rating;
- }
- public String getUser() {
- return user;
- }
- }
- class Artist implements Serializable{
- private String nome, grupo, genre, biography;
- private String data_nasc; //TALVIZ CRIAR UMA CLASSE DATA
- ArrayList <Music> music_list;
- public Artist(String nome, String grupo, String data_nasc, String genre, String biography, ArrayList <Music> music_list) {
- this.nome = nome;
- this.grupo = grupo;
- this.data_nasc = data_nasc;
- this.genre = genre;
- this.biography = biography;
- this.music_list = music_list;
- }
- public String getNome() {
- return nome;
- }
- public String getGrupo() {
- return grupo;
- }
- public String getData_nasc() {
- return data_nasc;
- }
- public String getGenre() {
- return genre;
- }
- public String getBiography() {
- return biography;
- }
- public ArrayList<Music> getMusic_list() {
- return music_list;
- }
- public void setNome(String nome) {
- this.nome = nome;
- }
- public void setGrupo(String grupo) {
- this.grupo = grupo;
- }
- public void setGenre(String genre) {
- this.genre = genre;
- }
- public void setBiography(String biography) {
- this.biography = biography;
- }
- public void setData_nasc(String data_nasc) {
- this.data_nasc = data_nasc;
- }
- public void setMusic_list(ArrayList<Music> music_list) {
- this.music_list = music_list;
- }
- }
- class DatabaseConnection {
- //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
- public DatabaseConnection() {
- }
- boolean username_match (String username){
- ArrayList <User> users = new ArrayList<>();
- //Abrir para a leitura do ficheiro de objetos
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
- users = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- for (User u: users){
- if (u.getUsername().equals(username)) {
- return true;
- }
- }
- return false;
- }
- boolean password_match (String username, String password){
- //Tenho que procurar por username e depois por password
- //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
- ArrayList <User> users = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
- users = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- for (User u: users) {
- if (u.getUsername().equals(username)) {
- if (u.getPassword().equals(password)) {
- return true;
- }
- }
- }
- return false;
- }
- void write_user_file(String text, ArrayList <User> users) { //Para escrever no ficheiro de utilizadores
- try {
- ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
- oS.writeObject(users);
- oS.close();
- } catch (IOException e) {
- System.out.print("ERRO");
- System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
- }
- }
- ArrayList <Album> get_AlbumList (){
- ArrayList <Album> album_list = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList_obj.txt"))) {
- album_list = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return album_list;
- }
- void write_albumlist_file (String text, ArrayList <Album> album_list) { //Para escrever no ficheiro de álbuns
- try {
- ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
- oS.writeObject(album_list);
- oS.close();
- } catch (IOException e) {
- System.out.print("ERRO");
- System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
- }
- }
- ArrayList <Music> get_MusicList (){
- ArrayList <Music> music_list = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("MusicList_obj.txt"))) {
- music_list = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return music_list;
- }
- ArrayList <Artist> get_ArtistList (){
- ArrayList <Artist> artist_list = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("ArtistList_obj.txt"))) {
- artist_list = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return artist_list;
- }
- ArrayList <User> get_UserList (){
- ArrayList <User> user_list = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
- user_list = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- return user_list;
- }
- }
- class MessageParsing {
- public String [] MessageParsing (String message){
- //Separar por ";" e saber o número de pares
- String [] pares = message.split(";");
- String [] campos = new String[pares.length] ;
- if (pares.length >= 3){ //NAO SEI SE PRECISO DESTA CONDICAO OU NAO, TENHO QUE TER ATENCAO POR CAUSA DA EXCEPTION
- for (int i = 0; i < pares.length; i++){
- String [] aux = pares[i].split("\\|");
- campos[i] = aux[1];
- }
- }
- //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
- //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
- return campos;
- }
- }
- class UDPMulticastProtocol implements Serializable {
- private String MULTICAST_ADDRESS = "224.3.2.1";
- private int PORT = 4444; //Porto de envio
- DatabaseConnection data = new DatabaseConnection();
- public UDPMulticastProtocol() {
- }
- void login (String pack_id, String username, String password, MulticastSocket socket, int server_id){
- System.out.println("O cliente deseja fazer login");
- System.out.println("Username inserido: " + username);
- System.out.println("Password inserida: " + password);
- //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
- if (data.username_match(username)){
- if (data.password_match(username, password)){ //SUCESSO
- //System.out.println("GREAT SUCCESS");
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; logged|on; " + "msg|Welcome to DropMusic";
- try{
- byte[] buffer = rsp.getBytes();
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- else { //PASSWORD ERRADA
- //System.out.println("PASSWORD ERRADA");
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Password incorreta";
- try{
- byte[] buffer = rsp.getBytes();
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- else{ //UTILIZADOR NAO EXISTE
- //System.out.println("Utilizador nao existe");
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Utilizador nao existe";
- try{
- byte[] buffer = rsp.getBytes();
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- void register (String pack_id, String username, String password, MulticastSocket socket, int server_id) throws IOException {
- ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
- //Abrir para a leitura do ficheiro de objetos
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
- users = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- System.out.println("O cliente deseja registar-se");
- System.out.println("Username inserido: " + username);
- System.out.println("Password inserida: " + password);
- //Temos que ver se existe o username ou não
- if (!data.username_match(username)) {
- //Abrir para escrita no ficheiro de objetos
- if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
- User u = new User(username, password, "admin");
- users.add(u);
- }
- else{
- User u = new User(username, password, "normal");
- users.add(u);
- }
- try {
- ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
- oS.writeObject(users);
- oS.close();
- } catch (IOException e) {
- System.out.print("ERRO");
- System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
- }
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; register|successful; " + "msg|Welcome to DropMusic";
- try{
- byte[] buffer = rsp.getBytes();
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- else {
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; register|unsuccessful; " + "msg|Esse username ja existe";
- try{
- byte[] buffer = rsp.getBytes();
- //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //SÓ PARA VER QUEM TENHO REGISTADO
- for (User uss: users){
- System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
- }
- }
- void search_music (String pack_id, String choice, String name, MulticastSocket socket, int server_id){ //FALTA o ALL, COMPLETAR E TESTAR
- System.out.println("O cliente deseja procurar musica");
- switch (choice){
- case "all": //Vai procurar por tudo o que os outros "cases" vao procurar //ACHO QUE VOU RETIRAR ISTO
- break;
- case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
- ArrayList <Album> album_list = data.get_AlbumList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
- //ArrayList <Music> aux = new ArrayList<>(); //ArrayList auxiliar para pôr todos os albuns com o nome "name"
- String x = "";
- int item_count = 0;
- for (Album a: album_list){
- if (a.getAlbum_name().equals(name)){
- item_count = a.music_list.size();
- for (int k = 0; k < item_count; k++)
- x += "item_"+k+"_name| " + a.music_list.get(k).getName();
- }
- }
- //1. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list from the searched album" +
- "item_count| " + item_count + x; //Ver se o item_count é bem apresentado
- try{
- byte[] buffer = rsp.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "music": //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
- ArrayList <Music> music_list = data.get_MusicList();
- //ArrayList <Music> auxappend = new ArrayList<>();
- String s = "";
- int item_size = 0;
- for (Music m: music_list){
- if (m.getName().equals(name)){
- s += "item_"+item_size+"_name| " + m.getName();
- item_size++;
- }
- }
- //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
- String ans = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
- "item_count| " + item_size + s; //Ver se o item_size é bem apresentado
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = ans.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
- //NOTAAAA: DECIDIR SE CRIO UM FICHEIRO DE ARTISTAS OU SE NÃO É NECESSÁRIO
- ArrayList <Artist> artist_list = data.get_ArtistList();
- String z = "";
- int tam = 0;
- for (Artist a: artist_list){
- if (a.getNome().equals(name)){
- for (int j = 0; j < a.getMusic_list().size(); j++){
- tam = a.getMusic_list().size();
- z += "item_"+ j +"_name| " + a.getMusic_list().get(j).getName();
- }
- }
- }
- //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
- String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
- "item_count| " + tam + z; //Ver se o item_size é bem apresentado
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = resp.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
- ArrayList <Music> music_list1 = data.get_MusicList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
- String aux = "";
- int conta = 0;
- for (Music m: music_list1){
- if (m.getGenre().equals(name)){
- aux += "item_"+conta +"_name| " + m.getName();
- conta++;
- }
- }
- //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
- String envia = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
- "item_count| " + conta + aux; //Ver se o conta é bem apresentado
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = envia.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- }
- }
- void make_editor (String pack_id, String username, String novo_editor, MulticastSocket socket, int server_id){ //VERIFICAR E TESTAR
- System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
- ArrayList <User> users = new ArrayList<>();
- try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
- users = (ArrayList) oin.readObject();
- } catch (IOException e){
- System.out.println(e.getMessage());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
- if (data.username_match(username)) { //SUCESSO
- for (User u : users) {
- if (u.getUsername().equals(username)) {
- if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) {
- System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
- for (User us : users) {
- if (us.getUsername().equals(novo_editor)) {
- us.setUser_type("editor");
- data.write_user_file("Users_obj.txt", users);
- //ENVIAR RESPOSTA PARA O RMI SERVER
- //String rsp = "server_id|" + server_id + "; type|status;" + "; logged|on; " + "msg|Welcome to DropMusic";
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; make editor|successful; " + "msg|You can edit now";
- try {
- byte[] buffer = rsp.getBytes();
- //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- /*} else { //FALTA PÔR ESTE CHECK A FUNCIONAR
- System.out.println("Utilizador nao existe");
- //ENVIAR RESPOSTA PARA O RMI SERVER
- }*/
- }
- }
- }
- }
- }
- } else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; make editor|unsuccessful; " + "msg|The user you entered is not in our database";
- try {
- byte[] buffer = rsp.getBytes();
- //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- void manage_data (String pack_id, String username, String choice, String search_name, String op_type, String field_type, String name) { //EM FALTA
- System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
- //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
- ArrayList<User> users = data.get_UserList();
- ArrayList<Artist> artist_list = data.get_ArtistList();
- ArrayList<Album> album_list = data.get_AlbumList();
- ArrayList<Music> music_list = data.get_MusicList();
- if (data.username_match(username)) { //SUCESSO
- for (User u : users) {
- if (u.getUsername().equals(username)) {
- if (u.getUser_type().equals("editor")) {
- System.out.println("Tem permissao para editar");
- switch (choice) {
- case "artist": /*-------------------------ARTIST--------------------------*/
- String artist_name = name;
- switch (op_type){
- case "insert": /*-*************INSERT*****************/
- switch (field_type){
- case "name":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setNome(name);
- }
- }
- break;
- case "grupo":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGrupo(name);
- }
- }
- break;
- case "genre":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGenre(name);
- }
- }
- break;
- case "biography":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setBiography(name);
- }
- }
- break;
- case "data_nasc":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setData_nasc(name);
- }
- }
- break;
- case "music list":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- Music m = new Music (null, null, null, name, 0); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
- a.getMusic_list().add(m);
- }
- }
- break;
- }
- break;
- case "change": /*-*************CHANGE*****************/
- switch (field_type) {
- case "name":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setNome(name);
- }
- }
- break;
- case "grupo":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGrupo(name);
- }
- }
- break;
- case "genre":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGenre(name);
- }
- }
- break;
- case "biography":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setBiography(name);
- }
- }
- break;
- case "data_nasc":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setData_nasc(name);
- }
- }
- break;
- case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS
- break;
- }
- break;
- case "remove": /*-*************REMOVE*****************/
- switch (field_type) {
- case "name":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setNome(null);
- }
- }
- break;
- case "grupo":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGrupo(null);
- }
- }
- break;
- case "genre":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setGenre(null);
- }
- }
- break;
- case "biography":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setBiography(null);
- }
- }
- break;
- case "data_nasc":
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- a.setData_nasc(null);
- }
- }
- break;
- case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS--------------É PARA REMOVER MÚSICA OU A LISTA TODA?
- for (Artist a: artist_list){
- if (a.getNome().equals(search_name)){
- for (int i = 0; i < a.getMusic_list().size(); i++){
- if (a.getMusic_list().get(i).getName().equals(name)){
- a.getMusic_list().remove(i); //VER SE ESTA BEM
- }
- }
- }
- }
- break;
- }
- break;
- }
- break;
- case "album": /*-------------------------ALBUM--------------------------*/
- String album_title = name;
- switch (op_type) {
- case "insert":
- switch (field_type) {
- case "album name":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setAlbum_name(name);
- }
- }
- break;
- case "description":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setDescription(name);
- }
- }
- break;
- case "artist":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setArtist(name);
- }
- }
- break;
- case "review list": //NAO FAZ SENTIDO PORQUE SE QUER ESCREVER UMA REVIEW HÁ UM MÉTODO PROPRIO PARA ISSO
- //CAGUEI
- break;
- case "music list":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- Music m = new Music(null, null, null, name, 0); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
- a.getMusic_list().add(m);
- }
- }
- break;
- }
- break;
- case "change":
- switch (field_type) {
- case "album name":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setAlbum_name(name);
- }
- }
- break;
- case "description":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setDescription(name);
- }
- }
- break;
- case "artist":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setArtist(name);
- }
- }
- break;
- case "review list": //NAO FAZ SENTIDO PORQUE NAO SE VAI MEXER EM ALGO QUE JA ALGUEM ESCREVEU
- //CAGUEI
- break;
- case "music list": //DUVIDA //MUDO O QUÊ???????????????????????????
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- Music m = new Music(null, null, null, name, 0); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
- a.getMusic_list().add(m);
- }
- }
- break;
- }
- break;
- case "remove":
- switch (field_type) {
- case "album name":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setAlbum_name(null);
- }
- }
- break;
- case "description":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setDescription(null);
- }
- }
- break;
- case "artist":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- a.setArtist(null);
- }
- }
- break;
- /*case "review list": //COMO E QUE SEI QUE REVIEW É QUE HEI DE APAGAR????? O QUE É QUE A IDENTIFICA?????????????
- for (Album a: album_list){
- if (a.getAlbum_name().equals(search_name)){
- a.getReview_list().remove();
- }
- }
- break;*/
- case "music list":
- for (Album a : album_list) {
- if (a.getAlbum_name().equals(search_name)) {
- for (int i = 0; i < a.getMusic_list().size(); i++) {
- if (a.getMusic_list().get(i).getName().equals(name)) {
- a.getMusic_list().remove(i); //VER SE ESTA BEM
- }
- }
- }
- }
- break;
- }
- break;
- }
- break;
- case "music": /*-------------------------MUSIC--------------------------*/
- String music_name = name;
- switch (op_type) {
- case "insert":
- switch (field_type) {
- case "name":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setName(name);
- }
- }
- break;
- case "genre":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setGenre(name);
- }
- }
- break;
- case "artist":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setArtist(name);
- }
- }
- break;
- case "duration":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setDuration(Integer.parseInt(name));
- }
- }
- break;
- case "album":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
- }
- }
- break;
- }
- break;
- case "change":
- switch (field_type) {
- case "name":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setName(name);
- }
- }
- break;
- case "genre":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setGenre(name);
- }
- }
- break;
- case "artist":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setArtist(name);
- }
- }
- break;
- case "duration":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setDuration(Integer.parseInt(name));
- }
- }
- break;
- case "album":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
- }
- }
- break;
- }
- break;
- case "remove":
- switch (field_type) {
- case "name":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setName(null);
- }
- }
- break;
- case "genre":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setGenre(null);
- }
- }
- break;
- case "artist":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setArtist(null);
- }
- }
- break;
- case "duration":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setDuration(0);
- }
- }
- break;
- case "album":
- for (Music m : music_list) {
- if(m.getName().equals(search_name)){
- m.setAlbum(null); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
- }
- }
- break;
- }
- break;
- }
- break;
- }
- //3. De seguida, abro esse álbum para escrita e vou editar a info que lá está
- //4. Por fim envio a resposta ao utilizador
- }
- }
- }
- }
- }
- void search_info (String pack_id, String choice, String msg, MulticastSocket socket, int server_id){ //TESTAR E VER SE AS RESPOSTAS ESTÃO DE ACORDO COM O PROTOCOLO
- System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
- //1. Ver se a choice é album ou artista //E TALVEZ TAMBÉM MÚSICA
- switch (choice){
- case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
- ArrayList <Album> show_albuns = data.get_AlbumList();
- String info = ""; //VER SE ISTO ESTÁ BEM FEITO OU NAO
- String lista_music = "Music_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
- String lista_review = "Review_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
- for (Album a: show_albuns){
- if (a.getAlbum_name().equals(msg)){
- info += a.getAlbum_name() + a.getArtist() + a.getDescription() + a.getRating();
- }
- }
- for (Album a: show_albuns) {
- if (a.getAlbum_name().equals(msg)) {
- for (int j = 0; j < a.getMusic_list().size(); j++) {
- lista_music += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
- }
- }
- }
- for (Album a: show_albuns) {
- if (a.getAlbum_name().equals(msg)) {
- for (int k = 0; k < a.getReview_list().size(); k++) {
- lista_review += "item_" + k + "_name" + " user: " + a.getReview_list().get(k).getText() +
- " review: " + a.getReview_list().get(k).getText() + " rating: " + a.getReview_list().get(k).getRating();
- }
- }
- }
- String answer = "pack_id|" + pack_id + "; " + "server_id|" + server_id + "; " + info + lista_music + lista_review; //VER SE OBEDECE AO PROTOCOLO
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = answer.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
- ArrayList <Artist> artist_list = data.get_ArtistList();
- String msg_send = "";
- String musicas = "";
- for (Artist a : artist_list){
- if (a.getNome().equals(msg)){
- msg_send = a.getGrupo() + a.getData_nasc() + a.getGenre() + a.getBiography();
- }
- }
- for (Artist a: artist_list) {
- if (a.getNome().equals(msg)) {
- for (int j = 0; j < a.getMusic_list().size(); j++) {
- musicas += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
- }
- }
- }
- String env_answer = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + msg_send + musicas;
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = env_answer.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "music":
- ArrayList <Music> music_list = data.get_MusicList();
- String resp_aux = "";
- for (Music m: music_list){
- if (m.getName().equals(msg)){
- resp_aux += m.getName() + m.getAlbum_title() + m.getGenre() + m.getArtist() + m.getDuration();
- }
- }
- String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + resp_aux;
- //ENVIAR RESPOSTA PARA O CLIENTE
- try {
- byte[] buffer = resp.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- }
- }
- void album_review (String pack_id, String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
- System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
- //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
- ArrayList <Album> album_list = data.get_AlbumList();
- Review r = new Review(text, Integer.parseInt(rating), user);
- for (Album a: album_list){
- if (a.getAlbum_name().equals(album_title)){
- a.review_list.add(r); //Adicionar a review à lista de reviews
- data.write_albumlist_file("AlbumList_obj.txt", album_list);
- //1. NÃO SEI SE NAO PRECISO DE ADICIONAR ALGO AO MÉTODO DO RATING PARA CALCULAR O RATING MÉDIO
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; review|successful; " + "msg|Your review was submitted";
- try {
- byte[] buffer = rsp.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- else { //ÁLBUM NÃO CONSTA DA BASE DE DADOS
- String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; review|unsuccessful; " + "msg|The selected album is not in our database";
- try {
- byte[] buffer = rsp.getBytes();
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- void download (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
- System.out.println("O cliente quer fazer download de uma música");
- //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS
- //2. VER SE O UTILIZADOR TEM ACESSO A ESSA MÚSICA OU NÃO
- //3. SE AMBOS OS REQUISITOS SE CUMPRIREM
- //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
- //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
- }
- void upload (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
- System.out.println("O cliente quer fazer upload de uma música");
- //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS (SE JÁ ESTIVER, NÃO DEIXA ADICIONAR DE NOVO)
- //2. ASSOCIAR O FICHEIRO QUE FOI UPLOADED (Isto é, pôr uma String com a diretoria desse ficheiro associada a um parâmetro da classe Music)
- //3. SE O REQUISITO 1 SE CUMPRIR
- //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
- //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
- }
- void share_music (String pack_id, String user, String music_name, ArrayList<String>user_list, MulticastSocket socket, int server_id){ //EM FALTA
- System.out.println("O cliente pretende partilhar música com outros utilizadores");
- //1. PRIMEIRO QUE TUDO TENHO QUE IR AO ARRAYLIST DE USERS ASSOCIADO A ESTA MUSICA E VER SE O USER TEM ACESSO A ESTA MÚSICA
- //DÚVIDA: /*UM USER TEM UM ARRAYLIST DE MÚSICAS OU*/ EM PRÍNCIPIO, TER NA CLASSE MUSIC -> UM ARRAYLIST DE USERS
- //2. SE ESTE REQUISITO SE CUMPRIR, VOU AO ARRAYLIST DE USERS DESSA MÚSICA E ADICIONO OS UTILIZADORES QUE SE ENCONTRAM NA ARRAYLIST
- //3. POR FIM, ENVIO A MENSAGEM AO CLIENTE A DIZER SE TUDO CORREU BEM OU NÃO
- }
- }
- class AnswerRequests extends Thread {
- //private String MULTICAST_ADDRESS = "224.3.2.1";
- //private int PORT = 4444; //Porto de envio
- private String message;
- private String ip;
- private int porto;
- private MulticastSocket socket;
- private int server_id;
- MessageParsing parsing = new MessageParsing();
- public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
- this.message = message;
- this.ip = ip;
- this.porto = porto;
- this.socket = socket;
- this.server_id = server_id;
- }
- public void run(){
- UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
- System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
- //Enviar resposta para o cliente
- //MulticastSocket socket = null;
- //Parsing da mensagem
- String [] pares = parsing.MessageParsing(message);
- String type = pares[2];
- String pack_id = pares[0];
- // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
- //Trata do pedido para depois enviar a resposta para o cliente
- switch (type) {
- case "login":
- prot.login(pack_id, pares[3], pares[4], socket, server_id);
- break;
- case "search music":
- prot.search_music(pack_id, pares[3], pares[4], socket, server_id);
- break;
- case "make editor":
- String username = pares[3];
- String new_editor = pares[4];
- prot.make_editor(pack_id, username, new_editor, socket, server_id); //EDITOR
- break;
- case "register":
- try {
- prot.register(pack_id, pares[3], pares[4], socket, server_id);
- } catch (IOException e) {
- e.printStackTrace();
- }
- break;
- case "edit info":
- String user = pares[3];
- String search = pares[4];
- String search_name = pares[5];
- String op_type = pares[6];
- String field_type = pares[7];
- String msg = pares[8];
- prot.manage_data(pack_id, user, search, search_name, op_type, field_type, msg); //EDITOR
- break;
- case "search info":
- String search_type = pares[3];
- String choice_name = pares[4];
- prot.search_info(pack_id, search_type,choice_name, socket, server_id);
- break;
- case "review":
- String userr = pares[3];
- String album_name = pares[4];
- String rating = pares[5];
- String review_text = pares[6];
- prot.album_review(pack_id, userr, album_name, rating, review_text, socket, server_id); //ANY USER
- break;
- case "share music": //DEPOIS
- String Uuser = pares[3];
- String musicc = pares[4];
- //String counter = pares[5]; //ACHO QUE NAO VOU PRECISAR DISTO PARA NADA
- ArrayList <String> lista = new ArrayList<>();
- for (int j = 6; j < pares.length; j++){
- lista.add(pares[j]);
- }
- prot.share_music(pack_id, Uuser, musicc, lista, socket, server_id);
- break;
- case "download": //DEPOIS
- String userrrr = pares[3];
- String music = pares[4];
- prot.download(pack_id, userrrr, music, socket, server_id);
- break;
- case "upload": //DEPOIS
- String userrr = pares[3];
- String music_name = pares[4];
- prot.upload(pack_id,userrr, music_name, socket, server_id);
- break;
- }
- }
- }
- public class MulticastServer extends Thread {
- private String MULTICAST_ADDRESS = "224.3.2.1";
- private int PORT = 4321; //Porto de recepção
- private int BUFFER_SIZE = 4096;
- private static int SERVER_ID;
- MessageParsing parsemsg = new MessageParsing();
- public static void main(String[] args) {
- SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
- MulticastServer server = new MulticastServer();
- server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
- }
- public MulticastServer() {
- //super ("Server Multicast #" + (long) (Math.random() * 100));
- super ("Server Multicast #" + SERVER_ID);
- }
- public void run(){
- MulticastSocket socket = null;
- System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
- try {
- socket = new MulticastSocket(PORT); //cria socket e dá bind
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- socket.joinGroup(group); //dá join ao grupo multicast
- while (true) {
- //Recepcao
- byte[] inBuffer = new byte[BUFFER_SIZE];
- DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
- socket.receive(msgIn); //Recebe o datagrama UDP
- String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
- int clientport = msgIn.getPort(); //Porto do cliente
- String message = new String(msgIn.getData(), 0, msgIn.getLength());
- String [] fields = parsemsg.MessageParsing(message);
- if (Integer.parseInt(fields[1]) == SERVER_ID){
- System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
- //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
- AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
- work.start();
- }
- else{
- //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
- //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
- System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- socket.close(); //Fechar a socket
- }
- }
- }
- /*
- try{
- socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
- socket.setTimeToLive(1);
- Scanner keyboardScaner = new Scanner(System.in);
- while (true){
- String keyboard = keyboardScaner.nextLine();
- byte[] buffer = keyboard.getBytes();
- InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
- DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
- socket.send(packet);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- socket.close();
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement