Advertisement
Guest User

AQUI VAMOS NÓS

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