Advertisement
Guest User

LALALALLA

a guest
Oct 24th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 67.22 KB | None | 0 0
  1. import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator;
  2.  
  3. import javax.xml.crypto.Data;
  4.         import java.awt.*;
  5.         import java.io.Serializable;
  6.         import java.net.*;
  7.         import java.io.IOException;
  8. import java.sql.Array;
  9. import java.sql.SQLOutput;
  10.         import java.util.ArrayList;
  11.         import java.util.Scanner;
  12.         import java.io.*;
  13.         import static java.lang.Thread.sleep;
  14.  
  15. class User implements Serializable {
  16.     private String username, password, user_type;
  17.  
  18.     public User(String username, String password, String user_type) {
  19.         this.username = username;
  20.         this.password = password;
  21.         this.user_type = user_type;
  22.     }
  23.  
  24.     public String getUsername() {
  25.         return username;
  26.     }
  27.  
  28.     public String getPassword() {
  29.         return password;
  30.     }
  31.  
  32.     public String getUser_type() { return user_type; }
  33.  
  34.     public void setUser_type(String user_type) {
  35.         this.user_type = user_type;
  36.     }
  37. }
  38.  
  39. class Music implements Serializable {
  40.     private String artist, genre, album, name; //Nao sei se fica String album ou se mudo para Album album
  41.     private int duration;
  42.  
  43.     //ArrayList <User> user;
  44.  
  45.     public Music(String artist, String genre, String album, String name, int duration) {
  46.         this.artist = artist;
  47.         this.genre = genre;
  48.         this.album = album;
  49.         this.name = name;
  50.         this.duration = duration;
  51.     }
  52.  
  53.     public String getArtist() {
  54.         return artist;
  55.     }
  56.  
  57.     public String getGenre() {
  58.         return genre;
  59.     }
  60.  
  61.     public String getAlbum_title() {
  62.         return album;
  63.     }
  64.  
  65.     public String getName() {
  66.         return name;
  67.     }
  68.  
  69.     public int getDuration() {
  70.         return duration;
  71.     }
  72.  
  73.     public void setArtist(String artist) {
  74.         this.artist = artist;
  75.     }
  76.  
  77.     public void setGenre(String genre) {
  78.         this.genre = genre;
  79.     }
  80.  
  81.     public void setAlbum(String album) {
  82.         this.album = album;
  83.     }
  84.  
  85.     public void setName(String name) {
  86.         this.name = name;
  87.     }
  88.  
  89.     public void setDuration(int duration) {
  90.         this.duration = duration;
  91.     }
  92. }
  93.  
  94. class Album implements Serializable {
  95.     private String album_name, description;
  96.     private double rating; //rating médio //Nao sei se fica cá ou se o retiro
  97.     private String artist;
  98.     ArrayList <Music> music_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  99.     ArrayList <Review> review_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  100.  
  101.     public Album(String album_name, String artist, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list) {
  102.         this.album_name = album_name;
  103.         this.description = description;
  104.         this.rating = rating;
  105.         this.artist = artist;
  106.         this.music_list = music_list;
  107.         this.review_list = review_list;
  108.     }
  109.  
  110.     public String getAlbum_name() {
  111.         return album_name;
  112.     }
  113.  
  114.     public String getDescription() {
  115.         return description;
  116.     }
  117.  
  118.     public double getRating() {
  119.         rating = average_rating();
  120.         return rating;
  121.     }
  122.  
  123.     public ArrayList<Music> getMusic_list() {
  124.         return music_list;
  125.     }
  126.  
  127.     public ArrayList<Review> getReview_list() {
  128.         return review_list;
  129.     }
  130.  
  131.     public void setDescription(String description) {
  132.         this.description = description;
  133.     }
  134.  
  135.     public String getArtist() {
  136.         return artist;
  137.     }
  138.  
  139.     public double average_rating (){
  140.         int soma = 0;
  141.         int size = review_list.size();
  142.         double average_rating;
  143.  
  144.         for (Review r: review_list){
  145.             soma += r.getRating();
  146.         }
  147.  
  148.         average_rating = (double) soma / size;
  149.  
  150.         return average_rating;
  151.     }
  152.  
  153.     public void setAlbum_name(String album_name) {
  154.         this.album_name = album_name;
  155.     }
  156.  
  157.     public void setArtist(String artist) {
  158.         this.artist = artist;
  159.     }
  160. }
  161.  
  162. class Review implements Serializable { //AINDA TENHO QUE VER PRECISA DE SERIALIZABLE OU NÃO
  163.     private String text;
  164.     private int rating;
  165.     private String user;
  166.  
  167.     public Review(String text, int rating, String user) {
  168.         this.text = text;
  169.         this.rating = rating;
  170.         this.user = user;
  171.     }
  172.  
  173.     public String getText() {
  174.         return text;
  175.     }
  176.  
  177.     public int getRating() {
  178.         return rating;
  179.     }
  180.  
  181.     public String getUser() {
  182.         return user;
  183.     }
  184. }
  185.  
  186. class Artist implements  Serializable{
  187.  
  188.     private String nome, grupo, genre, biography;
  189.     private String data_nasc; //TALVIZ CRIAR UMA CLASSE DATA
  190.     ArrayList <Music> music_list;
  191.  
  192.     public Artist(String nome, String grupo, String data_nasc, String genre, String biography, ArrayList <Music> music_list) {
  193.         this.nome = nome;
  194.         this.grupo = grupo;
  195.         this.data_nasc = data_nasc;
  196.         this.genre = genre;
  197.         this.biography = biography;
  198.         this.music_list = music_list;
  199.     }
  200.  
  201.     public String getNome() {
  202.         return nome;
  203.     }
  204.  
  205.     public String getGrupo() {
  206.         return grupo;
  207.     }
  208.  
  209.     public String getData_nasc() {
  210.         return data_nasc;
  211.     }
  212.  
  213.     public String getGenre() {
  214.         return genre;
  215.     }
  216.  
  217.     public String getBiography() {
  218.         return biography;
  219.     }
  220.  
  221.     public ArrayList<Music> getMusic_list() {
  222.         return music_list;
  223.     }
  224.  
  225.     public void setNome(String nome) {
  226.         this.nome = nome;
  227.     }
  228.  
  229.     public void setGrupo(String grupo) {
  230.         this.grupo = grupo;
  231.     }
  232.  
  233.     public void setGenre(String genre) {
  234.         this.genre = genre;
  235.     }
  236.  
  237.     public void setBiography(String biography) {
  238.         this.biography = biography;
  239.     }
  240.  
  241.     public void setData_nasc(String data_nasc) {
  242.         this.data_nasc = data_nasc;
  243.     }
  244.  
  245.     public void setMusic_list(ArrayList<Music> music_list) {
  246.         this.music_list = music_list;
  247.     }
  248. }
  249.  
  250. class Notification implements  Serializable{
  251.     private String username, message;
  252.  
  253.     public Notification(String username, String message) {
  254.         this.username = username;
  255.         this.message = message;
  256.     }
  257.  
  258.     public String getUsername() {
  259.         return username;
  260.     }
  261.  
  262.     public String getMessage() {
  263.         return message;
  264.     }
  265. }
  266.  
  267.  
  268. class DatabaseConnection {
  269.     //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
  270.  
  271.     public DatabaseConnection() {
  272.     }
  273.  
  274.     boolean username_match (String username){
  275.  
  276.         ArrayList <User> users = new ArrayList<>();
  277.  
  278.         //Abrir para a leitura do ficheiro de objetos
  279.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  280.             users = (ArrayList) oin.readObject();
  281.         } catch (IOException e){
  282.             System.out.println(e.getMessage());
  283.         } catch (ClassNotFoundException e) {
  284.             e.printStackTrace();
  285.         }
  286.  
  287.         for (User u: users){
  288.             if (u.getUsername().equals(username)) {
  289.                 return true;
  290.             }
  291.         }
  292.  
  293.         return false;
  294.     }
  295.  
  296.     boolean password_match (String username, String password){
  297.         //Tenho que procurar por username e depois por password
  298.         //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
  299.  
  300.         ArrayList <User> users = new ArrayList<>();
  301.  
  302.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  303.             users = (ArrayList) oin.readObject();
  304.         } catch (IOException e){
  305.             System.out.println(e.getMessage());
  306.         } catch (ClassNotFoundException e) {
  307.             e.printStackTrace();
  308.         }
  309.  
  310.         for (User u: users) {
  311.             if (u.getUsername().equals(username)) {
  312.                 if (u.getPassword().equals(password)) {
  313.                     return true;
  314.                 }
  315.             }
  316.  
  317.         }
  318.         return false;
  319.     }
  320.  
  321.     void write_user_file(ArrayList <User> users) { //Para escrever no ficheiro de utilizadores
  322.         try {
  323.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
  324.             oS.writeObject(users);
  325.             oS.close();
  326.  
  327.         } catch (IOException e) {
  328.             System.out.print("ERRO");
  329.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  330.         }
  331.     }
  332.  
  333.     ArrayList <Album> get_AlbumList (){
  334.         ArrayList <Album> album_list = new ArrayList<>();
  335.  
  336.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList_obj.txt"))) {
  337.             album_list = (ArrayList) oin.readObject();
  338.         } catch (IOException e){
  339.             System.out.println(e.getMessage());
  340.         } catch (ClassNotFoundException e) {
  341.             e.printStackTrace();
  342.         }
  343.  
  344.         return album_list;
  345.     }
  346.  
  347.     void write_albumlist_file (ArrayList <Album> album_list) { //Para escrever no ficheiro de álbuns
  348.         try {
  349.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("AlbumList_obj.txt"));
  350.             oS.writeObject(album_list);
  351.             oS.close();
  352.  
  353.         } catch (IOException e) {
  354.             System.out.print("ERRO");
  355.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  356.         }
  357.     }
  358.  
  359.     void write_artislist_file (ArrayList <Artist> artist_list) {
  360.  
  361.         try {
  362.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("ArtistList_obj.txt"));
  363.             oS.writeObject(artist_list);
  364.             oS.close();
  365.  
  366.         } catch (IOException e) {
  367.             System.out.print("ERRO");
  368.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  369.         }
  370.     }
  371.  
  372.     void write_musiclist_file (ArrayList <Music> music_list){
  373.         try {
  374.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("MusicList_obj.txt"));
  375.             oS.writeObject(music_list);
  376.             oS.close();
  377.  
  378.         } catch (IOException e) {
  379.             System.out.print("ERRO");
  380.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  381.         }
  382.  
  383.     }
  384.  
  385.     ArrayList <Music> get_MusicList (){
  386.         ArrayList <Music> music_list = new ArrayList<>();
  387.  
  388.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("MusicList_obj.txt"))) {
  389.             music_list = (ArrayList) oin.readObject();
  390.         } catch (IOException e){
  391.             System.out.println(e.getMessage());
  392.         } catch (ClassNotFoundException e) {
  393.             e.printStackTrace();
  394.         }
  395.  
  396.         return music_list;
  397.     }
  398.  
  399.     ArrayList <Artist> get_ArtistList (){
  400.         ArrayList <Artist> artist_list = new ArrayList<>();
  401.  
  402.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("ArtistList_obj.txt"))) {
  403.             artist_list = (ArrayList) oin.readObject();
  404.         } catch (IOException e){
  405.             System.out.println(e.getMessage());
  406.         } catch (ClassNotFoundException e) {
  407.             e.printStackTrace();
  408.         }
  409.  
  410.         return artist_list;
  411.     }
  412.  
  413.     ArrayList <User> get_UserList (){
  414.         ArrayList <User> user_list = new ArrayList<>();
  415.  
  416.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  417.             user_list = (ArrayList) oin.readObject();
  418.         } catch (IOException e){
  419.             System.out.println(e.getMessage());
  420.         } catch (ClassNotFoundException e) {
  421.             e.printStackTrace();
  422.         }
  423.  
  424.         return user_list;
  425.     }
  426.  
  427.     void write_notifications_file (ArrayList <Notification> notific_list){
  428.         try {
  429.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("NotificList_obj.txt"));
  430.             oS.writeObject(notific_list);
  431.             oS.close();
  432.  
  433.         } catch (IOException e) {
  434.             System.out.print("ERRO");
  435.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  436.         }
  437.  
  438.  
  439.     }
  440.  
  441.     ArrayList <Notification> get_NotificationList (){
  442.         ArrayList <Notification> notific_list = new ArrayList<>();
  443.  
  444.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("NotificList_obj.txt"))) {
  445.             notific_list = (ArrayList) oin.readObject();
  446.         } catch (IOException e){
  447.             System.out.println(e.getMessage());
  448.         } catch (ClassNotFoundException e) {
  449.             e.printStackTrace();
  450.         }
  451.  
  452.         return notific_list;
  453.     }
  454.  
  455. }
  456.  
  457.  
  458. class MessageParsing {
  459.  
  460.     public String [] MessageParsing (String message){
  461.  
  462.         //Separar por ";" e saber o número de pares
  463.         String [] pares  = message.split(";");
  464.         String  [] campos = new String[pares.length] ;
  465.  
  466.         //if (pares.length >= 3){ //NAO SEI SE PRECISO DESTA CONDICAO OU NAO, TENHO QUE TER ATENCAO POR CAUSA DA EXCEPTION
  467.             for (int i = 0; i < pares.length; i++){
  468.                 String [] aux = pares[i].split("\\|");
  469.                 campos[i] = aux[1];
  470.             }
  471.         //}
  472.  
  473.         //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
  474.         //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
  475.  
  476.         return campos;
  477.     }
  478.  
  479. }
  480.  
  481.  
  482. class UDPMulticastProtocol implements Serializable {
  483.  
  484.     private String MULTICAST_ADDRESS = "224.3.2.1";
  485.     private int PORT = 4444; //Porto de envio
  486.     DatabaseConnection data = new DatabaseConnection();
  487.  
  488.     public UDPMulticastProtocol() {
  489.     }
  490.  
  491.     void login (String pack_id, String username, String password, MulticastSocket socket, int server_id){
  492.         System.out.println("O cliente deseja fazer login");
  493.         System.out.println("Username inserido: " + username);
  494.         System.out.println("Password inserida: " + password);
  495.         //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
  496.  
  497.  
  498.         if (data.username_match(username)){
  499.             if (data.password_match(username, password)){ //SUCESSO
  500.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|login" + "; status|on; " + "msg|Welcome to DropMusic";
  501.  
  502.                 try{
  503.                     byte[] buffer = rsp.getBytes();
  504.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  505.                     socket.send(packet);
  506.  
  507.                 } catch (IOException e) {
  508.                     e.printStackTrace();
  509.                 }
  510.  
  511.             }
  512.             else { //PASSWORD ERRADA
  513.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|login" + "; status|failed; " + "msg|Password incorreta";
  514.  
  515.                 try{
  516.                     byte[] buffer = rsp.getBytes();
  517.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  518.                     socket.send(packet);
  519.  
  520.                 } catch (IOException e) {
  521.                     e.printStackTrace();
  522.                 }
  523.             }
  524.         }
  525.  
  526.         else{ //UTILIZADOR NAO EXISTE
  527.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|login" + "; status|failed; " + "msg|Utilizador nao existe";
  528.  
  529.             try{
  530.                 byte[] buffer = rsp.getBytes();
  531.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  532.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  533.                 socket.send(packet);
  534.  
  535.             } catch (IOException e) {
  536.                 e.printStackTrace();
  537.             }
  538.         }
  539.  
  540.  
  541.     }
  542.  
  543.     void register (String pack_id, String username, String password, MulticastSocket socket, int server_id) throws IOException {
  544.  
  545.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  546.         //Abrir para a leitura do ficheiro de objetos
  547.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  548.             users = (ArrayList) oin.readObject();
  549.         } catch (IOException e){
  550.             System.out.println(e.getMessage());
  551.         } catch (ClassNotFoundException e) {
  552.             e.printStackTrace();
  553.         }
  554.  
  555.         System.out.println("O cliente deseja registar-se");
  556.         System.out.println("Username inserido: " + username);
  557.         System.out.println("Password inserida: " + password);
  558.  
  559.         //Temos que ver se existe o username ou não
  560.         if (!data.username_match(username)) {
  561.  
  562.             //Abrir para escrita no ficheiro de objetos
  563.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  564.                 User u = new User(username, password, "admin");
  565.                 users.add(u);
  566.             }
  567.             else{
  568.                 User u = new User(username, password, "normal");
  569.                 users.add(u);
  570.             }
  571.  
  572.             try {
  573.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
  574.                 oS.writeObject(users);
  575.                 oS.close();
  576.  
  577.             } catch (IOException e) {
  578.                 System.out.print("ERRO");
  579.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  580.             }
  581.  
  582.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|successful; " + "msg|Welcome to DropMusic";
  583.             try{
  584.  
  585.                 byte[] buffer = rsp.getBytes();
  586.  
  587.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  588.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  589.                 socket.send(packet);
  590.  
  591.             } catch (IOException e) {
  592.                 e.printStackTrace();
  593.             }
  594.         }
  595.  
  596.         else {
  597.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|unsuccessful; " + "msg|Esse username ja existe";
  598.  
  599.             try{
  600.                 byte[] buffer = rsp.getBytes();
  601.                 //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  602.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  603.                 socket.send(packet);
  604.  
  605.             } catch (IOException e) {
  606.                 e.printStackTrace();
  607.             }
  608.         }
  609.  
  610.         //SÓ PARA VER QUEM TENHO REGISTADO
  611.         for (User uss: users){
  612.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  613.         }
  614.  
  615.  
  616.     }
  617.  
  618.     void search_music (String pack_id, String choice, String name, MulticastSocket socket, int server_id){ //FALTA o ALL, COMPLETAR E TESTAR
  619.         System.out.println("O cliente deseja procurar musica");
  620.  
  621.         switch (choice){
  622.             case "all": //Vai procurar por tudo o que os outros "cases" vao procurar //ACHO QUE VOU RETIRAR ISTO
  623.  
  624.                 break;
  625.  
  626.             case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
  627.                 ArrayList <Album> album_list = data.get_AlbumList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  628.                 //ArrayList <Music> aux = new ArrayList<>(); //ArrayList auxiliar para pôr todos os albuns com o nome "name"
  629.                 String x = "";
  630.                 int item_count = 0;
  631.  
  632.                 for (Album a: album_list){
  633.                     if (a.getAlbum_name().equals(name)){
  634.                         item_count = a.music_list.size();
  635.                         for (int k = 0; k < item_count; k++)
  636.  
  637.                         x += "item_"+k+"_name| " + a.music_list.get(k).getName();
  638.  
  639.                     }
  640.                 }
  641.  
  642.                 //1. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  643.                 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" +
  644.                         "item_count| " + item_count + x; //Ver se o item_count é bem apresentado
  645.  
  646.                 try{
  647.                     byte[] buffer = rsp.getBytes();
  648.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  649.                     socket.send(packet);
  650.                 } catch (IOException e) {
  651.                     e.printStackTrace();
  652.                 }
  653.  
  654.  
  655.                 break;
  656.  
  657.             case "music":  //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
  658.                 ArrayList <Music> music_list = data.get_MusicList();
  659.                 //ArrayList <Music> auxappend = new ArrayList<>();
  660.  
  661.                 String s = "";
  662.                 int item_size = 0;
  663.  
  664.                 for (Music m: music_list){
  665.                     if (m.getName().equals(name)){
  666.                         s += "item_"+item_size+"_name| " + m.getName();
  667.                         item_size++;
  668.  
  669.                     }
  670.                 }
  671.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  672.                 String ans = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  673.                         "item_count| " + item_size + s; //Ver se o item_size é bem apresentado
  674.                 //ENVIAR RESPOSTA PARA O CLIENTE
  675.                 try {
  676.                     byte[] buffer = ans.getBytes();
  677.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  678.                     socket.send(packet);
  679.                 } catch (IOException e) {
  680.                     e.printStackTrace();
  681.                 }
  682.  
  683.                 break;
  684.  
  685.             case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
  686.  
  687.                 //NOTAAAA: DECIDIR SE CRIO UM FICHEIRO DE ARTISTAS OU SE NÃO É NECESSÁRIO
  688.                 ArrayList <Artist> artist_list = data.get_ArtistList();
  689.  
  690.                 String z = "";
  691.                 int tam = 0;
  692.  
  693.                 for (Artist a: artist_list){
  694.                     if (a.getNome().equals(name)){
  695.                         for (int j = 0; j < a.getMusic_list().size(); j++){
  696.                             tam = a.getMusic_list().size();
  697.                             z += "item_"+ j +"_name| " + a.getMusic_list().get(j).getName();
  698.                         }
  699.                     }
  700.                 }
  701.  
  702.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  703.                 String resp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  704.                         "item_count| " + tam + z; //Ver se o item_size é bem apresentado
  705.                 //ENVIAR RESPOSTA PARA O CLIENTE
  706.                 try {
  707.                     byte[] buffer = resp.getBytes();
  708.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  709.                     socket.send(packet);
  710.                 } catch (IOException e) {
  711.                     e.printStackTrace();
  712.                 }
  713.  
  714.                 break;
  715.  
  716.             case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
  717.                 ArrayList <Music> music_list1 = data.get_MusicList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  718.  
  719.                 String aux = "";
  720.                 int conta = 0;
  721.  
  722.                 for (Music m: music_list1){
  723.                     if (m.getGenre().equals(name)){
  724.                         aux += "item_"+conta +"_name| " + m.getName();
  725.                         conta++;
  726.                     }
  727.                 }
  728.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  729.                 String envia = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  730.                         "item_count| " + conta + aux; //Ver se o conta é bem apresentado
  731.  
  732.                 //ENVIAR RESPOSTA PARA O CLIENTE
  733.                 try {
  734.                     byte[] buffer = envia.getBytes();
  735.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  736.                     socket.send(packet);
  737.                 } catch (IOException e) {
  738.                     e.printStackTrace();
  739.                 }
  740.  
  741.                 break;
  742.  
  743.         }
  744.  
  745.     }
  746.  
  747.     void make_editor (String pack_id, String username, String novo_editor, MulticastSocket socket, int server_id){ //VERIFICAR E TESTAR
  748.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  749.  
  750.         ArrayList <User> users = new ArrayList<>();
  751.  
  752.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  753.             users = (ArrayList) oin.readObject();
  754.         } catch (IOException e){
  755.             System.out.println(e.getMessage());
  756.         } catch (ClassNotFoundException e) {
  757.             e.printStackTrace();
  758.         }
  759.  
  760.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  761.         if (data.username_match(username)) { //SUCESSO
  762.             for (User u : users) {
  763.                 if (u.getUsername().equals(username)) {
  764.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) {
  765.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  766.                         for (User us : users) {
  767.                             if (us.getUsername().equals(novo_editor)) {
  768.                                 us.setUser_type("editor");
  769.                                 data.write_user_file(users);
  770.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  771.                                 //String rsp = "server_id|" + server_id + "; type|status;" + "; logged|on; " + "msg|Welcome to DropMusic";
  772.                                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; make editor|successful; " + "msg|You can edit now";
  773.                                 try {
  774.                                     byte[] buffer = rsp.getBytes();
  775.                                     //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  776.                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  777.                                     socket.send(packet);
  778.  
  779.                                 } catch (IOException e) {
  780.                                     e.printStackTrace();
  781.                                 }
  782.                             /*} else { //FALTA PÔR ESTE CHECK A FUNCIONAR
  783.                                 System.out.println("Utilizador nao existe");
  784.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  785.                             }*/
  786.                             }
  787.                         }
  788.                     }
  789.                 }
  790.             }
  791.  
  792.         } else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
  793.             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";
  794.             try {
  795.                 byte[] buffer = rsp.getBytes();
  796.                 //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  797.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  798.                 socket.send(packet);
  799.  
  800.             } catch (IOException e) {
  801.                 e.printStackTrace();
  802.             }
  803.         }
  804.  
  805.  
  806.     }
  807.  
  808.     void manage_data (String pack_id, String username, String choice, String search_name, String op_type, String field_type, String name, MulticastSocket socket, int server_id) { //EM FALTA
  809.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  810.  
  811.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  812.         ArrayList<User> users = data.get_UserList();
  813.  
  814.         ArrayList<Artist> artist_list = data.get_ArtistList();
  815.         ArrayList<Album> album_list = data.get_AlbumList();
  816.         ArrayList<Music> music_list = data.get_MusicList();
  817.  
  818.         if (data.username_match(username)) { //SUCESSO
  819.             for (User u : users) {
  820.                 if (u.getUsername().equals(username)) {
  821.                     if (u.getUser_type().equals("editor")) {
  822.                         System.out.println("Tem permissao para editar");
  823.  
  824.                         switch (choice) {
  825.                             case "artist": /*-------------------------ARTIST--------------------------*/
  826.                                 String artist_name = search_name;
  827.                                 switch (op_type){
  828.                                     case "insert": /*-*************INSERT*****************/
  829.  
  830.                                         String [] artist_details = name.split("-");
  831.                                         String grupo = artist_details[0];
  832.                                         String data_nasc = artist_details[1];
  833.                                         String genre = artist_details[2];
  834.                                         String biography = artist_details[3];
  835.                                         String music_counter = artist_details[4];
  836.  
  837.                                         ArrayList <Music> aux_musiclist = new ArrayList<>();
  838.                                         Artist new_artist;
  839.  
  840.                                         if (Integer.parseInt(music_counter) != 0) {
  841.                                             for (int j = 5; j < artist_details.length; j++) {
  842.                                                 Music m = new Music(null, null, null, artist_details[j], 0);
  843.                                                 aux_musiclist.add(m);
  844.                                             }
  845.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, aux_musiclist);
  846.                                         }
  847.                                         else{
  848.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, null);
  849.                                         }
  850.                                         artist_list.add(new_artist);
  851.                                         data.write_artislist_file(artist_list);
  852.  
  853.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist added";
  854.  
  855.                                         try{
  856.                                             byte[] buffer = rsp_client.getBytes();
  857.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  858.                                             socket.send(packet);
  859.  
  860.                                         } catch (IOException e) {
  861.                                             e.printStackTrace();
  862.                                         }
  863.  
  864.                                         break;
  865.  
  866.                                     case "change": /*-*************CHANGE*****************/
  867.                                         switch (field_type) {
  868.                                             case "name":
  869.                                                 for (Artist a: artist_list){
  870.                                                     if (a.getNome().equals(artist_name)){
  871.                                                         a.setNome(name);
  872.                                                     }
  873.                                                 }
  874.                                                 break;
  875.                                             case "grupo":
  876.                                                 for (Artist a: artist_list){
  877.                                                     if (a.getNome().equals(artist_name)){
  878.                                                         a.setGrupo(name);
  879.                                                     }
  880.                                                 }
  881.                                                 break;
  882.                                             case "genre":
  883.                                                 for (Artist a: artist_list){
  884.                                                     if (a.getNome().equals(artist_name)){
  885.                                                         a.setGenre(name);
  886.                                                     }
  887.                                                 }
  888.                                                 break;
  889.                                             case "biography":
  890.                                                 for (Artist a: artist_list){
  891.                                                     if (a.getNome().equals(artist_name)){
  892.                                                         a.setBiography(name);
  893.                                                     }
  894.                                                 }
  895.                                                 break;
  896.                                             case "data_nasc":
  897.                                                 for (Artist a: artist_list){
  898.                                                     if (a.getNome().equals(artist_name)){
  899.                                                         a.setData_nasc(name);
  900.                                                     }
  901.                                                 }
  902.                                                 break;
  903.                                             case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS
  904.  
  905.                                                 break;
  906.                                         }
  907.  
  908.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist info changed";
  909.  
  910.                                         try{
  911.                                             byte[] buffer = r.getBytes();
  912.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  913.                                             socket.send(packet);
  914.  
  915.                                         } catch (IOException e) {
  916.                                             e.printStackTrace();
  917.                                         }
  918.                                         break;
  919.  
  920.                                     case "remove": /*-*************REMOVE*****************/
  921.                                         for (Artist a: artist_list){
  922.                                             if(a.getNome().equals(artist_name)){
  923.                                                 artist_list.remove(a);
  924.                                                 data.write_artislist_file(artist_list);
  925.                                             }
  926.                                         }
  927.  
  928.                                         String rr = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist removed";
  929.  
  930.                                         try{
  931.                                             byte[] buffer = rr.getBytes();
  932.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  933.                                             socket.send(packet);
  934.                                         } catch (IOException e) {
  935.                                             e.printStackTrace();
  936.                                         }
  937.  
  938.                                         break;
  939.                                 }
  940.                                 break;
  941.  
  942.                             case "album": /*-------------------------ALBUM--------------------------*/
  943.                                 String album_title = search_name;
  944.                                 switch (op_type) {
  945.                                     case "insert":
  946.                                         String [] album_details = name.split("-");
  947.                                         String artist = album_details[0];
  948.                                         String description = album_details[1];
  949.                                         String music_counter = album_details[2];
  950.  
  951.                                         ArrayList <Music> aux_music = new ArrayList<>();
  952.                                         Album new_album;
  953.  
  954.                                         if (Integer.parseInt(music_counter) != 0) {
  955.                                             for (int j = 3; j < album_details.length; j++) {
  956.                                                 Music m = new Music(null, null, null, album_details[j], 0);
  957.                                                 aux_music.add(m);
  958.                                             }
  959.                                             new_album = new Album(album_title, artist, description, 0, aux_music, null);
  960.                                         }
  961.                                         else{
  962.                                             new_album = new Album(album_title, artist, description, 0, null, null);
  963.                                         }
  964.                                         album_list.add(new_album);
  965.                                         data.write_albumlist_file(album_list);
  966.  
  967.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album added";
  968.  
  969.                                         try{
  970.                                             byte[] buffer = rsp_client.getBytes();
  971.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  972.                                             socket.send(packet);
  973.  
  974.                                         } catch (IOException e) {
  975.                                             e.printStackTrace();
  976.                                         }
  977.  
  978.                                         break;
  979.  
  980.                                     case "change":
  981.                                         switch (field_type) {
  982.                                             case "album name":
  983.                                                 for (Album a : album_list) {
  984.                                                     if (a.getAlbum_name().equals(album_title)) {
  985.                                                         a.setAlbum_name(name);
  986.                                                     }
  987.                                                 }
  988.                                                 break;
  989.                                             case "description":
  990.                                                 for (Album a : album_list) {
  991.                                                     if (a.getAlbum_name().equals(album_title)) {
  992.                                                         a.setDescription(name);
  993.                                                     }
  994.                                                 }
  995.                                                 break;
  996.                                             case "artist":
  997.                                                 for (Album a : album_list) {
  998.                                                     if (a.getAlbum_name().equals(album_title)) {
  999.                                                         a.setArtist(name);
  1000.                                                     }
  1001.                                                 }
  1002.                                                 break;
  1003.                                             case "review list": //NAO FAZ SENTIDO PORQUE NAO SE VAI MEXER EM ALGO QUE JA ALGUEM ESCREVEU
  1004.                                                 //CAGUEI
  1005.                                                 break;
  1006.                                             case "music list": //DUVIDA //MUDO O QUÊ???????????????????????????
  1007.                                                 for (Album a : album_list) {
  1008.                                                     if (a.getAlbum_name().equals(album_title)) {
  1009.                                                         Music m = new Music(null, null, null, name, 0); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
  1010.                                                         a.getMusic_list().add(m);
  1011.                                                     }
  1012.                                                 }
  1013.                                                 break;
  1014.                                         }
  1015.  
  1016.                                         break;
  1017.                                     case "remove":
  1018.                                         for (Album a: album_list){
  1019.                                             if (a.getAlbum_name().equals(album_title)){
  1020.                                                 album_list.remove(a);
  1021.                                                 data.write_albumlist_file(album_list);
  1022.                                             }
  1023.                                         }
  1024.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album removed";
  1025.  
  1026.                                         try{
  1027.                                             byte[] buffer = r.getBytes();
  1028.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1029.                                             socket.send(packet);
  1030.  
  1031.                                         } catch (IOException e) {
  1032.                                             e.printStackTrace();
  1033.                                         }
  1034.  
  1035.                                         break;
  1036.                                 }
  1037.                                 break;
  1038.  
  1039.                             case "music": /*-------------------------MUSIC--------------------------*/
  1040.                                 String music_name = search_name;
  1041.                                 switch (op_type) {
  1042.                                     case "insert":
  1043.                                         String [] music_details = name.split("-");
  1044.                                         String artist = music_details[0];
  1045.                                         String genre = music_details[1];
  1046.                                         String album = music_details[2];
  1047.                                         String duration = music_details[3];
  1048.  
  1049.                                         Music m = new Music(artist, genre, album, music_name, Integer.parseInt(duration));
  1050.                                         music_list.add(m);
  1051.                                         data.write_musiclist_file(music_list);
  1052.  
  1053.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music added";
  1054.  
  1055.                                         try{
  1056.                                             byte[] buffer = rsp_client.getBytes();
  1057.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1058.                                             socket.send(packet);
  1059.  
  1060.                                         } catch (IOException e) {
  1061.                                             e.printStackTrace();
  1062.                                         }
  1063.  
  1064.                                         break;
  1065.  
  1066.                                     case "change":
  1067.                                         switch (field_type) {
  1068.                                             case "name":
  1069.                                                 for (Music mu : music_list) {
  1070.                                                     if(mu.getName().equals(music_name)){
  1071.                                                         mu.setName(name);
  1072.                                                     }
  1073.                                                 }
  1074.                                                 break;
  1075.                                             case "genre":
  1076.                                                 for (Music mu : music_list) {
  1077.                                                     if(mu.getName().equals(music_name)){
  1078.                                                         mu.setGenre(name);
  1079.                                                     }
  1080.                                                 }
  1081.                                                 break;
  1082.                                             case "artist":
  1083.                                                 for (Music mu : music_list) {
  1084.                                                     if(mu.getName().equals(music_name)){
  1085.                                                         mu.setArtist(name);
  1086.                                                     }
  1087.                                                 }
  1088.                                                 break;
  1089.                                             case "duration":
  1090.                                                 for (Music mu : music_list) {
  1091.                                                     if(mu.getName().equals(music_name)){
  1092.                                                         mu.setDuration(Integer.parseInt(name));
  1093.                                                     }
  1094.                                                 }
  1095.                                                 break;
  1096.                                             case "album":
  1097.                                                 for (Music mu : music_list) {
  1098.                                                     if(mu.getName().equals(music_name)){
  1099.                                                         mu.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
  1100.                                                     }
  1101.                                                 }
  1102.                                                 break;
  1103.                                         }
  1104.  
  1105.                                         String r1 = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music info changed";
  1106.  
  1107.                                         try{
  1108.                                             byte[] buffer = r1.getBytes();
  1109.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1110.                                             socket.send(packet);
  1111.  
  1112.                                         } catch (IOException e) {
  1113.                                             e.printStackTrace();
  1114.                                         }
  1115.  
  1116.                                         break;
  1117.                                     case "remove":
  1118.                                         for (Music mu: music_list){
  1119.                                             if (mu.getName().equals(music_name)){
  1120.                                                 music_list.remove(mu);
  1121.                                                 data.write_musiclist_file(music_list);
  1122.                                             }
  1123.                                         }
  1124.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music removed";
  1125.  
  1126.                                         try{
  1127.                                             byte[] buffer = r.getBytes();
  1128.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1129.                                             socket.send(packet);
  1130.  
  1131.                                         } catch (IOException e) {
  1132.                                             e.printStackTrace();
  1133.                                         }
  1134.                                         break;
  1135.                                 }
  1136.                                 break;
  1137.  
  1138.                         }
  1139.                     }
  1140.                 }
  1141.             }
  1142.         }
  1143.     }
  1144.  
  1145.     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
  1146.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  1147.  
  1148.         //1. Ver se a choice é album ou artista //E TALVEZ TAMBÉM MÚSICA
  1149.         switch (choice){
  1150.             case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
  1151.                     ArrayList <Album> show_albuns = data.get_AlbumList();
  1152.                     String info = ""; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1153.                     String lista_music = "Music_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1154.                     String lista_review = "Review_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1155.  
  1156.                     for (Album a: show_albuns){
  1157.                         if (a.getAlbum_name().equals(msg)){
  1158.                             info += a.getAlbum_name() + a.getArtist() + a.getDescription() + a.getRating();
  1159.                         }
  1160.                     }
  1161.  
  1162.                     for (Album a: show_albuns) {
  1163.                         if (a.getAlbum_name().equals(msg)) {
  1164.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  1165.                                 lista_music += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  1166.                             }
  1167.                         }
  1168.                     }
  1169.  
  1170.                     for (Album a: show_albuns) {
  1171.                         if (a.getAlbum_name().equals(msg)) {
  1172.                             for (int k = 0; k < a.getReview_list().size(); k++) {
  1173.                                 lista_review += "item_" + k + "_name" + " user: " + a.getReview_list().get(k).getText() +
  1174.                                         " review: " + a.getReview_list().get(k).getText() + " rating: " + a.getReview_list().get(k).getRating();
  1175.                             }
  1176.                         }
  1177.                     }
  1178.  
  1179.                     String answer = "pack_id|" + pack_id +  "; " + "server_id|" + server_id + "; " + info + lista_music + lista_review; //VER SE OBEDECE AO PROTOCOLO
  1180.                     //ENVIAR RESPOSTA PARA O CLIENTE
  1181.                     try {
  1182.                         byte[] buffer = answer.getBytes();
  1183.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1184.                         socket.send(packet);
  1185.                     } catch (IOException e) {
  1186.                         e.printStackTrace();
  1187.                     }
  1188.  
  1189.                 break;
  1190.  
  1191.             case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
  1192.                     ArrayList <Artist> artist_list = data.get_ArtistList();
  1193.                     String msg_send = "";
  1194.                     String musicas = "";
  1195.  
  1196.                     for (Artist a : artist_list){
  1197.                         if (a.getNome().equals(msg)){
  1198.                             msg_send = a.getGrupo() + a.getData_nasc() + a.getGenre() + a.getBiography();
  1199.                         }
  1200.                     }
  1201.  
  1202.                     for (Artist a: artist_list) {
  1203.                         if (a.getNome().equals(msg)) {
  1204.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  1205.                                 musicas += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  1206.                             }
  1207.                         }
  1208.                     }
  1209.  
  1210.                     String env_answer = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + msg_send + musicas;
  1211.                     //ENVIAR RESPOSTA PARA O CLIENTE
  1212.                     try {
  1213.                         byte[] buffer = env_answer.getBytes();
  1214.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1215.                         socket.send(packet);
  1216.                     } catch (IOException e) {
  1217.                         e.printStackTrace();
  1218.                     }
  1219.  
  1220.                 break;
  1221.  
  1222.             case "music":
  1223.                 ArrayList <Music> music_list = data.get_MusicList();
  1224.                 String resp_aux = "";
  1225.  
  1226.                 for (Music m: music_list){
  1227.                     if (m.getName().equals(msg)){
  1228.                         resp_aux += m.getName() + m.getAlbum_title() + m.getGenre() + m.getArtist() + m.getDuration();
  1229.                     }
  1230.                 }
  1231.  
  1232.                 String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + resp_aux;
  1233.                 //ENVIAR RESPOSTA PARA O CLIENTE
  1234.                 try {
  1235.                     byte[] buffer = resp.getBytes();
  1236.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1237.                     socket.send(packet);
  1238.                 } catch (IOException e) {
  1239.                     e.printStackTrace();
  1240.                 }
  1241.  
  1242.                 break;
  1243.         }
  1244.     }
  1245.  
  1246.     void album_review (String pack_id, String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
  1247.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  1248.  
  1249.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  1250.         ArrayList <Album> album_list = data.get_AlbumList();
  1251.         Review r = new Review(text, Integer.parseInt(rating), user);
  1252.  
  1253.         for (Album a: album_list){
  1254.             if (a.getAlbum_name().equals(album_title)){
  1255.                 a.review_list.add(r); //Adicionar a review à lista de reviews
  1256.                 data.write_albumlist_file(album_list);
  1257.  
  1258.                 String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|review" + "; status|successful; " + "msg|Your review was submitted";
  1259.                 try {
  1260.                     byte[] buffer = rsp.getBytes();
  1261.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1262.                     socket.send(packet);
  1263.                 } catch (IOException e) {
  1264.                     e.printStackTrace();
  1265.                 }
  1266.             }
  1267.             else { //ÁLBUM NÃO CONSTA DA BASE DE DADOS
  1268.                 String rsp = "pack_id|" + pack_id  + "; server_id|" + server_id + "; type|review" + "; status|unsuccessful; " + "msg|The selected album is not in our database";
  1269.                 try {
  1270.                     byte[] buffer = rsp.getBytes();
  1271.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1272.                     socket.send(packet);
  1273.                 } catch (IOException e) {
  1274.                     e.printStackTrace();
  1275.                 }
  1276.             }
  1277.         }
  1278.  
  1279.     }
  1280.  
  1281.     void download (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  1282.         System.out.println("O cliente quer fazer download de uma música");
  1283.  
  1284.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS
  1285.  
  1286.         //2. VER SE O UTILIZADOR TEM ACESSO A ESSA MÚSICA OU NÃO
  1287.  
  1288.         //3. SE AMBOS OS REQUISITOS SE CUMPRIREM
  1289.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  1290.  
  1291.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  1292.  
  1293.  
  1294.     }
  1295.  
  1296.     void upload (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  1297.         System.out.println("O cliente quer fazer upload de uma música");
  1298.  
  1299.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS (SE JÁ ESTIVER, NÃO DEIXA ADICIONAR DE NOVO)
  1300.  
  1301.         //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)
  1302.  
  1303.         //3. SE O REQUISITO 1 SE CUMPRIR
  1304.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  1305.  
  1306.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  1307.  
  1308.  
  1309.  
  1310.     }
  1311.  
  1312.     void share_music (String pack_id, String user, String music_name, ArrayList<String>user_list, MulticastSocket socket, int server_id){ //EM FALTA
  1313.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  1314.  
  1315.         //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
  1316.         //DÚVIDA: /*UM USER TEM UM ARRAYLIST DE MÚSICAS OU*/ EM PRÍNCIPIO, TER NA CLASSE MUSIC -> UM ARRAYLIST DE USERS
  1317.  
  1318.         //2. SE ESTE REQUISITO SE CUMPRIR, VOU AO ARRAYLIST DE USERS DESSA MÚSICA E ADICIONO OS UTILIZADORES QUE SE ENCONTRAM NA ARRAYLIST
  1319.  
  1320.         //3. POR FIM, ENVIO A MENSAGEM AO CLIENTE A DIZER SE TUDO CORREU BEM OU NÃO
  1321.  
  1322.  
  1323.     }
  1324.  
  1325.     void check (String pack_id, String user, MulticastSocket socket, int server_id){
  1326.         ArrayList <Notification> not_list = data.get_NotificationList();
  1327.  
  1328.         String send = "";
  1329.         int conta = 0;
  1330.         for (Notification n: not_list){
  1331.             if (n.getUsername().equals(user)){
  1332.                 send += "Notif #" + conta + "|" +  n.getMessage() + ";";
  1333.                 conta++;
  1334.                 not_list.remove(n); //Remover a notificação que estava na lista de notificações
  1335.             }
  1336.         }
  1337.  
  1338.         String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|check" + "; status|successful; " + "msg|" + send;
  1339.         try {
  1340.             byte[] buffer = rsp.getBytes();
  1341.             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1342.             socket.send(packet);
  1343.         } catch (IOException e) {
  1344.             e.printStackTrace();
  1345.         }
  1346.     }
  1347.  
  1348.     void add (String pack_id, String user, String text, MulticastSocket socket, int server_id){
  1349.         ArrayList <Notification> n_list = data.get_NotificationList();
  1350.         Notification notif = new Notification(user, text);
  1351.                 n_list.add(notif);
  1352.  
  1353.         String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|add" + "; status|successful; " + "msg|Notification added to the list";
  1354.         try {
  1355.             byte[] buffer = rsp.getBytes();
  1356.             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1357.             socket.send(packet);
  1358.         } catch (IOException e) {
  1359.             e.printStackTrace();
  1360.         }
  1361.  
  1362.     }
  1363.  
  1364.  
  1365.  
  1366. }
  1367.  
  1368.  
  1369. class AnswerRequests extends Thread {
  1370.  
  1371.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  1372.     //private int PORT = 4444; //Porto de envio
  1373.     private String message;
  1374.     private String ip;
  1375.     private int porto;
  1376.     private MulticastSocket socket;
  1377.     private int server_id;
  1378.  
  1379.     MessageParsing parsing = new MessageParsing();
  1380.  
  1381.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  1382.         this.message = message;
  1383.         this.ip = ip;
  1384.         this.porto = porto;
  1385.         this.socket = socket;
  1386.         this.server_id = server_id;
  1387.     }
  1388.  
  1389.     public void run(){
  1390.  
  1391.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  1392.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  1393.  
  1394.         //Enviar resposta para o cliente
  1395.         //MulticastSocket socket = null;
  1396.  
  1397.         //Parsing da mensagem
  1398.         String [] pares = parsing.MessageParsing(message);
  1399.         String type = pares[2];
  1400.         String pack_id = pares[0];
  1401.  
  1402.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  1403.         //Trata do pedido para depois enviar a resposta para o cliente
  1404.         switch (type) {
  1405.             case "login":
  1406.                 prot.login(pack_id, pares[3], pares[4], socket, server_id);
  1407.                 break;
  1408.  
  1409.             case "search music":
  1410.                 prot.search_music(pack_id, pares[3], pares[4], socket, server_id);
  1411.                 break;
  1412.  
  1413.             case "make editor":
  1414.                 String username = pares[3];
  1415.                 String new_editor = pares[4];
  1416.                 prot.make_editor(pack_id, username, new_editor, socket, server_id); //EDITOR
  1417.                 break;
  1418.  
  1419.             case "register":
  1420.                 try {
  1421.                     prot.register(pack_id, pares[3], pares[4], socket, server_id);
  1422.                 } catch (IOException e) {
  1423.                     e.printStackTrace();
  1424.                 }
  1425.                 break;
  1426.  
  1427.             case "edit info":
  1428.                 String user = pares[3];
  1429.                 String search = pares[4];
  1430.                 String search_name = pares[5];
  1431.                 String op_type = pares[6];
  1432.                 String field_type = pares[7];
  1433.                 String msg = pares[8];
  1434.                 prot.manage_data(pack_id, user, search, search_name, op_type, field_type, msg, socket, server_id); //EDITOR
  1435.                 break;
  1436.  
  1437.             case "search info":
  1438.                 String search_type = pares[3];
  1439.                 String choice_name = pares[4];
  1440.                 prot.search_info(pack_id, search_type,choice_name, socket, server_id);
  1441.                 break;
  1442.  
  1443.             case "review":
  1444.                 String userr = pares[3];
  1445.                 String album_name = pares[4];
  1446.                 String rating = pares[5];
  1447.                 String review_text = pares[6];
  1448.                 prot.album_review(pack_id, userr, album_name, rating, review_text, socket, server_id); //ANY USER
  1449.                 break;
  1450.  
  1451.             case "share music": //DEPOIS
  1452.                 String Uuser = pares[3];
  1453.                 String musicc = pares[4];
  1454.                 //String counter = pares[5]; //ACHO QUE NAO VOU PRECISAR DISTO PARA NADA
  1455.                 ArrayList <String> lista = new ArrayList<>();
  1456.                 for (int j = 6; j < pares.length; j++){
  1457.                     lista.add(pares[j]);
  1458.                 }
  1459.                 prot.share_music(pack_id, Uuser, musicc, lista, socket, server_id);
  1460.                 break;
  1461.  
  1462.             case "download": //DEPOIS
  1463.                 String userrrr = pares[3];
  1464.                 String music = pares[4];
  1465.                 prot.download(pack_id, userrrr, music, socket, server_id);
  1466.                 break;
  1467.  
  1468.             case "upload":  //DEPOIS
  1469.                 String userrr = pares[3];
  1470.                 String music_name = pares[4];
  1471.                 prot.upload(pack_id,userrr, music_name, socket, server_id);
  1472.                 break;
  1473.  
  1474.             case "check":
  1475.                 String utiliz = pares[3];
  1476.                 prot.check(pack_id,utiliz, socket, server_id);
  1477.                 break;
  1478.  
  1479.             case "add":
  1480.                 String us = pares[3];
  1481.                 String txt = pares[4];
  1482.                 prot.add(pack_id, us, txt, socket, server_id);
  1483.                 break;
  1484.         }
  1485.  
  1486.     }
  1487.  
  1488. }
  1489.  
  1490. public class MulticastServer extends Thread {
  1491.  
  1492.     private String MULTICAST_ADDRESS = "224.3.2.1";
  1493.     private int PORT = 4321; //Porto de recepção
  1494.     private int BUFFER_SIZE = 4096;
  1495.     private static int SERVER_ID;
  1496.  
  1497.     MessageParsing parsemsg = new MessageParsing();
  1498.  
  1499.     public static void main(String[] args) {
  1500.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  1501.         MulticastServer server = new MulticastServer();
  1502.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  1503.     }
  1504.  
  1505.     public MulticastServer() {
  1506.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  1507.         super ("Server Multicast #" + SERVER_ID);
  1508.     }
  1509.  
  1510.     public void run(){
  1511.         MulticastSocket socket = null;
  1512.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  1513.  
  1514.         try {
  1515.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  1516.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1517.             socket.joinGroup(group); //dá join ao grupo multicast
  1518.  
  1519.  
  1520.             while (true) {
  1521.                 //Recepcao
  1522.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  1523.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  1524.                 socket.receive(msgIn); //Recebe o datagrama UDP
  1525.  
  1526.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  1527.                 int clientport = msgIn.getPort(); //Porto do cliente
  1528.  
  1529.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  1530.                 String [] fields = parsemsg.MessageParsing(message);
  1531.  
  1532.                 if (Integer.parseInt(fields[1]) == SERVER_ID){
  1533.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  1534.  
  1535.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  1536.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  1537.                     work.start();
  1538.                 }
  1539.                 else{
  1540.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  1541.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  1542.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  1543.  
  1544.                 }
  1545.  
  1546.             }
  1547.  
  1548.         } catch (IOException e) {
  1549.             e.printStackTrace();
  1550.         } finally {
  1551.             socket.close(); //Fechar a socket
  1552.         }
  1553.     }
  1554.  
  1555. }
  1556.  
  1557. /*
  1558. try{
  1559.             socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
  1560.             socket.setTimeToLive(1);
  1561.  
  1562.             Scanner keyboardScaner = new Scanner(System.in);
  1563.             while (true){
  1564.                 String keyboard = keyboardScaner.nextLine();
  1565.                 byte[] buffer = keyboard.getBytes();
  1566.  
  1567.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1568.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1569.                 socket.send(packet);
  1570.             }
  1571.         } catch (IOException e) {
  1572.             e.printStackTrace();
  1573.         } finally {
  1574.             socket.close();
  1575.         }
  1576.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement