Advertisement
Guest User

SEMPRE A AVIAR

a guest
Oct 24th, 2018
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 67.41 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, int server_id) { //Para escrever no ficheiro de utilizadores
  322.         try {
  323.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj" + server_id + ".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 (int server_id){
  334.         ArrayList <Album> album_list = new ArrayList<>();
  335.  
  336.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList" + server_id + "_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, int server_id) { //Para escrever no ficheiro de álbuns
  348.         try {
  349.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("AlbumList" + server_id + "_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, int server_id) {
  360.  
  361.         try {
  362.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("ArtistList" + server_id + "_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, int server_id){
  373.         try {
  374.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("MusicList_obj" + server_id + ".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 (int server_id){
  386.         ArrayList <Music> music_list = new ArrayList<>();
  387.  
  388.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("MusicList_obj" + server_id + ".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 (int server_id){
  400.         ArrayList <Artist> artist_list = new ArrayList<>();
  401.  
  402.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("ArtistList" + server_id + "_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 (int server_id){
  414.         ArrayList <User> user_list = new ArrayList<>();
  415.  
  416.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj" + server_id + ".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, int server_id){
  428.         try {
  429.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("NotificList_obj" + server_id + ".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 (int server_id){
  442.         ArrayList <Notification> notific_list = new ArrayList<>();
  443.  
  444.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("NotificList_obj" + server_id + ".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" + ";username|" + username +";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.                 } catch (IOException e) {
  507.                     e.printStackTrace();
  508.                 }
  509.  
  510.             }
  511.             else { //PASSWORD ERRADA
  512.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|login" + ";username|" + username + "; status|off; " + "msg|Password incorreta";
  513.  
  514.                 try{
  515.                     byte[] buffer = rsp.getBytes();
  516.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  517.                     socket.send(packet);
  518.  
  519.                 } catch (IOException e) {
  520.                     e.printStackTrace();
  521.                 }
  522.             }
  523.         }
  524.  
  525.         else{ //UTILIZADOR NAO EXISTE
  526.             String rsp = "pack_id|" + pack_id +  ";server_id|" + server_id + "; type|login" + ";username|" + username + "; status|off; " + "msg|Utilizador nao existe";
  527.  
  528.             try{
  529.                 byte[] buffer = rsp.getBytes();
  530.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  531.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  532.                 socket.send(packet);
  533.  
  534.             } catch (IOException e) {
  535.                 e.printStackTrace();
  536.             }
  537.         }
  538.  
  539.  
  540.     }
  541.  
  542.     void register (String pack_id, String username, String password, MulticastSocket socket, int server_id) throws IOException {
  543.  
  544.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  545.         //Abrir para a leitura do ficheiro de objetos
  546.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_" + server_id + "obj.txt"))) {
  547.             users = (ArrayList) oin.readObject();
  548.         } catch (IOException e){
  549.             System.out.println(e.getMessage());
  550.         } catch (ClassNotFoundException e) {
  551.             e.printStackTrace();
  552.         }
  553.  
  554.         System.out.println("O cliente deseja registar-se");
  555.         System.out.println("Username inserido: " + username);
  556.         System.out.println("Password inserida: " + password);
  557.  
  558.         //Temos que ver se existe o username ou não
  559.         if (!data.username_match(username)) {
  560.  
  561.             //Abrir para escrita no ficheiro de objetos
  562.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  563.                 User u = new User(username, password, "admin");
  564.                 users.add(u);
  565.             }
  566.             else{
  567.                 User u = new User(username, password, "normal");
  568.                 users.add(u);
  569.             }
  570.  
  571.             try {
  572.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_" + server_id +"obj.txt"));
  573.                 oS.writeObject(users);
  574.                 oS.close();
  575.  
  576.             } catch (IOException e) {
  577.                 System.out.print("ERRO");
  578.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  579.             }
  580.  
  581.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|successful; " + "msg|Welcome to DropMusic";
  582.             try{
  583.                 byte[] buffer = rsp.getBytes();
  584.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  585.                 socket.send(packet);
  586.  
  587.             } catch (IOException e) {
  588.                 e.printStackTrace();
  589.             }
  590.         }
  591.  
  592.         else {
  593.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|unsuccessful; " + "msg|Esse username ja existe";
  594.  
  595.             try{
  596.                 byte[] buffer = rsp.getBytes();
  597.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  598.                 socket.send(packet);
  599.  
  600.             } catch (IOException e) {
  601.                 e.printStackTrace();
  602.             }
  603.         }
  604.  
  605.         //SÓ PARA VER QUEM TENHO REGISTADO
  606.         for (User uss: users){
  607.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  608.         }
  609.  
  610.  
  611.     }
  612.  
  613.     void search_music (String pack_id, String choice, String name, MulticastSocket socket, int server_id){ //FALTA o ALL, COMPLETAR E TESTAR
  614.         System.out.println("O cliente deseja procurar musica");
  615.  
  616.         switch (choice){
  617.             case "all": //Vai procurar por tudo o que os outros "cases" vao procurar //ACHO QUE VOU RETIRAR ISTO
  618.  
  619.                 break;
  620.  
  621.             case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
  622.                 ArrayList <Album> album_list = data.get_AlbumList(server_id); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  623.                 //ArrayList <Music> aux = new ArrayList<>(); //ArrayList auxiliar para pôr todos os albuns com o nome "name"
  624.                 String x = "";
  625.                 int item_count = 0;
  626.  
  627.                 for (Album a: album_list){
  628.                     if (a.getAlbum_name().equals(name)){
  629.                         item_count = a.music_list.size();
  630.                         for (int k = 0; k < item_count; k++)
  631.  
  632.                         x += "item_"+k+"_name| " + a.music_list.get(k).getName();
  633.  
  634.                     }
  635.                 }
  636.  
  637.                 //1. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  638.                 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" +
  639.                         "item_count| " + item_count + x; //Ver se o item_count é bem apresentado
  640.  
  641.                 try{
  642.                     byte[] buffer = rsp.getBytes();
  643.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  644.                     socket.send(packet);
  645.                 } catch (IOException e) {
  646.                     e.printStackTrace();
  647.                 }
  648.  
  649.  
  650.                 break;
  651.  
  652.             case "music":  //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
  653.                 ArrayList <Music> music_list = data.get_MusicList(server_id);
  654.                 //ArrayList <Music> auxappend = new ArrayList<>();
  655.  
  656.                 String s = "";
  657.                 int item_size = 0;
  658.  
  659.                 for (Music m: music_list){
  660.                     if (m.getName().equals(name)){
  661.                         s += "item_"+item_size+"_name| " + m.getName();
  662.                         item_size++;
  663.  
  664.                     }
  665.                 }
  666.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  667.                 String ans = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|search music;" + "; type|successful; " + "msg|This is the music list you requested" +
  668.                         "item_count| " + item_size + s; //Ver se o item_size é bem apresentado
  669.                 //ENVIAR RESPOSTA PARA O CLIENTE
  670.                 try {
  671.                     byte[] buffer = ans.getBytes();
  672.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  673.                     socket.send(packet);
  674.                 } catch (IOException e) {
  675.                     e.printStackTrace();
  676.                 }
  677.  
  678.                 break;
  679.  
  680.             case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
  681.  
  682.                 //NOTAAAA: DECIDIR SE CRIO UM FICHEIRO DE ARTISTAS OU SE NÃO É NECESSÁRIO
  683.                 ArrayList <Artist> artist_list = data.get_ArtistList(server_id);
  684.  
  685.                 String z = "";
  686.                 int tam = 0;
  687.  
  688.                 for (Artist a: artist_list){
  689.                     if (a.getNome().equals(name)){
  690.                         for (int j = 0; j < a.getMusic_list().size(); j++){
  691.                             tam = a.getMusic_list().size();
  692.                             z += "item_"+ j +"_name| " + a.getMusic_list().get(j).getName();
  693.                         }
  694.                     }
  695.                 }
  696.  
  697.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  698.                 String resp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  699.                         "item_count| " + tam + z; //Ver se o item_size é bem apresentado
  700.                 //ENVIAR RESPOSTA PARA O CLIENTE
  701.                 try {
  702.                     byte[] buffer = resp.getBytes();
  703.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  704.                     socket.send(packet);
  705.                 } catch (IOException e) {
  706.                     e.printStackTrace();
  707.                 }
  708.  
  709.                 break;
  710.  
  711.             case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
  712.                 ArrayList <Music> music_list1 = data.get_MusicList(server_id); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  713.  
  714.                 String aux = "";
  715.                 int conta = 0;
  716.  
  717.                 for (Music m: music_list1){
  718.                     if (m.getGenre().equals(name)){
  719.                         aux += "item_"+conta +"_name| " + m.getName();
  720.                         conta++;
  721.                     }
  722.                 }
  723.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  724.                 String envia = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  725.                         "item_count| " + conta + aux; //Ver se o conta é bem apresentado
  726.  
  727.                 //ENVIAR RESPOSTA PARA O CLIENTE
  728.                 try {
  729.                     byte[] buffer = envia.getBytes();
  730.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  731.                     socket.send(packet);
  732.                 } catch (IOException e) {
  733.                     e.printStackTrace();
  734.                 }
  735.  
  736.                 break;
  737.  
  738.         }
  739.  
  740.     }
  741.  
  742.     void make_editor (String pack_id, String username, String novo_editor, MulticastSocket socket, int server_id){ //VERIFICAR E TESTAR
  743.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  744.  
  745.         ArrayList <User> users = new ArrayList<>();
  746.  
  747.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  748.             users = (ArrayList) oin.readObject();
  749.         } catch (IOException e){
  750.             System.out.println(e.getMessage());
  751.         } catch (ClassNotFoundException e) {
  752.             e.printStackTrace();
  753.         }
  754.  
  755.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  756.         if (data.username_match(username)) { //SUCESSO
  757.             for (User u : users) {
  758.                 if (u.getUsername().equals(username)) {
  759.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) {
  760.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  761.                         for (User us : users) {
  762.                             if (us.getUsername().equals(novo_editor)) {
  763.                                 us.setUser_type("editor");
  764.                                 data.write_user_file(users, server_id);
  765.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  766.                                 String rsp = "pack_id|" + pack_id +  ";server_id|" + server_id + ";type|make editor" + ";status|successful; " + "msg|You can edit now";
  767.                                 try {
  768.                                     byte[] buffer = rsp.getBytes();
  769.                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  770.                                     socket.send(packet);
  771.  
  772.                                 } catch (IOException e) {
  773.                                     e.printStackTrace();
  774.                                 }
  775.                             /*} else { //FALTA PÔR ESTE CHECK A FUNCIONAR
  776.                                 System.out.println("Utilizador nao existe");
  777.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  778.                             }*/
  779.                             }
  780.                         }
  781.                     }
  782.                 }
  783.             }
  784.  
  785.         } else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
  786.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|make editor" + "; status|unsuccessful; " + "msg|The user you entered is not in our database";
  787.             try {
  788.                 byte[] buffer = rsp.getBytes();
  789.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  790.                 socket.send(packet);
  791.  
  792.             } catch (IOException e) {
  793.                 e.printStackTrace();
  794.             }
  795.         }
  796.  
  797.  
  798.     }
  799.  
  800.     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
  801.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  802.  
  803.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  804.         ArrayList<User> users = data.get_UserList(server_id);
  805.  
  806.         ArrayList<Artist> artist_list = data.get_ArtistList(server_id);
  807.         ArrayList<Album> album_list = data.get_AlbumList(server_id);
  808.         ArrayList<Music> music_list = data.get_MusicList(server_id);
  809.  
  810.         if (data.username_match(username)) { //SUCESSO
  811.             for (User u : users) {
  812.                 if (u.getUsername().equals(username)) {
  813.                     if (u.getUser_type().equals("editor")) {
  814.                         System.out.println("Tem permissao para editar");
  815.  
  816.                         switch (choice) {
  817.                             case "artist": /*-------------------------ARTIST--------------------------*/
  818.                                 String artist_name = search_name;
  819.                                 switch (op_type){
  820.                                     case "insert": /*-*************INSERT*****************/
  821.  
  822.                                         String [] artist_details = name.split("-");
  823.                                         String grupo = artist_details[0];
  824.                                         String data_nasc = artist_details[1];
  825.                                         String genre = artist_details[2];
  826.                                         String biography = artist_details[3];
  827.                                         String music_counter = artist_details[4];
  828.  
  829.                                         ArrayList <Music> aux_musiclist = new ArrayList<>();
  830.                                         Artist new_artist;
  831.  
  832.                                         if (Integer.parseInt(music_counter) != 0) {
  833.                                             for (int j = 5; j < artist_details.length; j++) {
  834.                                                 Music m = new Music(null, null, null, artist_details[j], 0);
  835.                                                 aux_musiclist.add(m);
  836.                                             }
  837.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, aux_musiclist);
  838.                                         }
  839.                                         else{
  840.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, null);
  841.                                         }
  842.                                         artist_list.add(new_artist);
  843.                                         data.write_artislist_file(artist_list, server_id);
  844.  
  845.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist added";
  846.  
  847.                                         try{
  848.                                             byte[] buffer = rsp_client.getBytes();
  849.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  850.                                             socket.send(packet);
  851.  
  852.                                         } catch (IOException e) {
  853.                                             e.printStackTrace();
  854.                                         }
  855.  
  856.                                         break;
  857.  
  858.                                     case "change": /*-*************CHANGE*****************/
  859.                                         switch (field_type) {
  860.                                             case "name":
  861.                                                 for (Artist a: artist_list){
  862.                                                     if (a.getNome().equals(artist_name)){
  863.                                                         a.setNome(name);
  864.                                                     }
  865.                                                 }
  866.                                                 break;
  867.                                             case "grupo":
  868.                                                 for (Artist a: artist_list){
  869.                                                     if (a.getNome().equals(artist_name)){
  870.                                                         a.setGrupo(name);
  871.                                                     }
  872.                                                 }
  873.                                                 break;
  874.                                             case "genre":
  875.                                                 for (Artist a: artist_list){
  876.                                                     if (a.getNome().equals(artist_name)){
  877.                                                         a.setGenre(name);
  878.                                                     }
  879.                                                 }
  880.                                                 break;
  881.                                             case "biography":
  882.                                                 for (Artist a: artist_list){
  883.                                                     if (a.getNome().equals(artist_name)){
  884.                                                         a.setBiography(name);
  885.                                                     }
  886.                                                 }
  887.                                                 break;
  888.                                             case "data_nasc":
  889.                                                 for (Artist a: artist_list){
  890.                                                     if (a.getNome().equals(artist_name)){
  891.                                                         a.setData_nasc(name);
  892.                                                     }
  893.                                                 }
  894.                                                 break;
  895.                                             case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS
  896.  
  897.                                                 break;
  898.                                         }
  899.  
  900.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist info changed";
  901.  
  902.                                         try{
  903.                                             byte[] buffer = r.getBytes();
  904.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  905.                                             socket.send(packet);
  906.  
  907.                                         } catch (IOException e) {
  908.                                             e.printStackTrace();
  909.                                         }
  910.                                         break;
  911.  
  912.                                     case "remove": /*-*************REMOVE*****************/
  913.                                         for (Artist a: artist_list){
  914.                                             if(a.getNome().equals(artist_name)){
  915.                                                 artist_list.remove(a);
  916.                                                 data.write_artislist_file(artist_list, server_id);
  917.                                             }
  918.                                         }
  919.  
  920.                                         String rr = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist removed";
  921.  
  922.                                         try{
  923.                                             byte[] buffer = rr.getBytes();
  924.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  925.                                             socket.send(packet);
  926.                                         } catch (IOException e) {
  927.                                             e.printStackTrace();
  928.                                         }
  929.  
  930.                                         break;
  931.                                 }
  932.                                 break;
  933.  
  934.                             case "album": /*-------------------------ALBUM--------------------------*/
  935.                                 String album_title = search_name;
  936.                                 switch (op_type) {
  937.                                     case "insert":
  938.                                         String [] album_details = name.split("-");
  939.                                         String artist = album_details[0];
  940.                                         String description = album_details[1];
  941.                                         String music_counter = album_details[2];
  942.  
  943.                                         ArrayList <Music> aux_music = new ArrayList<>();
  944.                                         Album new_album;
  945.  
  946.                                         if (Integer.parseInt(music_counter) != 0) {
  947.                                             for (int j = 3; j < album_details.length; j++) {
  948.                                                 Music m = new Music(null, null, null, album_details[j], 0);
  949.                                                 aux_music.add(m);
  950.                                             }
  951.                                             new_album = new Album(album_title, artist, description, 0, aux_music, null);
  952.                                         }
  953.                                         else{
  954.                                             new_album = new Album(album_title, artist, description, 0, null, null);
  955.                                         }
  956.                                         album_list.add(new_album);
  957.                                         data.write_albumlist_file(album_list, server_id);
  958.  
  959.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album added";
  960.  
  961.                                         try{
  962.                                             byte[] buffer = rsp_client.getBytes();
  963.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  964.                                             socket.send(packet);
  965.  
  966.                                         } catch (IOException e) {
  967.                                             e.printStackTrace();
  968.                                         }
  969.  
  970.                                         break;
  971.  
  972.                                     case "change":
  973.                                         switch (field_type) {
  974.                                             case "album name":
  975.                                                 for (Album a : album_list) {
  976.                                                     if (a.getAlbum_name().equals(album_title)) {
  977.                                                         a.setAlbum_name(name);
  978.                                                     }
  979.                                                 }
  980.                                                 break;
  981.                                             case "description":
  982.                                                 for (Album a : album_list) {
  983.                                                     if (a.getAlbum_name().equals(album_title)) {
  984.                                                         a.setDescription(name);
  985.                                                     }
  986.                                                 }
  987.                                                 break;
  988.                                             case "artist":
  989.                                                 for (Album a : album_list) {
  990.                                                     if (a.getAlbum_name().equals(album_title)) {
  991.                                                         a.setArtist(name);
  992.                                                     }
  993.                                                 }
  994.                                                 break;
  995.                                             case "review list": //NAO FAZ SENTIDO PORQUE NAO SE VAI MEXER EM ALGO QUE JA ALGUEM ESCREVEU
  996.                                                 //CAGUEI
  997.                                                 break;
  998.                                             case "music list": //DUVIDA //MUDO O QUÊ???????????????????????????
  999.                                                 for (Album a : album_list) {
  1000.                                                     if (a.getAlbum_name().equals(album_title)) {
  1001.                                                         Music m = new Music(null, null, null, name, 0); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
  1002.                                                         a.getMusic_list().add(m);
  1003.                                                     }
  1004.                                                 }
  1005.                                                 break;
  1006.                                         }
  1007.  
  1008.                                         break;
  1009.                                     case "remove":
  1010.                                         for (Album a: album_list){
  1011.                                             if (a.getAlbum_name().equals(album_title)){
  1012.                                                 album_list.remove(a);
  1013.                                                 data.write_albumlist_file(album_list, server_id);
  1014.                                             }
  1015.                                         }
  1016.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album removed";
  1017.  
  1018.                                         try{
  1019.                                             byte[] buffer = r.getBytes();
  1020.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1021.                                             socket.send(packet);
  1022.  
  1023.                                         } catch (IOException e) {
  1024.                                             e.printStackTrace();
  1025.                                         }
  1026.  
  1027.                                         break;
  1028.                                 }
  1029.                                 break;
  1030.  
  1031.                             case "music": /*-------------------------MUSIC--------------------------*/
  1032.                                 String music_name = search_name;
  1033.                                 switch (op_type) {
  1034.                                     case "insert":
  1035.                                         String [] music_details = name.split("-");
  1036.                                         String artist = music_details[0];
  1037.                                         String genre = music_details[1];
  1038.                                         String album = music_details[2];
  1039.                                         String duration = music_details[3];
  1040.  
  1041.                                         Music m = new Music(artist, genre, album, music_name, Integer.parseInt(duration));
  1042.                                         music_list.add(m);
  1043.                                         data.write_musiclist_file(music_list, server_id);
  1044.  
  1045.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music added";
  1046.  
  1047.                                         try{
  1048.                                             byte[] buffer = rsp_client.getBytes();
  1049.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1050.                                             socket.send(packet);
  1051.  
  1052.                                         } catch (IOException e) {
  1053.                                             e.printStackTrace();
  1054.                                         }
  1055.  
  1056.                                         break;
  1057.  
  1058.                                     case "change":
  1059.                                         switch (field_type) {
  1060.                                             case "name":
  1061.                                                 for (Music mu : music_list) {
  1062.                                                     if(mu.getName().equals(music_name)){
  1063.                                                         mu.setName(name);
  1064.                                                     }
  1065.                                                 }
  1066.                                                 break;
  1067.                                             case "genre":
  1068.                                                 for (Music mu : music_list) {
  1069.                                                     if(mu.getName().equals(music_name)){
  1070.                                                         mu.setGenre(name);
  1071.                                                     }
  1072.                                                 }
  1073.                                                 break;
  1074.                                             case "artist":
  1075.                                                 for (Music mu : music_list) {
  1076.                                                     if(mu.getName().equals(music_name)){
  1077.                                                         mu.setArtist(name);
  1078.                                                     }
  1079.                                                 }
  1080.                                                 break;
  1081.                                             case "duration":
  1082.                                                 for (Music mu : music_list) {
  1083.                                                     if(mu.getName().equals(music_name)){
  1084.                                                         mu.setDuration(Integer.parseInt(name));
  1085.                                                     }
  1086.                                                 }
  1087.                                                 break;
  1088.                                             case "album":
  1089.                                                 for (Music mu : music_list) {
  1090.                                                     if(mu.getName().equals(music_name)){
  1091.                                                         mu.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
  1092.                                                     }
  1093.                                                 }
  1094.                                                 break;
  1095.                                         }
  1096.  
  1097.                                         String r1 = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music info changed";
  1098.  
  1099.                                         try{
  1100.                                             byte[] buffer = r1.getBytes();
  1101.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1102.                                             socket.send(packet);
  1103.  
  1104.                                         } catch (IOException e) {
  1105.                                             e.printStackTrace();
  1106.                                         }
  1107.  
  1108.                                         break;
  1109.                                     case "remove":
  1110.                                         for (Music mu: music_list){
  1111.                                             if (mu.getName().equals(music_name)){
  1112.                                                 music_list.remove(mu);
  1113.                                                 data.write_musiclist_file(music_list, server_id);
  1114.                                             }
  1115.                                         }
  1116.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music removed";
  1117.  
  1118.                                         try{
  1119.                                             byte[] buffer = r.getBytes();
  1120.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1121.                                             socket.send(packet);
  1122.  
  1123.                                         } catch (IOException e) {
  1124.                                             e.printStackTrace();
  1125.                                         }
  1126.                                         break;
  1127.                                 }
  1128.                                 break;
  1129.  
  1130.                         }
  1131.                     }
  1132.                 }
  1133.             }
  1134.         }
  1135.     }
  1136.  
  1137.     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
  1138.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  1139.  
  1140.         //1. Ver se a choice é album ou artista //E TALVEZ TAMBÉM MÚSICA
  1141.         switch (choice){
  1142.             case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
  1143.                     ArrayList <Album> show_albuns = data.get_AlbumList(server_id);
  1144.                     String info = ""; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1145.                     String lista_music = "Music_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1146.                     String lista_review = "Review_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1147.  
  1148.                     for (Album a: show_albuns){
  1149.                         if (a.getAlbum_name().equals(msg)){
  1150.                             info += a.getAlbum_name() + a.getArtist() + a.getDescription() + a.getRating();
  1151.                         }
  1152.                     }
  1153.  
  1154.                     for (Album a: show_albuns) {
  1155.                         if (a.getAlbum_name().equals(msg)) {
  1156.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  1157.                                 lista_music += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  1158.                             }
  1159.                         }
  1160.                     }
  1161.  
  1162.                     for (Album a: show_albuns) {
  1163.                         if (a.getAlbum_name().equals(msg)) {
  1164.                             for (int k = 0; k < a.getReview_list().size(); k++) {
  1165.                                 lista_review += "item_" + k + "_name" + " user: " + a.getReview_list().get(k).getText() +
  1166.                                         " review: " + a.getReview_list().get(k).getText() + " rating: " + a.getReview_list().get(k).getRating();
  1167.                             }
  1168.                         }
  1169.                     }
  1170.  
  1171.                     String answer = "pack_id|" + pack_id +  "; " + "server_id|" + server_id + "; " + info + lista_music + lista_review; //VER SE OBEDECE AO PROTOCOLO
  1172.                     //ENVIAR RESPOSTA PARA O CLIENTE
  1173.                     try {
  1174.                         byte[] buffer = answer.getBytes();
  1175.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1176.                         socket.send(packet);
  1177.                     } catch (IOException e) {
  1178.                         e.printStackTrace();
  1179.                     }
  1180.  
  1181.                 break;
  1182.  
  1183.             case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
  1184.                     ArrayList <Artist> artist_list = data.get_ArtistList(server_id);
  1185.                     String msg_send = "";
  1186.                     String musicas = "";
  1187.  
  1188.                     for (Artist a : artist_list){
  1189.                         if (a.getNome().equals(msg)){
  1190.                             msg_send = a.getGrupo() + a.getData_nasc() + a.getGenre() + a.getBiography();
  1191.                         }
  1192.                     }
  1193.  
  1194.                     for (Artist a: artist_list) {
  1195.                         if (a.getNome().equals(msg)) {
  1196.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  1197.                                 musicas += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  1198.                             }
  1199.                         }
  1200.                     }
  1201.  
  1202.                     String env_answer = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + msg_send + musicas;
  1203.                     //ENVIAR RESPOSTA PARA O CLIENTE
  1204.                     try {
  1205.                         byte[] buffer = env_answer.getBytes();
  1206.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1207.                         socket.send(packet);
  1208.                     } catch (IOException e) {
  1209.                         e.printStackTrace();
  1210.                     }
  1211.  
  1212.                 break;
  1213.  
  1214.             case "music":
  1215.                 ArrayList <Music> music_list = data.get_MusicList(server_id);
  1216.                 String resp_aux = "";
  1217.  
  1218.                 for (Music m: music_list){
  1219.                     if (m.getName().equals(msg)){
  1220.                         resp_aux += m.getName() + m.getAlbum_title() + m.getGenre() + m.getArtist() + m.getDuration();
  1221.                     }
  1222.                 }
  1223.  
  1224.                 String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + resp_aux;
  1225.                 //ENVIAR RESPOSTA PARA O CLIENTE
  1226.                 try {
  1227.                     byte[] buffer = resp.getBytes();
  1228.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1229.                     socket.send(packet);
  1230.                 } catch (IOException e) {
  1231.                     e.printStackTrace();
  1232.                 }
  1233.  
  1234.                 break;
  1235.         }
  1236.     }
  1237.  
  1238.     void album_review (String pack_id, String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
  1239.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  1240.  
  1241.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  1242.         ArrayList <Album> album_list = data.get_AlbumList(server_id);
  1243.         Review r = new Review(text, Integer.parseInt(rating), user);
  1244.  
  1245.         for (Album a: album_list){
  1246.             if (a.getAlbum_name().equals(album_title)){
  1247.                 a.review_list.add(r); //Adicionar a review à lista de reviews
  1248.                 data.write_albumlist_file(album_list, server_id);
  1249.  
  1250.                 String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|review" + "; status|successful; " + "msg|Your review was submitted";
  1251.                 try {
  1252.                     byte[] buffer = rsp.getBytes();
  1253.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1254.                     socket.send(packet);
  1255.                 } catch (IOException e) {
  1256.                     e.printStackTrace();
  1257.                 }
  1258.             }
  1259.             else { //ÁLBUM NÃO CONSTA DA BASE DE DADOS
  1260.                 String rsp = "pack_id|" + pack_id  + "; server_id|" + server_id + "; type|review" + "; status|unsuccessful; " + "msg|The selected album is not in our database";
  1261.                 try {
  1262.                     byte[] buffer = rsp.getBytes();
  1263.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1264.                     socket.send(packet);
  1265.                 } catch (IOException e) {
  1266.                     e.printStackTrace();
  1267.                 }
  1268.             }
  1269.         }
  1270.  
  1271.     }
  1272.  
  1273.     void download (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  1274.         System.out.println("O cliente quer fazer download de uma música");
  1275.  
  1276.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS
  1277.  
  1278.         //2. VER SE O UTILIZADOR TEM ACESSO A ESSA MÚSICA OU NÃO
  1279.  
  1280.         //3. SE AMBOS OS REQUISITOS SE CUMPRIREM
  1281.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  1282.  
  1283.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  1284.  
  1285.  
  1286.     }
  1287.  
  1288.     void upload (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  1289.         System.out.println("O cliente quer fazer upload de uma música");
  1290.  
  1291.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS (SE JÁ ESTIVER, NÃO DEIXA ADICIONAR DE NOVO)
  1292.  
  1293.         //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)
  1294.  
  1295.         //3. SE O REQUISITO 1 SE CUMPRIR
  1296.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  1297.  
  1298.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  1299.  
  1300.  
  1301.  
  1302.     }
  1303.  
  1304.     void share_music (String pack_id, String user, String music_name, ArrayList<String>user_list, MulticastSocket socket, int server_id){ //EM FALTA
  1305.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  1306.  
  1307.         //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
  1308.         //DÚVIDA: /*UM USER TEM UM ARRAYLIST DE MÚSICAS OU*/ EM PRÍNCIPIO, TER NA CLASSE MUSIC -> UM ARRAYLIST DE USERS
  1309.  
  1310.         //2. SE ESTE REQUISITO SE CUMPRIR, VOU AO ARRAYLIST DE USERS DESSA MÚSICA E ADICIONO OS UTILIZADORES QUE SE ENCONTRAM NA ARRAYLIST
  1311.  
  1312.         //3. POR FIM, ENVIO A MENSAGEM AO CLIENTE A DIZER SE TUDO CORREU BEM OU NÃO
  1313.  
  1314.  
  1315.     }
  1316.  
  1317.     void check (String pack_id, String user, MulticastSocket socket, int server_id){
  1318.         ArrayList <Notification> not_list = data.get_NotificationList(server_id);
  1319.  
  1320.         String send = "";
  1321.         int conta = 0;
  1322.         for (Notification n: not_list){
  1323.             if (n.getUsername().equals(user)){
  1324.                 send += "Notif #" + conta + "|" +  n.getMessage() + ";";
  1325.                 conta++;
  1326.                 not_list.remove(n); //Remover a notificação que estava na lista de notificações
  1327.             }
  1328.         }
  1329.  
  1330.         String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|check" + "; status|successful; " + "msg|" + send;
  1331.         try {
  1332.             byte[] buffer = rsp.getBytes();
  1333.             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1334.             socket.send(packet);
  1335.         } catch (IOException e) {
  1336.             e.printStackTrace();
  1337.         }
  1338.     }
  1339.  
  1340.     void add (String pack_id, String user, String text, MulticastSocket socket, int server_id){
  1341.         ArrayList <Notification> n_list = data.get_NotificationList(server_id);
  1342.         Notification notif = new Notification(user, text);
  1343.         n_list.add(notif);
  1344.  
  1345.         data.write_notifications_file(n_list, server_id);
  1346.  
  1347.         String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|add" + "; status|successful; " + "msg|Notification added to the list";
  1348.         try {
  1349.             byte[] buffer = rsp.getBytes();
  1350.             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1351.             socket.send(packet);
  1352.         } catch (IOException e) {
  1353.             e.printStackTrace();
  1354.         }
  1355.  
  1356.     }
  1357.  
  1358. }
  1359.  
  1360.  
  1361. class AnswerRequests extends Thread {
  1362.  
  1363.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  1364.     //private int PORT = 4444; //Porto de envio
  1365.     private String message;
  1366.     private String ip;
  1367.     private int porto;
  1368.     private MulticastSocket socket;
  1369.     private int server_id;
  1370.  
  1371.     MessageParsing parsing = new MessageParsing();
  1372.  
  1373.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  1374.         this.message = message;
  1375.         this.ip = ip;
  1376.         this.porto = porto;
  1377.         this.socket = socket;
  1378.         this.server_id = server_id;
  1379.     }
  1380.  
  1381.     public void run(){
  1382.  
  1383.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  1384.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  1385.  
  1386.         //Enviar resposta para o cliente
  1387.         //MulticastSocket socket = null;
  1388.  
  1389.         //Parsing da mensagem
  1390.         String [] pares = parsing.MessageParsing(message);
  1391.         String type = pares[2];
  1392.         String pack_id = pares[0];
  1393.  
  1394.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  1395.         //Trata do pedido para depois enviar a resposta para o cliente
  1396.         switch (type) {
  1397.             case "login":
  1398.                 prot.login(pack_id, pares[3], pares[4], socket, server_id);
  1399.                 break;
  1400.  
  1401.             case "search music":
  1402.                 prot.search_music(pack_id, pares[3], pares[4], socket, server_id);
  1403.                 break;
  1404.  
  1405.             case "make editor":
  1406.                 String username = pares[3];
  1407.                 String new_editor = pares[4];
  1408.                 prot.make_editor(pack_id, username, new_editor, socket, server_id); //EDITOR
  1409.                 break;
  1410.  
  1411.             case "register":
  1412.                 try {
  1413.                     prot.register(pack_id, pares[3], pares[4], socket, server_id);
  1414.                 } catch (IOException e) {
  1415.                     e.printStackTrace();
  1416.                 }
  1417.                 break;
  1418.  
  1419.             case "edit info":
  1420.                 String user = pares[3];
  1421.                 String search = pares[4];
  1422.                 String search_name = pares[5];
  1423.                 String op_type = pares[6];
  1424.                 String field_type = pares[7];
  1425.                 String msg = pares[8];
  1426.                 prot.manage_data(pack_id, user, search, search_name, op_type, field_type, msg, socket, server_id); //EDITOR
  1427.                 break;
  1428.  
  1429.             case "search info":
  1430.                 String search_type = pares[3];
  1431.                 String choice_name = pares[4];
  1432.                 prot.search_info(pack_id, search_type,choice_name, socket, server_id);
  1433.                 break;
  1434.  
  1435.             case "review":
  1436.                 String userr = pares[3];
  1437.                 String album_name = pares[4];
  1438.                 String rating = pares[5];
  1439.                 String review_text = pares[6];
  1440.                 prot.album_review(pack_id, userr, album_name, rating, review_text, socket, server_id); //ANY USER
  1441.                 break;
  1442.  
  1443.             case "share music": //DEPOIS
  1444.                 String Uuser = pares[3];
  1445.                 String musicc = pares[4];
  1446.                 //String counter = pares[5]; //ACHO QUE NAO VOU PRECISAR DISTO PARA NADA
  1447.                 ArrayList <String> lista = new ArrayList<>();
  1448.                 for (int j = 6; j < pares.length; j++){
  1449.                     lista.add(pares[j]);
  1450.                 }
  1451.                 prot.share_music(pack_id, Uuser, musicc, lista, socket, server_id);
  1452.                 break;
  1453.  
  1454.             case "download": //DEPOIS
  1455.                 String userrrr = pares[3];
  1456.                 String music = pares[4];
  1457.                 prot.download(pack_id, userrrr, music, socket, server_id);
  1458.                 break;
  1459.  
  1460.             case "upload":  //DEPOIS
  1461.                 String userrr = pares[3];
  1462.                 String music_name = pares[4];
  1463.                 prot.upload(pack_id,userrr, music_name, socket, server_id);
  1464.                 break;
  1465.  
  1466.             case "check":
  1467.                 String utiliz = pares[3];
  1468.                 prot.check(pack_id,utiliz, socket, server_id);
  1469.                 break;
  1470.  
  1471.             case "add":
  1472.                 String us = pares[3];
  1473.                 String txt = pares[4];
  1474.                 prot.add(pack_id, us, txt, socket, server_id);
  1475.                 break;
  1476.         }
  1477.  
  1478.     }
  1479.  
  1480. }
  1481.  
  1482. public class MulticastServer extends Thread {
  1483.  
  1484.     private String MULTICAST_ADDRESS = "224.3.2.1";
  1485.     private int PORT = 4321; //Porto de recepção
  1486.     private int BUFFER_SIZE = 4096;
  1487.     private static int SERVER_ID;
  1488.  
  1489.     MessageParsing parsemsg = new MessageParsing();
  1490.  
  1491.     public static void main(String[] args) {
  1492.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  1493.         MulticastServer server = new MulticastServer();
  1494.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  1495.     }
  1496.  
  1497.     public MulticastServer() {
  1498.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  1499.         super ("Server Multicast #" + SERVER_ID);
  1500.     }
  1501.  
  1502.     public void run(){
  1503.         MulticastSocket socket = null;
  1504.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  1505.  
  1506.         try {
  1507.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  1508.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1509.             socket.joinGroup(group); //dá join ao grupo multicast
  1510.  
  1511.  
  1512.             while (true) {
  1513.                 //Recepcao
  1514.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  1515.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  1516.                 socket.receive(msgIn); //Recebe o datagrama UDP
  1517.  
  1518.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  1519.                 int clientport = msgIn.getPort(); //Porto do cliente
  1520.  
  1521.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  1522.                 String [] fields = parsemsg.MessageParsing(message);
  1523.  
  1524.                 if (Integer.parseInt(fields[1]) == SERVER_ID){
  1525.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  1526.  
  1527.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  1528.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  1529.                     work.start();
  1530.                 }
  1531.                 else{
  1532.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  1533.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  1534.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  1535.  
  1536.                 }
  1537.  
  1538.             }
  1539.  
  1540.         } catch (IOException e) {
  1541.             e.printStackTrace();
  1542.         } finally {
  1543.             socket.close(); //Fechar a socket
  1544.         }
  1545.     }
  1546.  
  1547. }
  1548.  
  1549. /*
  1550. try{
  1551.             socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
  1552.             socket.setTimeToLive(1);
  1553.  
  1554.             Scanner keyboardScaner = new Scanner(System.in);
  1555.             while (true){
  1556.                 String keyboard = keyboardScaner.nextLine();
  1557.                 byte[] buffer = keyboard.getBytes();
  1558.  
  1559.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1560.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1561.                 socket.send(packet);
  1562.             }
  1563.         } catch (IOException e) {
  1564.             e.printStackTrace();
  1565.         } finally {
  1566.             socket.close();
  1567.         }
  1568.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement