Advertisement
Guest User

E VAI MAIS UM

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