Advertisement
Guest User

QUERO TRANSFERIR

a guest
Oct 26th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 111.78 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.     private ArrayList <String> not_others = new ArrayList<>();
  127.  
  128.     public Album(String album_name, String artist, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list, ArrayList <String> not_others) {
  129.         this.album_name = album_name;
  130.         this.description = description;
  131.         this.rating = rating;
  132.         this.artist = artist;
  133.         this.music_list = music_list;
  134.         this.review_list = review_list;
  135.         this.not_others = not_others;
  136.     }
  137.  
  138.     public String getAlbum_name() {
  139.         return album_name;
  140.     }
  141.  
  142.     public String getDescription() {
  143.         return description;
  144.     }
  145.  
  146.     public double getRating() {
  147.         rating = average_rating();
  148.         return rating;
  149.     }
  150.  
  151.     public ArrayList<Music> getMusic_list() {
  152.         return music_list;
  153.     }
  154.  
  155.     public ArrayList<Review> getReview_list() {
  156.         if (review_list == null){
  157.             System.out.println("OH GOD HELP ME PLEASE");
  158.         }
  159.         return review_list;
  160.     }
  161.  
  162.     public void setDescription(String description) {
  163.         this.description = description;
  164.     }
  165.  
  166.     public String getArtist() {
  167.         return artist;
  168.     }
  169.  
  170.     public double average_rating (){
  171.         int soma = 0;
  172.         int size = review_list.size();
  173.         double average_rating;
  174.  
  175.         for (Review r: review_list){
  176.             soma += r.getRating();
  177.         }
  178.  
  179.         average_rating = (double) soma / size;
  180.  
  181.         return average_rating;
  182.     }
  183.  
  184.     public void setAlbum_name(String album_name) {
  185.         this.album_name = album_name;
  186.     }
  187.  
  188.     public void setArtist(String artist) {
  189.         this.artist = artist;
  190.     }
  191.  
  192.     public ArrayList<String> getNot_others() {
  193.         return not_others;
  194.     }
  195.  
  196.     public void setNot_others(ArrayList<String> not_others) {
  197.         this.not_others = not_others;
  198.     }
  199. }
  200.  
  201. class Review implements Serializable {
  202.     private String text;
  203.     private int rating;
  204.     private String user;
  205.  
  206.     public Review(String text, int rating, String user) {
  207.         this.text = text;
  208.         this.rating = rating;
  209.         this.user = user;
  210.     }
  211.  
  212.     public String getText() {
  213.         return text;
  214.     }
  215.  
  216.     public int getRating() {
  217.         return rating;
  218.     }
  219.  
  220.     public String getUser() {
  221.         return user;
  222.     }
  223.  
  224. }
  225.  
  226. class Artist implements  Serializable{
  227.     private String nome, grupo, genre, biography;
  228.     private String data_nasc; //TALVIZ CRIAR UMA CLASSE DATA
  229.     ArrayList <Music> music_list;
  230.  
  231.     private ArrayList <String> notificar = new ArrayList<>();
  232.  
  233.     public Artist(String nome, String grupo, String data_nasc, String genre, String biography, ArrayList <Music> music_list, ArrayList <String> notificar) {
  234.         this.nome = nome;
  235.         this.grupo = grupo;
  236.         this.data_nasc = data_nasc;
  237.         this.genre = genre;
  238.         this.biography = biography;
  239.         this.music_list = music_list;
  240.         this.notificar = notificar;
  241.     }
  242.  
  243.     public String getNome() {
  244.         return nome;
  245.     }
  246.  
  247.     public String getGrupo() {
  248.         return grupo;
  249.     }
  250.  
  251.     public String getData_nasc() {
  252.         return data_nasc;
  253.     }
  254.  
  255.     public String getGenre() {
  256.         return genre;
  257.     }
  258.  
  259.     public String getBiography() {
  260.         return biography;
  261.     }
  262.  
  263.     public ArrayList<Music> getMusic_list() {
  264.         return music_list;
  265.     }
  266.  
  267.     public void setNome(String nome) {
  268.         this.nome = nome;
  269.     }
  270.  
  271.     public void setGrupo(String grupo) {
  272.         this.grupo = grupo;
  273.     }
  274.  
  275.     public void setGenre(String genre) {
  276.         this.genre = genre;
  277.     }
  278.  
  279.     public void setBiography(String biography) {
  280.         this.biography = biography;
  281.     }
  282.  
  283.     public void setData_nasc(String data_nasc) {
  284.         this.data_nasc = data_nasc;
  285.     }
  286.  
  287.     public void setMusic_list(ArrayList<Music> music_list) {
  288.         this.music_list = music_list;
  289.     }
  290.  
  291.     public ArrayList<String> getNotificar() {
  292.         return notificar;
  293.     }
  294.  
  295.     public void setNotificar(ArrayList<String> notificar) {
  296.         this.notificar = notificar;
  297.     }
  298.  
  299. }
  300.  
  301. class Notification implements  Serializable{
  302.     private String username, message;
  303.  
  304.     public Notification(String username, String message) {
  305.         this.username = username;
  306.         this.message = message;
  307.     }
  308.  
  309.     public String getUsername() {
  310.         return username;
  311.     }
  312.  
  313.     public String getMessage() {
  314.         return message;
  315.     }
  316. }
  317.  
  318.  
  319. class Connection extends Thread {
  320.     DataInputStream in;
  321.     DataOutputStream out;
  322.     Socket clientSocket;
  323.     int thread_number;
  324.  
  325.     public Connection (Socket aClientSocket, int numero) {
  326.         thread_number = numero;
  327.         try{
  328.             clientSocket = aClientSocket;
  329.             in = new DataInputStream(clientSocket.getInputStream());
  330.             out = new DataOutputStream(clientSocket.getOutputStream());
  331.             this.start(); //chama o método run()
  332.         }catch(IOException e){System.out.println("Connection:" + e.getMessage());}
  333.     }
  334.     //=============================
  335.     public void run(){
  336.         String resposta;
  337.         try{
  338.             while(true){
  339.                 //an echo server
  340.                 String data = in.readUTF();
  341.                 System.out.println("T["+thread_number + "] Recebeu: "+data);
  342.                 //Alterado
  343.                 //resposta=data.toUpperCase();
  344.                 //out.writeUTF(data);
  345.             }
  346.         }catch(EOFException e){System.out.println("EOF:" + e);
  347.         }catch(IOException e){System.out.println("IO:" + e);}
  348.     } //multiplos do sector size, talvez 4k no meu computador
  349. }
  350.  
  351. class DatabaseConnection implements Serializable{
  352.     //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
  353.  
  354.     public DatabaseConnection() {
  355.     }
  356.  
  357.     boolean username_match (String username, int server_id){
  358.  
  359.         ArrayList <User> users = new ArrayList<>();
  360.  
  361.         //Abrir para a leitura do ficheiro de objetos
  362.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  363.             users = (ArrayList) oin.readObject();
  364.         } catch (IOException e){
  365.             System.out.println(e.getMessage());
  366.         } catch (ClassNotFoundException e) {
  367.             e.printStackTrace();
  368.         }
  369.  
  370.         for (User u: users){
  371.             if (u.getUsername().equals(username)) {
  372.                 return true;
  373.             }
  374.         }
  375.  
  376.         return false;
  377.     }
  378.  
  379.     boolean password_match (String username, String password, int server_id){
  380.         //Tenho que procurar por username e depois por password
  381.         //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
  382.  
  383.         ArrayList <User> users = new ArrayList<>();
  384.  
  385.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  386.             users = (ArrayList) oin.readObject();
  387.         } catch (IOException e){
  388.             System.out.println(e.getMessage());
  389.         } catch (ClassNotFoundException e) {
  390.             e.printStackTrace();
  391.         }
  392.  
  393.         for (User u: users) {
  394.             if (u.getUsername().equals(username)) {
  395.                 if (u.getPassword().equals(password)) {
  396.                     return true;
  397.                 }
  398.             }
  399.  
  400.         }
  401.         return false;
  402.     }
  403.  
  404.     void write_user_file(ArrayList <User> users, int server_id) { //Para escrever no ficheiro de utilizadores
  405.         try {
  406.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users" + server_id + "_obj.txt"));
  407.             oS.writeObject(users);
  408.             oS.close();
  409.  
  410.         } catch (IOException e) {
  411.             System.out.print("ERRO");
  412.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  413.         }
  414.     }
  415.  
  416.     ArrayList <Album> get_AlbumList (int server_id){
  417.         ArrayList <Album> album_list = new ArrayList<>();
  418.  
  419.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList" + server_id + "_obj.txt"))) {
  420.             album_list = (ArrayList) oin.readObject();
  421.         } catch (IOException e){
  422.             System.out.println(e.getMessage());
  423.         } catch (ClassNotFoundException e) {
  424.             e.printStackTrace();
  425.         }
  426.  
  427.         return album_list;
  428.     }
  429.  
  430.     void write_albumlist_file (ArrayList <Album> album_list, int server_id) { //Para escrever no ficheiro de álbuns
  431.         try {
  432.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("AlbumList" + server_id + "_obj.txt"));
  433.             oS.writeObject(album_list);
  434.             oS.close();
  435.  
  436.         } catch (IOException e) {
  437.             System.out.print("ERRO");
  438.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  439.         }
  440.     }
  441.  
  442.     void write_artislist_file (ArrayList <Artist> artist_list, int server_id) {
  443.  
  444.         try {
  445.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("ArtistList" + server_id + "_obj.txt"));
  446.             oS.writeObject(artist_list);
  447.             oS.close();
  448.  
  449.         } catch (IOException e) {
  450.             System.out.print("ERRO");
  451.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  452.         }
  453.     }
  454.  
  455.     void write_musiclist_file (ArrayList <Music> music_list, int server_id){
  456.         try {
  457.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("MusicList" + server_id +"_obj.txt"));
  458.             oS.writeObject(music_list);
  459.             oS.close();
  460.  
  461.         } catch (IOException e) {
  462.             System.out.print("ERRO");
  463.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  464.         }
  465.  
  466.     }
  467.  
  468.     ArrayList <Music> get_MusicList (int server_id){
  469.         ArrayList <Music> music_list = new ArrayList<>();
  470.  
  471.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("MusicList" + server_id + "_obj.txt"))) {
  472.             music_list = (ArrayList) oin.readObject();
  473.         } catch (IOException e){
  474.             System.out.println(e.getMessage());
  475.         } catch (ClassNotFoundException e) {
  476.             e.printStackTrace();
  477.         }
  478.  
  479.         return music_list;
  480.     }
  481.  
  482.     ArrayList <Artist> get_ArtistList (int server_id){
  483.         ArrayList <Artist> artist_list = new ArrayList<>();
  484.  
  485.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("ArtistList" + server_id + "_obj.txt"))) {
  486.             artist_list = (ArrayList) oin.readObject();
  487.         } catch (IOException e){
  488.             System.out.println(e.getMessage());
  489.         } catch (ClassNotFoundException e) {
  490.             e.printStackTrace();
  491.         }
  492.  
  493.         return artist_list;
  494.     }
  495.  
  496.     ArrayList <User> get_UserList (int server_id){
  497.         ArrayList <User> user_list = new ArrayList<>();
  498.  
  499.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  500.             user_list = (ArrayList) oin.readObject();
  501.         } catch (IOException e){
  502.             System.out.println(e.getMessage());
  503.         } catch (ClassNotFoundException e) {
  504.             e.printStackTrace();
  505.         }
  506.  
  507.         return user_list;
  508.     }
  509.  
  510.     void write_notifications_file (ArrayList <Notification> notific_list, int server_id){
  511.         try {
  512.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("NotificList" + server_id + "_obj.txt"));
  513.             oS.writeObject(notific_list);
  514.             oS.close();
  515.  
  516.         } catch (IOException e) {
  517.             System.out.print("ERRO");
  518.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  519.         }
  520.  
  521.  
  522.     }
  523.  
  524.     ArrayList <Notification> get_NotificationList (int server_id){
  525.         ArrayList <Notification> notific_list = new ArrayList<>();
  526.  
  527.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("NotificList" + server_id + "_obj.txt"))) {
  528.             notific_list = (ArrayList) oin.readObject();
  529.         } catch (IOException e){
  530.             System.out.println(e.getMessage());
  531.         } catch (ClassNotFoundException e) {
  532.             e.printStackTrace();
  533.         }
  534.  
  535.         return notific_list;
  536.     }
  537.  
  538.     String check (String user, int server_id){
  539.         ArrayList <Notification> not_list = get_NotificationList(server_id);
  540.  
  541.         Iterator <Notification> iter = not_list.iterator();
  542.  
  543.         String send = "";
  544.         int conta = 0;
  545.         for (Notification n: not_list){
  546.             if (n.getUsername().equals(user)){
  547.                 send = send + "item_" + conta +"_name|" +  n.getMessage() + ";";
  548.                 conta++;
  549.             }
  550.         }
  551.  
  552.         while (iter.hasNext()) {
  553.             if(iter.next().getUsername().equals(user)){
  554.                 iter.remove();
  555.             }
  556.         }
  557.  
  558.         write_notifications_file(not_list, server_id); //Vai escrever o novo arraylist no ficheiro de objetos
  559.  
  560.         return send;
  561.     }
  562.  
  563. }
  564.  
  565. class AutoMessage extends Thread{
  566.  
  567.     private int id_server;
  568.     private MulticastSocket socket;
  569.     private String MULTICAST_ADDRESS = "224.3.2.1";
  570.  
  571.     public AutoMessage (int id_server, MulticastSocket socket) throws UnknownHostException {
  572.         this.id_server = id_server;
  573.         this.socket = socket;
  574.     }
  575.  
  576.     public void run() {
  577.         String automsg = "pack_id|0;" + "server_id|" +id_server;
  578.  
  579.         while (true) {
  580.             try{
  581.                 byte[] buffer = automsg.getBytes();
  582.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), 4444);
  583.                 socket.send(packet);
  584.             } catch (UnknownHostException e) {
  585.                 e.printStackTrace();
  586.             } catch (IOException e) {
  587.                 e.printStackTrace();
  588.             }
  589.  
  590.             try {
  591.                 sleep((long)(5000));
  592.             } catch (InterruptedException e) {
  593.             }
  594.  
  595.         }
  596.     }
  597. }
  598.  
  599. class RedundantAnswer extends Thread {
  600.  
  601.     private String message;
  602.     private int server_id;
  603.  
  604.     MessageParsing parsing = new MessageParsing();
  605.     DatabaseConnection data = new DatabaseConnection();
  606.  
  607.     public RedundantAnswer (String message, int server_id) {
  608.         this.message = message;
  609.         this.server_id = server_id;
  610.     }
  611.  
  612.     void register (String username, String password, int server_id) {
  613.  
  614.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  615.         //Abrir para a leitura do ficheiro de objetos
  616.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  617.             users = (ArrayList) oin.readObject();
  618.         } catch (IOException e){
  619.             System.out.println(e.getMessage());
  620.         } catch (ClassNotFoundException e) {
  621.             e.printStackTrace();
  622.         }
  623.  
  624.         //Temos que ver se existe o username ou não
  625.         if (!data.username_match(username, server_id)) {
  626.  
  627.             //Abrir para escrita no ficheiro de objetos
  628.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  629.                 User u = new User(username, password, "admin");
  630.                 users.add(u);
  631.             }
  632.             else{
  633.                 User u = new User(username, password, "normal");
  634.                 users.add(u);
  635.             }
  636.  
  637.             try {
  638.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users" + server_id +"_obj.txt"));
  639.                 oS.writeObject(users);
  640.                 oS.close();
  641.  
  642.             } catch (IOException e) {
  643.                 System.out.print("ERRO");
  644.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  645.             }
  646.  
  647.             System.out.println("Registo bem sucedido");
  648.         }
  649.  
  650.         else {
  651.             System.out.println("esse username ja existe");
  652.         }
  653.  
  654.         //SÓ PARA VER QUEM TENHO REGISTADO
  655.         /*for (User uss: users){
  656.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  657.         }*/
  658.  
  659.  
  660.     }
  661.  
  662.     void make_editor (String username, String novo_editor, int server_id){
  663.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  664.  
  665.         ArrayList <User> users = new ArrayList<>();
  666.  
  667.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  668.             users = (ArrayList) oin.readObject();
  669.         } catch (IOException e){
  670.             System.out.println(e.getMessage());
  671.         } catch (ClassNotFoundException e) {
  672.             e.printStackTrace();
  673.         }
  674.  
  675.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  676.         if (data.username_match(username, server_id)) { //SUCESSO
  677.             for (User u : users) {
  678.                 if (u.getUsername().equals(username)) {
  679.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) { //SE TEM PERMISSAO -> CONDICAO 1
  680.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  681.                         for (User us : users) {
  682.                             if (us.getUsername().equals(novo_editor)) {
  683.                                 us.setUser_type("editor");
  684.                                 data.write_user_file(users, server_id);
  685.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  686.                                 System.out.println("You can edito now");
  687.                             }
  688.                         }
  689.                     }
  690.                     else{ //SE NAO TEM PERMISSAO -> CONDICAO 2
  691.                         System.out.println("You don't have permission to perform this operation");
  692.                     }
  693.                 }
  694.             }
  695.  
  696.         }
  697.  
  698.         ArrayList <String> test = new ArrayList<>();
  699.         for (User u: users){
  700.             test.add(u.getUsername());
  701.         }
  702.  
  703.         if (!test.contains(novo_editor)){
  704.             System.out.println("The person you entered was not found");
  705.         }
  706.     }
  707.  
  708.     void add (String user, String text, int server_id){
  709.         ArrayList <Notification> n_list = data.get_NotificationList(server_id);
  710.         Notification notif = new Notification(user, text);
  711.         n_list.add(notif);
  712.  
  713.         data.write_notifications_file(n_list, server_id);
  714.  
  715.         System.out.println("Notification added to the list");
  716.     }
  717.  
  718.     void album_review (String user, String album_title, String rating, String text, int server_id){ //TESTAR
  719.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  720.  
  721.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  722.         ArrayList <Album> album_list = data.get_AlbumList(server_id);
  723.         Review r = new Review(text, Integer.parseInt(rating), user);
  724.  
  725.         for (Album a: album_list) {
  726.             if (a.getAlbum_name().equals(album_title)) {
  727.                 a.getReview_list().add(r); //Adicionar a review à lista de reviews
  728.                 data.write_albumlist_file(album_list, server_id);
  729.  
  730.                 System.out.println("Your review was submitted");
  731.             }
  732.         }
  733.  
  734.         ArrayList<String> aux = new ArrayList<>();
  735.  
  736.         for (Album a: album_list) {
  737.             aux.add(a.getAlbum_name());
  738.         }
  739.  
  740.         if (!aux.contains(album_title)){//ÁLBUM NÃO CONSTA DA BASE DE DADOS
  741.             System.out.println("The selected album is not in our database");
  742.         }
  743.  
  744.     }
  745.  
  746.     void manage_data (String username, String choice, String search_name, String op_type, String field_type, String name, int server_id) {
  747.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  748.  
  749.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  750.         ArrayList<User> users = data.get_UserList(server_id);
  751.  
  752.         ArrayList<Artist> artist_list = data.get_ArtistList(server_id);
  753.         ArrayList<Album> album_list = data.get_AlbumList(server_id);
  754.         ArrayList<Music> music_list = data.get_MusicList(server_id);
  755.  
  756.         if (data.username_match(username, server_id)) { //SUCESSO
  757.             for (User u : users) {
  758.                 if (u.getUsername().equals(username)) {
  759.                     if (u.getUser_type().equals("editor") || u.getUser_type().equals("admin")) {
  760.                         System.out.println("Tem permissao para editar");
  761.  
  762.                         switch (choice) {
  763.                             case "artist": /*-------------------------ARTIST--------------------------*/
  764.                                 String artist_name = search_name;
  765.                                 switch (op_type){
  766.                                     case "insert": /*-*************INSERT***************PARECE ESTAR BEM**/
  767.  
  768.                                         String [] artist_details = name.split("-");
  769.                                         String grupo = artist_details[0];
  770.                                         String data_nasc = artist_details[1];
  771.                                         String genre = artist_details[2];
  772.                                         String biography = artist_details[3];
  773.                                         String music_counter = artist_details[4];
  774.  
  775.                                         ArrayList <Music> aux_musiclist = new ArrayList<>();
  776.                                         Artist new_artist;
  777.                                         ArrayList <String> allowed_users = new ArrayList<>();
  778.                                         ArrayList <Music> music_i = new ArrayList<>();
  779.                                         ArrayList <String> to_notify = new ArrayList<>();
  780.                                         to_notify.add(username);
  781.  
  782.                                         if (Integer.parseInt(music_counter) != 0) {
  783.                                             for (int j = 5; j < artist_details.length; j++) {
  784.                                                 Music m = new Music("", "", "", artist_details[j], 0, "no", allowed_users);
  785.                                                 aux_musiclist.add(m);
  786.                                                 music_list.add(m); //PORQUE TAMBÉM TEMOS QUE MANDAR AS MÚSICAS PARA O FICHEIRO DE MÚSICAS
  787.                                             }
  788.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, aux_musiclist, to_notify);
  789.                                         }
  790.                                         else{
  791.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, music_i, to_notify);
  792.                                         }
  793.                                         artist_list.add(new_artist);
  794.                                         data.write_artislist_file(artist_list, server_id);
  795.                                         data.write_musiclist_file(music_list, server_id);
  796.  
  797.                                         System.out.println("Artist added");
  798.                                         break;
  799.  
  800.                                     case "change": /*-*************CHANGE**************ACHO QUE ESTA BEM, SO FALTA O CHANGE MUSIC LIST***/
  801.                                         switch (field_type) {
  802.                                             case "name":
  803.                                                 for (Artist a: artist_list){
  804.                                                     if (a.getNome().equals(artist_name)){
  805.                                                         a.setNome(name);
  806.                                                     }
  807.                                                 }
  808.                                                 data.write_artislist_file(artist_list, server_id);
  809.                                                 break;
  810.  
  811.                                             case "grupo":
  812.                                                 for (Artist a: artist_list){
  813.                                                     if (a.getNome().equals(artist_name)){
  814.                                                         a.setGrupo(name);
  815.                                                     }
  816.                                                 }
  817.                                                 data.write_artislist_file(artist_list, server_id);
  818.                                                 break;
  819.  
  820.                                             case "genre":
  821.                                                 for (Artist a: artist_list){
  822.                                                     if (a.getNome().equals(artist_name)){
  823.                                                         a.setGenre(name);
  824.                                                     }
  825.                                                 }
  826.                                                 data.write_artislist_file(artist_list, server_id);
  827.                                                 break;
  828.  
  829.                                             case "biography":
  830.                                                 for (Artist a: artist_list){
  831.                                                     if (a.getNome().equals(artist_name)){
  832.                                                         a.setBiography(name);
  833.                                                         a.getNotificar().add(username);
  834.                                                     }
  835.                                                 }
  836.                                                 data.write_artislist_file(artist_list, server_id);
  837.                                                 System.out.println("Artist biography changed");
  838.                                                 break;
  839.  
  840.                                             case "data_nasc":
  841.                                                 for (Artist a: artist_list){
  842.                                                     if (a.getNome().equals(artist_name)){
  843.                                                         a.setData_nasc(name);
  844.                                                     }
  845.                                                 }
  846.                                                 data.write_artislist_file(artist_list, server_id);
  847.                                                 break;
  848.                                             case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS
  849.  
  850.                                                 //Depois tenho que guardar num ficheiro a alteracao feita
  851.                                                 //data.write_artislist_file(artist_list, server_id);
  852.                                                 break;
  853.                                         }
  854.  
  855.                                         System.out.println("Artist info changed");
  856.                                         break;
  857.  
  858.                                     case "remove": /*-*************REMOVE*****************/
  859.                                         for (Artist a: artist_list){
  860.                                             if(a.getNome().equals(artist_name)){
  861.                                                 artist_list.remove(a);
  862.                                             }
  863.                                         }
  864.                                         //Acho que e assim fora do ciclo que tem que estar
  865.                                         data.write_artislist_file(artist_list, server_id);
  866.  
  867.                                         System.out.println("Artist removed");
  868.  
  869.                                         break;
  870.                                 }
  871.                                 break;
  872.  
  873.                             case "album": /*-------------------------ALBUM-------------------------ACHO QUE ESTA BEM, SO FALTA O CHANGE MUSIC LIST-*/
  874.                                 String album_title = search_name;
  875.                                 switch (op_type) {
  876.                                     case "insert":
  877.                                         String [] album_details = name.split("-");
  878.                                         String artist = album_details[0];
  879.                                         String description = album_details[1];
  880.                                         String music_counter = album_details[2];
  881.  
  882.                                         ArrayList <Music> aux_music = new ArrayList<>();
  883.                                         Album new_album;
  884.  
  885.                                         //Duas arraylists apenas inicializadas para não estrabuchar
  886.                                         ArrayList <Music> music_i = new ArrayList<>();
  887.                                         ArrayList <Review> review_i = new ArrayList<>();
  888.  
  889.                                         ArrayList <String> allowed_users = new ArrayList<>();
  890.                                         ArrayList <String> user_notify = new ArrayList<>();
  891.                                         user_notify.add(username);
  892.  
  893.                                         if (Integer.parseInt(music_counter) != 0) {
  894.                                             for (int j = 3; j < album_details.length; j++) {
  895.                                                 Music m = new Music("", "", "", album_details[j], 0, "no", allowed_users);
  896.                                                 aux_music.add(m);
  897.                                                 music_list.add(m);
  898.                                             }
  899.                                             new_album = new Album(album_title, artist, description, 0, aux_music, review_i, user_notify);
  900.                                         }
  901.                                         else{
  902.                                             new_album = new Album(album_title, artist, description, 0, music_i, review_i, user_notify);
  903.                                         }
  904.                                         album_list.add(new_album);
  905.                                         data.write_albumlist_file(album_list, server_id);
  906.                                         data.write_musiclist_file(music_list, server_id);
  907.  
  908.                                         System.out.println("Album added");
  909.                                         break;
  910.  
  911.                                     case "change":
  912.                                         switch (field_type) {
  913.                                             case "album name":
  914.                                                 for (Album a : album_list) {
  915.                                                     if (a.getAlbum_name().equals(album_title)) {
  916.                                                         a.setAlbum_name(name);
  917.                                                     }
  918.                                                 }
  919.                                                 data.write_albumlist_file(album_list, server_id);
  920.                                                 break;
  921.  
  922.                                             case "description":
  923.                                                 for (Album a : album_list) {
  924.                                                     if (a.getAlbum_name().equals(album_title)) {
  925.                                                         a.setDescription(name);
  926.                                                         a.getNot_others().add(username);
  927.                                                     }
  928.                                                 }
  929.                                                 data.write_albumlist_file(album_list, server_id);
  930.                                                 System.out.println("Album description changed");
  931.                                                 break;
  932.  
  933.                                             case "artist":
  934.                                                 for (Album a : album_list) {
  935.                                                     if (a.getAlbum_name().equals(album_title)) {
  936.                                                         a.setArtist(name);
  937.                                                     }
  938.                                                 }
  939.                                                 data.write_albumlist_file(album_list, server_id);
  940.                                                 break;
  941.  
  942.                                             case "music list": //DUVIDA //MUDO O QUÊ???????????????????????????
  943.                                                 ArrayList <String> allowed_userss = new ArrayList<>();
  944.                                                 for (Album a : album_list) {
  945.                                                     if (a.getAlbum_name().equals(album_title)) {
  946.                                                         Music m = new Music(null, null, null, name, 0, "no", allowed_userss); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
  947.                                                         a.getMusic_list().add(m);
  948.                                                     }
  949.                                                 }
  950.                                                 //se for para manter, depois tenho que gravar as alteracoes
  951.                                                 //data.write_albumlist_file(album_list, server_id);
  952.                                                 break;
  953.                                         }
  954.                                         System.out.println("Album info changed");
  955.                                         break;
  956.  
  957.                                     case "remove":
  958.                                         for (Album a: album_list){
  959.                                             if (a.getAlbum_name().equals(album_title)){
  960.                                                 album_list.remove(a);
  961.                                             }
  962.                                         }
  963.                                         //Acho que tem que ser fora do ciclo
  964.                                         data.write_albumlist_file(album_list, server_id);
  965.  
  966.                                         System.out.println("Album removed");
  967.                                         break;
  968.                                 }
  969.                                 break;
  970.  
  971.                             case "music": /*-------------------------MUSIC--------------------------*/
  972.                                 String music_name = search_name;
  973.                                 switch (op_type) {
  974.                                     case "insert":
  975.                                         String [] music_details = name.split("-");
  976.                                         String artist = music_details[0];
  977.                                         String genre = music_details[1];
  978.                                         String album = music_details[2];
  979.                                         String duration = music_details[3];
  980.  
  981.                                         ArrayList <String> allowed_users = new ArrayList<>();
  982.                                         //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
  983.                                         //A duracao com : faz isto estrabuchar
  984.                                         Music m = new Music(artist, genre, album, music_name, Integer.parseInt(duration), "no", allowed_users);
  985.                                         music_list.add(m);
  986.                                         data.write_musiclist_file(music_list, server_id);
  987.  
  988.                                         System.out.println("Music added");
  989.                                         break;
  990.  
  991.                                     case "change":
  992.                                         switch (field_type) {
  993.                                             case "name":
  994.                                                 for (Music mu : music_list) {
  995.                                                     if(mu.getName().equals(music_name)){
  996.                                                         mu.setName(name);
  997.                                                     }
  998.                                                 }
  999.                                                 data.write_musiclist_file(music_list, server_id);
  1000.                                                 break;
  1001.  
  1002.                                             case "genre":
  1003.                                                 for (Music mu : music_list) {
  1004.                                                     if(mu.getName().equals(music_name)){
  1005.                                                         mu.setGenre(name);
  1006.                                                     }
  1007.                                                 }
  1008.                                                 data.write_musiclist_file(music_list, server_id);
  1009.                                                 break;
  1010.  
  1011.                                             case "artist":
  1012.                                                 for (Music mu : music_list) {
  1013.                                                     if(mu.getName().equals(music_name)){
  1014.                                                         mu.setArtist(name);
  1015.                                                     }
  1016.                                                 }
  1017.                                                 data.write_musiclist_file(music_list, server_id);
  1018.                                                 break;
  1019.  
  1020.                                             case "duration":
  1021.                                                 for (Music mu : music_list) {
  1022.                                                     if(mu.getName().equals(music_name)){
  1023.                                                         mu.setDuration(Integer.parseInt(name));
  1024.                                                     }
  1025.                                                 }
  1026.                                                 data.write_musiclist_file(music_list, server_id);
  1027.                                                 break;
  1028.  
  1029.                                             case "album":
  1030.                                                 for (Music mu : music_list) {
  1031.                                                     if(mu.getName().equals(music_name)){
  1032.                                                         mu.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
  1033.                                                     }
  1034.                                                 }
  1035.                                                 data.write_musiclist_file(music_list, server_id);
  1036.                                                 break;
  1037.                                         }
  1038.  
  1039.                                         System.out.println("Music info changed");
  1040.                                         break;
  1041.  
  1042.                                     case "remove":
  1043.                                         for (Music mu: music_list){
  1044.                                             if (mu.getName().equals(music_name)){
  1045.                                                 music_list.remove(mu);
  1046.                                             }
  1047.                                         }
  1048.                                         data.write_musiclist_file(music_list, server_id);
  1049.  
  1050.                                         System.out.println("Music removed");
  1051.                                         break;
  1052.                                 }
  1053.                                 break;
  1054.  
  1055.                         }
  1056.                     }
  1057.                 }
  1058.             }
  1059.         }
  1060.     }
  1061.  
  1062.     public void run(){
  1063.         //Parsing da mensagem
  1064.         String [] pares = parsing.MessageParsing(message);
  1065.         String type = pares[2];
  1066.  
  1067.         switch (type) {
  1068.             case "make editor":
  1069.                 String username = pares[3];
  1070.                 String new_editor = pares[4];
  1071.                 make_editor(username, new_editor, server_id); //EDITOR
  1072.                 break;
  1073.  
  1074.             case "register":
  1075.                 register(pares[3], pares[4], server_id);
  1076.                 break;
  1077.  
  1078.             case "edit info":
  1079.                 String user = pares[3];
  1080.                 String search = pares[4];
  1081.                 String search_name = pares[5];
  1082.                 String op_type = pares[6];
  1083.                 String field_type = pares[7];
  1084.                 String msg = pares[8];
  1085.                 manage_data(user, search, search_name, op_type, field_type, msg, server_id); //EDITOR
  1086.                 break;
  1087.  
  1088.             case "review":
  1089.                 String userr = pares[3];
  1090.                 String album_name = pares[4];
  1091.                 String rating = pares[5];
  1092.                 String review_text = pares[6];
  1093.                 album_review(userr, album_name, rating, review_text, server_id); //ANY USER
  1094.                 break;
  1095.  
  1096.             /*case "share music": //DEPOIS
  1097.                 String Uuser = pares[3];
  1098.                 String musicc = pares[4];
  1099.                 //String counter = pares[5]; //ACHO QUE NAO VOU PRECISAR DISTO PARA NADA
  1100.                 ArrayList <String> lista = new ArrayList<>();
  1101.                 for (int j = 6; j < pares.length; j++){
  1102.                     lista.add(pares[j]);
  1103.                 }
  1104.                 share_music(Uuser, musicc, lista, server_id);
  1105.                 break;*/
  1106.  
  1107.             case "add":
  1108.                 String us = pares[3];
  1109.                 String txt = pares[4];
  1110.                 add(us, txt, server_id);
  1111.                 break;
  1112.  
  1113.             default:
  1114.                 System.out.println("Esta funcao nao e de escrita, logo nao vou fazer nada");
  1115.                 break;
  1116.         }
  1117.  
  1118.  
  1119.  
  1120.  
  1121.     }
  1122.  
  1123. }
  1124.  
  1125. class MessageParsing{
  1126.  
  1127.     public String [] MessageParsing (String message){
  1128.  
  1129.         //Separar por ";" e saber o número de pares
  1130.         String [] pares  = message.split(";");
  1131.         String  [] campos = new String[pares.length] ;
  1132.  
  1133.         //if (pares.length >= 3){ //NAO SEI SE PRECISO DESTA CONDICAO OU NAO, TENHO QUE TER ATENCAO POR CAUSA DA EXCEPTION
  1134.             for (int i = 0; i < pares.length; i++){
  1135.                 String [] aux = pares[i].split("\\|");
  1136.                 campos[i] = aux[1];
  1137.             }
  1138.         //}
  1139.  
  1140.         //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
  1141.         //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
  1142.  
  1143.         return campos;
  1144.     }
  1145.  
  1146. }
  1147.  
  1148.  
  1149. class UDPMulticastProtocol implements Serializable {
  1150.  
  1151.     private static final long serialVersionUID = 123;
  1152.     private String MULTICAST_ADDRESS = "224.3.2.1";
  1153.     private int PORT = 4444; //Porto de envio
  1154.     DatabaseConnection data = new DatabaseConnection();
  1155.  
  1156.     public UDPMulticastProtocol() {
  1157.     }
  1158.  
  1159.     void login (String pack_id, String username, String password, MulticastSocket socket, int server_id){
  1160.         System.out.println("O cliente deseja fazer login");
  1161.         System.out.println("Username inserido: " + username);
  1162.         System.out.println("Password inserida: " + password);
  1163.         //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
  1164.  
  1165.  
  1166.         if (data.username_match(username, server_id)){
  1167.             if (data.password_match(username, password, server_id)){ //SUCESSO
  1168.  
  1169.                 /*JABARDICE
  1170.                 ArrayList <Notification> nots = data.get_NotificationList(server_id);
  1171.                 data.write_notifications_file(nots, server_id);
  1172.                 */
  1173.  
  1174.                 String notif = data.check(username, server_id); //Vai checkar se há notificações a ser entregues
  1175.  
  1176.                 String rsp = "pack_id|" + pack_id +  ";server_id|" + server_id + ";type|login" + ";username|" + username +";status|on; " + "notifications|" + notif;
  1177.  
  1178.                 try{
  1179.                     byte[] buffer = rsp.getBytes();
  1180.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1181.                     socket.send(packet);
  1182.                 } catch (IOException e) {
  1183.                     e.printStackTrace();
  1184.                 }
  1185.  
  1186.             }
  1187.             else { //PASSWORD ERRADA
  1188.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|login" + ";username|" + username + "; status|off; " + "msg|Password incorreta";
  1189.  
  1190.                 try{
  1191.                     byte[] buffer = rsp.getBytes();
  1192.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1193.                     socket.send(packet);
  1194.  
  1195.                 } catch (IOException e) {
  1196.                     e.printStackTrace();
  1197.                 }
  1198.             }
  1199.         }
  1200.  
  1201.         else{ //UTILIZADOR NAO EXISTE
  1202.             String rsp = "pack_id|" + pack_id +  ";server_id|" + server_id + "; type|login" + ";username|" + username + "; status|off; " + "msg|Utilizador nao existe";
  1203.  
  1204.             try{
  1205.                 byte[] buffer = rsp.getBytes();
  1206.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1207.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1208.                 socket.send(packet);
  1209.  
  1210.             } catch (IOException e) {
  1211.                 e.printStackTrace();
  1212.             }
  1213.         }
  1214.  
  1215.  
  1216.     }
  1217.  
  1218.     void register (String pack_id, String username, String password, MulticastSocket socket, int server_id) throws IOException {
  1219.  
  1220.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  1221.         //Abrir para a leitura do ficheiro de objetos
  1222.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  1223.             users = (ArrayList) oin.readObject();
  1224.         } catch (IOException e){
  1225.             System.out.println(e.getMessage());
  1226.         } catch (ClassNotFoundException e) {
  1227.             e.printStackTrace();
  1228.         }
  1229.  
  1230.         System.out.println("O cliente deseja registar-se");
  1231.         System.out.println("Username inserido: " + username);
  1232.         System.out.println("Password inserida: " + password);
  1233.  
  1234.         //Temos que ver se existe o username ou não
  1235.         if (!data.username_match(username, server_id)) {
  1236.  
  1237.             //Abrir para escrita no ficheiro de objetos
  1238.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  1239.                 User u = new User(username, password, "admin");
  1240.                 users.add(u);
  1241.             }
  1242.             else{
  1243.                 User u = new User(username, password, "normal");
  1244.                 users.add(u);
  1245.             }
  1246.  
  1247.             try {
  1248.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users" + server_id +"_obj.txt"));
  1249.                 oS.writeObject(users);
  1250.                 oS.close();
  1251.  
  1252.             } catch (IOException e) {
  1253.                 System.out.print("ERRO");
  1254.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  1255.             }
  1256.  
  1257.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|successful; " + "msg|Welcome to DropMusic";
  1258.             try{
  1259.                 byte[] buffer = rsp.getBytes();
  1260.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1261.                 socket.send(packet);
  1262.  
  1263.             } catch (IOException e) {
  1264.                 e.printStackTrace();
  1265.             }
  1266.         }
  1267.  
  1268.         else {
  1269.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|register;" + "; status|unsuccessful; " + "msg|Esse username ja existe";
  1270.  
  1271.             try{
  1272.                 byte[] buffer = rsp.getBytes();
  1273.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1274.                 socket.send(packet);
  1275.  
  1276.             } catch (IOException e) {
  1277.                 e.printStackTrace();
  1278.             }
  1279.         }
  1280.  
  1281.         //SÓ PARA VER QUEM TENHO REGISTADO
  1282.         for (User uss: users){
  1283.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  1284.         }
  1285.  
  1286.  
  1287.     }
  1288.  
  1289.     void search_music (String pack_id, String choice, String name, MulticastSocket socket, int server_id){ //TESTAR
  1290.         System.out.println("O cliente deseja procurar musica");
  1291.         ArrayList <Album> album_list = data.get_AlbumList(server_id); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  1292.         ArrayList <Music> music_list = data.get_MusicList(server_id);
  1293.         ArrayList <Artist> artist_list = data.get_ArtistList(server_id);
  1294.         ArrayList <Music> music_list1 = data.get_MusicList(server_id); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  1295.  
  1296.  
  1297.         switch (choice){
  1298.             case "all": //Vai procurar por tudo o que os outros "cases" vao procurar
  1299.                 int geral = 0;
  1300.  
  1301.                 String st1 = "";
  1302.                 int conta1 = 0;
  1303.  
  1304.                 for (Album a: album_list) {
  1305.                     if (a.getAlbum_name().equals(name)) {
  1306.                         int item_count = a.getMusic_list().size();
  1307.                         for (int k = 0; k < item_count; k++) {
  1308.                             st1 = st1 + "music_" + geral + "_name| " + a.getMusic_list().get(k).getName();
  1309.                             conta1++;
  1310.                             geral++;
  1311.                         }
  1312.                     }
  1313.                 }
  1314.  
  1315.                 String st2 = "";
  1316.                 int conta2 = 0;
  1317.                 for (Music m: music_list){
  1318.                     if (m.getName().equals(name)){
  1319.                         st2 = st2 +  "music_"+ geral +"_name| " + m.getName();
  1320.                         conta2++;
  1321.                         geral++;
  1322.                     }
  1323.                 }
  1324.  
  1325.                 String st3 = "";
  1326.                 int conta3 = 0;
  1327.  
  1328.                 for (Artist a: artist_list){
  1329.                     if (a.getNome().equals(name)){
  1330.                         for (int j = 0; j < a.getMusic_list().size(); j++){
  1331.                             st3 = st3 + "music_"+ geral +"_name| " + a.getMusic_list().get(j).getName();
  1332.                             conta3++;
  1333.                             geral++;
  1334.                         }
  1335.                     }
  1336.                 }
  1337.  
  1338.                 String st4 = "";
  1339.                 int conta4 = 0;
  1340.  
  1341.                 for (Music m: music_list1){
  1342.                     if (m.getGenre().equals(name)){
  1343.                         st4 = st4 + "item_"+ geral +"_name| " + m.getName();
  1344.                         conta4++;
  1345.                         geral++;
  1346.                     }
  1347.                 }
  1348.  
  1349.                 int total = conta1 + conta2 + conta3 + conta4;
  1350.  
  1351.                 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
  1352.                 try{
  1353.                     byte[] buffer = rsp_all.getBytes();
  1354.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1355.                     socket.send(packet);
  1356.                 } catch (IOException e) {
  1357.                     e.printStackTrace();
  1358.                 }
  1359.  
  1360.                 break;
  1361.  
  1362.             case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
  1363.                 String x = "";
  1364.                 int conta = 0;
  1365.  
  1366.                 for (Album a: album_list) {
  1367.                     if (a.getAlbum_name().equals(name)) {
  1368.                         int item_count = a.getMusic_list().size();
  1369.                         for (int k = 0; k < item_count; k++) {
  1370.                             x = x + "music_" + k + "_name| " + a.getMusic_list().get(k).getName();
  1371.                             conta++;
  1372.                         }
  1373.                     }
  1374.                 }
  1375.  
  1376.                 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
  1377.                 try{
  1378.                     byte[] buffer = rsp.getBytes();
  1379.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1380.                     socket.send(packet);
  1381.                 } catch (IOException e) {
  1382.                     e.printStackTrace();
  1383.                 }
  1384.                 break;
  1385.  
  1386.             case "music":  //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
  1387.                 String s = "";
  1388.                 int item_size = 0;
  1389.                 for (Music m: music_list){
  1390.                     if (m.getName().equals(name)){
  1391.                         s = s +  "music_"+item_size+"_name| " + m.getName();
  1392.                         item_size++;
  1393.                     }
  1394.                 }
  1395.  
  1396.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  1397.                 String ans = "pack_id|" + pack_id +  ";server_id|" + server_id + ";type|search music" + ";type|successful;" + "music_count|" + item_size + s;
  1398.                 try {
  1399.                     byte[] buffer = ans.getBytes();
  1400.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1401.                     socket.send(packet);
  1402.                 } catch (IOException e) {
  1403.                     e.printStackTrace();
  1404.                 }
  1405.                 break;
  1406.  
  1407.             case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
  1408.                 String z = "";
  1409.                 int tam = 0;
  1410.  
  1411.                 for (Artist a: artist_list){
  1412.                     if (a.getNome().equals(name)){
  1413.                         for (int j = 0; j < a.getMusic_list().size(); j++){
  1414.                             z = z + "music_"+ j +"_name| " + a.getMusic_list().get(j).getName();
  1415.                             tam++;
  1416.                         }
  1417.                     }
  1418.                 }
  1419.  
  1420.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  1421.                 String resp = "pack_id|" + pack_id +  ";server_id|" + server_id + ";type|status;" + "music_search|successful; " + "music_count|" + tam + z;
  1422.                 try {
  1423.                     byte[] buffer = resp.getBytes();
  1424.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1425.                     socket.send(packet);
  1426.                 } catch (IOException e) {
  1427.                     e.printStackTrace();
  1428.                 }
  1429.                 break;
  1430.  
  1431.             case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
  1432.                 String aux = "";
  1433.                 int counter = 0;
  1434.  
  1435.                 for (Music m: music_list1){
  1436.                     if (m.getGenre().equals(name)){
  1437.                         aux = aux + "item_"+ counter +"_name| " + m.getName();
  1438.                         counter++;
  1439.                     }
  1440.                 }
  1441.  
  1442.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  1443.                 String envia = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "music_count|" + counter + aux;
  1444.                 try {
  1445.                     byte[] buffer = envia.getBytes();
  1446.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1447.                     socket.send(packet);
  1448.                 } catch (IOException e) {
  1449.                     e.printStackTrace();
  1450.                 }
  1451.                 break;
  1452.  
  1453.         }
  1454.  
  1455.     }
  1456.  
  1457.     void make_editor (String pack_id, String username, String novo_editor, MulticastSocket socket, int server_id){
  1458.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  1459.  
  1460.         ArrayList <User> users = new ArrayList<>();
  1461.  
  1462.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users" + server_id + "_obj.txt"))) {
  1463.             users = (ArrayList) oin.readObject();
  1464.         } catch (IOException e){
  1465.             System.out.println(e.getMessage());
  1466.         } catch (ClassNotFoundException e) {
  1467.             e.printStackTrace();
  1468.         }
  1469.  
  1470.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  1471.         if (data.username_match(username, server_id)) { //SUCESSO
  1472.             for (User u : users) {
  1473.                 if (u.getUsername().equals(username)) {
  1474.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) { //SE TEM PERMISSAO -> CONDICAO 1
  1475.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  1476.                         for (User us : users) {
  1477.                             if (us.getUsername().equals(novo_editor)) {
  1478.                                 us.setUser_type("editor");
  1479.                                 data.write_user_file(users, server_id);
  1480.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  1481.                                 String rsp = "pack_id|" + pack_id +  ";server_id|" + server_id + ";type|make editor" + ";new_editor|" + novo_editor + ";status|successful; " + "msg|You can edit now";
  1482.                                 try {
  1483.                                     byte[] buffer = rsp.getBytes();
  1484.                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1485.                                     socket.send(packet);
  1486.                                 } catch (IOException e) {
  1487.                                     e.printStackTrace();
  1488.                                 }
  1489.                             }
  1490.                         }
  1491.                     }
  1492.                     else{ //SE NAO TEM PERMISSAO -> CONDICAO 2
  1493.                         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";
  1494.                         try {
  1495.                             byte[] buffer = rsp.getBytes();
  1496.                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1497.                             socket.send(packet);
  1498.                         } catch (IOException e) {
  1499.                             e.printStackTrace();
  1500.                         }
  1501.                     }
  1502.                 }
  1503.             }
  1504.  
  1505.         }
  1506.         /*
  1507.         else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
  1508.             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";
  1509.             try {
  1510.                 byte[] buffer = rsp.getBytes();
  1511.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1512.                 socket.send(packet);
  1513.             } catch (IOException e) {
  1514.                 e.printStackTrace();
  1515.             }
  1516.         }*/
  1517.  
  1518.         ArrayList <String> test = new ArrayList<>();
  1519.         for (User u: users){
  1520.             test.add(u.getUsername());
  1521.         }
  1522.  
  1523.         if (!test.contains(novo_editor)){
  1524.             try{ //CASO NAO SEJA ENCONTRADO A PESSOA QUE NÓS QUEREMOS NOMEAR COMO EDITOR
  1525.                 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";
  1526.                 byte[] buffer = rsp.getBytes();
  1527.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1528.                 socket.send(packet);
  1529.             } catch (IOException e) {
  1530.                 e.printStackTrace();
  1531.             }
  1532.         }
  1533.     }
  1534.  
  1535.     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
  1536.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  1537.  
  1538.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  1539.         ArrayList<User> users = data.get_UserList(server_id);
  1540.  
  1541.         ArrayList<Artist> artist_list = data.get_ArtistList(server_id);
  1542.         ArrayList<Album> album_list = data.get_AlbumList(server_id);
  1543.         ArrayList<Music> music_list = data.get_MusicList(server_id);
  1544.  
  1545.         if (data.username_match(username, server_id)) { //SUCESSO
  1546.             for (User u : users) {
  1547.                 if (u.getUsername().equals(username)) {
  1548.                     if (u.getUser_type().equals("editor") || u.getUser_type().equals("admin")) {
  1549.                         System.out.println("Tem permissao para editar");
  1550.  
  1551.                         switch (choice) {
  1552.                             case "artist": /*-------------------------ARTIST--------------------------*/
  1553.                                 String artist_name = search_name;
  1554.                                 switch (op_type){
  1555.                                     case "insert": /*-*************INSERT***************PARECE ESTAR BEM**/
  1556.  
  1557.                                         String [] artist_details = name.split("-");
  1558.                                         String grupo = artist_details[0];
  1559.                                         String data_nasc = artist_details[1];
  1560.                                         String genre = artist_details[2];
  1561.                                         String biography = artist_details[3];
  1562.                                         String music_counter = artist_details[4];
  1563.  
  1564.                                         ArrayList <Music> aux_musiclist = new ArrayList<>();
  1565.                                         Artist new_artist;
  1566.                                         ArrayList <String> allowed_users = new ArrayList<>();
  1567.                                         ArrayList <Music> music_i = new ArrayList<>();
  1568.                                         ArrayList <String> to_notify = new ArrayList<>();
  1569.                                         to_notify.add(username);
  1570.  
  1571.                                         if (Integer.parseInt(music_counter) != 0) {
  1572.                                             for (int j = 5; j < artist_details.length; j++) {
  1573.                                                 Music m = new Music("", "", "", artist_details[j], 0, "no", allowed_users);
  1574.                                                 aux_musiclist.add(m);
  1575.                                                 music_list.add(m); //PORQUE TAMBÉM TEMOS QUE MANDAR AS MÚSICAS PARA O FICHEIRO DE MÚSICAS
  1576.                                             }
  1577.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, aux_musiclist, to_notify);
  1578.                                         }
  1579.                                         else{
  1580.                                             new_artist = new Artist(artist_name, grupo, data_nasc, genre, biography, music_i, to_notify);
  1581.                                         }
  1582.                                         artist_list.add(new_artist);
  1583.                                         data.write_artislist_file(artist_list, server_id);
  1584.                                         data.write_musiclist_file(music_list, server_id);
  1585.  
  1586.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist added";
  1587.                                         try{
  1588.                                             byte[] buffer = rsp_client.getBytes();
  1589.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1590.                                             socket.send(packet);
  1591.  
  1592.                                         } catch (IOException e) {
  1593.                                             e.printStackTrace();
  1594.                                         }
  1595.                                         break;
  1596.  
  1597.                                     case "change": /*-*************CHANGE**************ACHO QUE ESTA BEM, SO FALTA O CHANGE MUSIC LIST***/
  1598.                                         switch (field_type) {
  1599.                                             case "name":
  1600.                                                 for (Artist a: artist_list){
  1601.                                                     if (a.getNome().equals(artist_name)){
  1602.                                                         a.setNome(name);
  1603.                                                     }
  1604.                                                 }
  1605.                                                 data.write_artislist_file(artist_list, server_id);
  1606.                                                 break;
  1607.  
  1608.                                             case "grupo":
  1609.                                                 for (Artist a: artist_list){
  1610.                                                     if (a.getNome().equals(artist_name)){
  1611.                                                         a.setGrupo(name);
  1612.                                                     }
  1613.                                                 }
  1614.                                                 data.write_artislist_file(artist_list, server_id);
  1615.                                                 break;
  1616.  
  1617.                                             case "genre":
  1618.                                                 for (Artist a: artist_list){
  1619.                                                     if (a.getNome().equals(artist_name)){
  1620.                                                         a.setGenre(name);
  1621.                                                     }
  1622.                                                 }
  1623.                                                 data.write_artislist_file(artist_list, server_id);
  1624.                                                 break;
  1625.  
  1626.                                             case "biography":
  1627.                                                 for (Artist a: artist_list){
  1628.                                                     if (a.getNome().equals(artist_name)){
  1629.                                                         a.setBiography(name);
  1630.                                                         a.getNotificar().add(username);
  1631.                                                     }
  1632.                                                 }
  1633.                                                 data.write_artislist_file(artist_list, server_id);
  1634.  
  1635.                                                 String rr = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist biography changed";
  1636.                                                 try{
  1637.                                                     byte[] buffer = rr.getBytes();
  1638.                                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1639.                                                     socket.send(packet);
  1640.                                                 } catch (IOException e) {
  1641.                                                     e.printStackTrace();
  1642.                                                 }
  1643.                                                 break;
  1644.  
  1645.                                             case "data_nasc":
  1646.                                                 for (Artist a: artist_list){
  1647.                                                     if (a.getNome().equals(artist_name)){
  1648.                                                         a.setData_nasc(name);
  1649.                                                     }
  1650.                                                 }
  1651.                                                 data.write_artislist_file(artist_list, server_id);
  1652.                                                 break;
  1653.                                             case "music list": //-----------------------------NAO FACO PUTO DE IDEIA, TENHO DÚVIDAS
  1654.  
  1655.                                                 //Depois tenho que guardar num ficheiro a alteracao feita
  1656.                                                 //data.write_artislist_file(artist_list, server_id);
  1657.                                                 break;
  1658.                                         }
  1659.  
  1660.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist info changed";
  1661.                                         try{
  1662.                                             byte[] buffer = r.getBytes();
  1663.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1664.                                             socket.send(packet);
  1665.  
  1666.                                         } catch (IOException e) {
  1667.                                             e.printStackTrace();
  1668.                                         }
  1669.                                         break;
  1670.  
  1671.                                     case "remove": /*-*************REMOVE*****************/
  1672.                                         for (Artist a: artist_list){
  1673.                                             if(a.getNome().equals(artist_name)){
  1674.                                                 artist_list.remove(a);
  1675.                                             }
  1676.                                         }
  1677.                                         //Acho que e assim fora do ciclo que tem que estar
  1678.                                         data.write_artislist_file(artist_list, server_id);
  1679.  
  1680.                                         String rr = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Artist removed";
  1681.                                         try{
  1682.                                             byte[] buffer = rr.getBytes();
  1683.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1684.                                             socket.send(packet);
  1685.                                         } catch (IOException e) {
  1686.                                             e.printStackTrace();
  1687.                                         }
  1688.  
  1689.                                         break;
  1690.                                 }
  1691.                                 break;
  1692.  
  1693.                             case "album": /*-------------------------ALBUM-------------------------ACHO QUE ESTA BEM, SO FALTA O CHANGE MUSIC LIST-*/
  1694.                                 String album_title = search_name;
  1695.                                 switch (op_type) {
  1696.                                     case "insert":
  1697.                                         String [] album_details = name.split("-");
  1698.                                         String artist = album_details[0];
  1699.                                         String description = album_details[1];
  1700.                                         String music_counter = album_details[2];
  1701.  
  1702.                                         ArrayList <Music> aux_music = new ArrayList<>();
  1703.                                         Album new_album;
  1704.  
  1705.                                         //Duas arraylists apenas inicializadas para não estrabuchar
  1706.                                         ArrayList <Music> music_i = new ArrayList<>();
  1707.                                         ArrayList <Review> review_i = new ArrayList<>();
  1708.  
  1709.                                         ArrayList <String> allowed_users = new ArrayList<>();
  1710.                                         ArrayList <String> user_notify = new ArrayList<>();
  1711.                                         user_notify.add(username);
  1712.  
  1713.                                         if (Integer.parseInt(music_counter) != 0) {
  1714.                                             for (int j = 3; j < album_details.length; j++) {
  1715.                                                 Music m = new Music("", "", "", album_details[j], 0, "no", allowed_users);
  1716.                                                 aux_music.add(m);
  1717.                                                 music_list.add(m);
  1718.                                             }
  1719.                                             new_album = new Album(album_title, artist, description, 0, aux_music, review_i, user_notify);
  1720.                                         }
  1721.                                         else{
  1722.                                             new_album = new Album(album_title, artist, description, 0, music_i, review_i, user_notify);
  1723.                                         }
  1724.                                         album_list.add(new_album);
  1725.                                         data.write_albumlist_file(album_list, server_id);
  1726.                                         data.write_musiclist_file(music_list, server_id);
  1727.  
  1728.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album added";
  1729.                                         try{
  1730.                                             byte[] buffer = rsp_client.getBytes();
  1731.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1732.                                             socket.send(packet);
  1733.                                         } catch (IOException e) {
  1734.                                             e.printStackTrace();
  1735.                                         }
  1736.                                         break;
  1737.  
  1738.                                     case "change":
  1739.                                         switch (field_type) {
  1740.                                             case "album name":
  1741.                                                 for (Album a : album_list) {
  1742.                                                     if (a.getAlbum_name().equals(album_title)) {
  1743.                                                         a.setAlbum_name(name);
  1744.                                                     }
  1745.                                                 }
  1746.                                                 data.write_albumlist_file(album_list, server_id);
  1747.                                                 break;
  1748.  
  1749.                                             case "description":
  1750.                                                 for (Album a : album_list) {
  1751.                                                     if (a.getAlbum_name().equals(album_title)) {
  1752.                                                         a.setDescription(name);
  1753.                                                         a.getNot_others().add(username);
  1754.                                                     }
  1755.                                                 }
  1756.                                                 data.write_albumlist_file(album_list, server_id);
  1757.  
  1758.                                                 String r1 = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album description changed";
  1759.                                                 try{
  1760.                                                     byte[] buffer = r1.getBytes();
  1761.                                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1762.                                                     socket.send(packet);
  1763.                                                 } catch (IOException e) {
  1764.                                                     e.printStackTrace();
  1765.                                                 }
  1766.                                                 break;
  1767.  
  1768.                                             case "artist":
  1769.                                                 for (Album a : album_list) {
  1770.                                                     if (a.getAlbum_name().equals(album_title)) {
  1771.                                                         a.setArtist(name);
  1772.                                                     }
  1773.                                                 }
  1774.                                                 data.write_albumlist_file(album_list, server_id);
  1775.                                                 break;
  1776.  
  1777.                                             case "music list": //DUVIDA //MUDO O QUÊ???????????????????????????
  1778.                                                 ArrayList <String> allowed_userss = new ArrayList<>();
  1779.                                                 for (Album a : album_list) {
  1780.                                                     if (a.getAlbum_name().equals(album_title)) {
  1781.                                                         Music m = new Music(null, null, null, name, 0, "no", allowed_userss); //POSSO MUDAR PARA UM CONSTRUTOR APENAS COM O CAMPO NOME
  1782.                                                         a.getMusic_list().add(m);
  1783.                                                     }
  1784.                                                 }
  1785.                                                 //se for para manter, depois tenho que gravar as alteracoes
  1786.                                                 //data.write_albumlist_file(album_list, server_id);
  1787.                                                 break;
  1788.                                         }
  1789.                                         String rsp_send = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album info changed";
  1790.                                         try{
  1791.                                             byte[] buffer = rsp_send.getBytes();
  1792.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1793.                                             socket.send(packet);
  1794.                                         } catch (IOException e) {
  1795.                                             e.printStackTrace();
  1796.                                         }
  1797.                                         break;
  1798.  
  1799.                                     case "remove":
  1800.                                         for (Album a: album_list){
  1801.                                             if (a.getAlbum_name().equals(album_title)){
  1802.                                                 album_list.remove(a);
  1803.                                             }
  1804.                                         }
  1805.                                         //Acho que tem que ser fora do ciclo
  1806.                                         data.write_albumlist_file(album_list, server_id);
  1807.  
  1808.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Album removed";
  1809.                                         try{
  1810.                                             byte[] buffer = r.getBytes();
  1811.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1812.                                             socket.send(packet);
  1813.                                         } catch (IOException e) {
  1814.                                             e.printStackTrace();
  1815.                                         }
  1816.                                         break;
  1817.                                 }
  1818.                                 break;
  1819.  
  1820.                             case "music": /*-------------------------MUSIC--------------------------*/
  1821.                                 String music_name = search_name;
  1822.                                 switch (op_type) {
  1823.                                     case "insert":
  1824.                                         String [] music_details = name.split("-");
  1825.                                         String artist = music_details[0];
  1826.                                         String genre = music_details[1];
  1827.                                         String album = music_details[2];
  1828.                                         String duration = music_details[3];
  1829.  
  1830.                                         ArrayList <String> allowed_users = new ArrayList<>();
  1831.                                         //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
  1832.                                         //A duracao com : faz isto estrabuchar
  1833.                                         Music m = new Music(artist, genre, album, music_name, Integer.parseInt(duration), "no", allowed_users);
  1834.                                         music_list.add(m);
  1835.                                         data.write_musiclist_file(music_list, server_id);
  1836.  
  1837.                                         String rsp_client = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music added";
  1838.                                         try{
  1839.                                             byte[] buffer = rsp_client.getBytes();
  1840.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1841.                                             socket.send(packet);
  1842.                                         } catch (IOException e) {
  1843.                                             e.printStackTrace();
  1844.                                         }
  1845.                                         break;
  1846.  
  1847.                                     case "change":
  1848.                                         switch (field_type) {
  1849.                                             case "name":
  1850.                                                 for (Music mu : music_list) {
  1851.                                                     if(mu.getName().equals(music_name)){
  1852.                                                         mu.setName(name);
  1853.                                                     }
  1854.                                                 }
  1855.                                                 data.write_musiclist_file(music_list, server_id);
  1856.                                                 break;
  1857.  
  1858.                                             case "genre":
  1859.                                                 for (Music mu : music_list) {
  1860.                                                     if(mu.getName().equals(music_name)){
  1861.                                                         mu.setGenre(name);
  1862.                                                     }
  1863.                                                 }
  1864.                                                 data.write_musiclist_file(music_list, server_id);
  1865.                                                 break;
  1866.  
  1867.                                             case "artist":
  1868.                                                 for (Music mu : music_list) {
  1869.                                                     if(mu.getName().equals(music_name)){
  1870.                                                         mu.setArtist(name);
  1871.                                                     }
  1872.                                                 }
  1873.                                                 data.write_musiclist_file(music_list, server_id);
  1874.                                                 break;
  1875.  
  1876.                                             case "duration":
  1877.                                                 for (Music mu : music_list) {
  1878.                                                     if(mu.getName().equals(music_name)){
  1879.                                                         mu.setDuration(Integer.parseInt(name));
  1880.                                                     }
  1881.                                                 }
  1882.                                                 data.write_musiclist_file(music_list, server_id);
  1883.                                                 break;
  1884.  
  1885.                                             case "album":
  1886.                                                 for (Music mu : music_list) {
  1887.                                                     if(mu.getName().equals(music_name)){
  1888.                                                         mu.setAlbum(name); //VER SE POSSO FAZER ASSIM OU SE TEM QUE SER UM ARRAYLIST ONDE TENHO QUE ADICIONAR O OBJETO
  1889.                                                     }
  1890.                                                 }
  1891.                                                 data.write_musiclist_file(music_list, server_id);
  1892.                                                 break;
  1893.                                         }
  1894.  
  1895.                                         String r1 = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music info changed";
  1896.                                         try{
  1897.                                             byte[] buffer = r1.getBytes();
  1898.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1899.                                             socket.send(packet);
  1900.                                         } catch (IOException e) {
  1901.                                             e.printStackTrace();
  1902.                                         }
  1903.                                         break;
  1904.  
  1905.                                     case "remove":
  1906.                                         for (Music mu: music_list){
  1907.                                             if (mu.getName().equals(music_name)){
  1908.                                                 music_list.remove(mu);
  1909.                                             }
  1910.                                         }
  1911.                                         data.write_musiclist_file(music_list, server_id);
  1912.  
  1913.                                         String r = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|edit info" + "; status|successful; " + "msg|Music removed";
  1914.                                         try{
  1915.                                             byte[] buffer = r.getBytes();
  1916.                                             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1917.                                             socket.send(packet);
  1918.                                         } catch (IOException e) {
  1919.                                             e.printStackTrace();
  1920.                                         }
  1921.                                         break;
  1922.                                 }
  1923.                                 break;
  1924.  
  1925.                         }
  1926.                     }
  1927.                 }
  1928.             }
  1929.         }
  1930.     }
  1931.  
  1932.     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
  1933.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  1934.  
  1935.         ArrayList <Album> show_albuns = data.get_AlbumList(server_id);
  1936.         ArrayList <Music> music_list = data.get_MusicList(server_id);
  1937.         ArrayList <Artist> artist_list = data.get_ArtistList(server_id);
  1938.  
  1939.         //1. Ver se a choice é album ou artista //E TALVEZ TAMBÉM MÚSICA
  1940.         switch (choice){
  1941.             case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
  1942.                     String info = ""; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1943.                     String lista_music = ";music_list:"; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1944.                     String lista_review = "review_list:"; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  1945.  
  1946.                     for (Album a: show_albuns){
  1947.                         if (a.getAlbum_name().equals(msg)){
  1948.                             info = info + "album_name|" + a.getAlbum_name() + ";artist_name|" +  a.getArtist() + ";description|" + a.getDescription() + ";average_rating|" + a.getRating();
  1949.                         }
  1950.                     }
  1951.  
  1952.                     for (Album a: show_albuns) {
  1953.                         if (a.getAlbum_name().equals(msg)) {
  1954.                             if (!a.getMusic_list().isEmpty()) {
  1955.                                 for (int j = 0; j < a.getMusic_list().size(); j++) {
  1956.                                     lista_music = lista_music + "item_" + j + "_name|" + a.getMusic_list().get(j).getName() + ";";
  1957.                                 }
  1958.                             }
  1959.                         }
  1960.                     }
  1961.  
  1962.                     for (Album a: show_albuns) {
  1963.                         if (a.getAlbum_name().equals(msg)) {
  1964.                             if (!a.getReview_list().isEmpty()) {
  1965.                                 for (int k = 0; k < a.getReview_list().size(); k++) {
  1966.                                     lista_review += "item_" + k + "_name;" + "user|" + a.getReview_list().get(k).getUser()+ ";rating|" + a.getReview_list().get(k).getRating() +
  1967.                                             ";review|" + a.getReview_list().get(k).getText();
  1968.                                 }
  1969.                             }
  1970.                         }
  1971.                     }
  1972.  
  1973.                     String answer = "pack_id|" + pack_id +  "; " + "server_id|" + server_id + "; " + info + lista_music + lista_review; //VER SE OBEDECE AO PROTOCOLO
  1974.                     //ENVIAR RESPOSTA PARA O CLIENTE
  1975.                     try {
  1976.                         byte[] buffer = answer.getBytes();
  1977.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  1978.                         socket.send(packet);
  1979.                     } catch (IOException e) {
  1980.                         e.printStackTrace();
  1981.                     }
  1982.  
  1983.                 break;
  1984.  
  1985.             case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
  1986.                     String msg_send = "";
  1987.                     String musicas = "";
  1988.  
  1989.                     for (Artist a : artist_list){
  1990.                         if (a.getNome().equals(msg)){
  1991.                             msg_send = msg_send + "group|" + a.getGrupo() + ";data_nasc|" + a.getData_nasc() + ";genre|" + a.getGenre() + ";biography|" + a.getBiography();
  1992.                         }
  1993.                     }
  1994.  
  1995.                     for (Artist a: artist_list) {
  1996.                         if (a.getNome().equals(msg)) {
  1997.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  1998.                                 musicas = musicas + "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  1999.                             }
  2000.                         }
  2001.                     }
  2002.  
  2003.                     String env_answer = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + "artist_info|" + msg_send + ";Music list|" +  musicas;
  2004.                     //ENVIAR RESPOSTA PARA O CLIENTE
  2005.                     try {
  2006.                         byte[] buffer = env_answer.getBytes();
  2007.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  2008.                         socket.send(packet);
  2009.                     } catch (IOException e) {
  2010.                         e.printStackTrace();
  2011.                     }
  2012.  
  2013.                 break;
  2014.  
  2015.             case "music":
  2016.                 String resp_aux = "";
  2017.  
  2018.                 for (Music m: music_list){
  2019.                     if (m.getName().equals(msg)){
  2020.                         resp_aux = resp_aux + "music_name|" + m.getName() + ";album_title|" + m.getAlbum_title() + ";genre|" + m.getGenre() +
  2021.                                 ";artist_name|" + m.getArtist() + ";duration|" + m.getDuration();
  2022.                     }
  2023.                 }
  2024.  
  2025.                 String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + resp_aux;
  2026.                 //ENVIAR RESPOSTA PARA O CLIENTE
  2027.                 try {
  2028.                     byte[] buffer = resp.getBytes();
  2029.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  2030.                     socket.send(packet);
  2031.                 } catch (IOException e) {
  2032.                     e.printStackTrace();
  2033.                 }
  2034.  
  2035.                 break;
  2036.         }
  2037.     }
  2038.  
  2039.     void album_review (String pack_id, String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
  2040.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  2041.  
  2042.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  2043.         ArrayList <Album> album_list = data.get_AlbumList(server_id);
  2044.         Review r = new Review(text, Integer.parseInt(rating), user);
  2045.  
  2046.         for (Album a: album_list) {
  2047.             if (a.getAlbum_name().equals(album_title)) {
  2048.                 a.getReview_list().add(r); //Adicionar a review à lista de reviews
  2049.                 data.write_albumlist_file(album_list, server_id);
  2050.  
  2051.                 String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|review" + "; status|successful; " + "msg|Your review was submitted";
  2052.                 try {
  2053.                     byte[] buffer = rsp.getBytes();
  2054.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  2055.                     socket.send(packet);
  2056.                 } catch (IOException e) {
  2057.                     e.printStackTrace();
  2058.                 }
  2059.             }
  2060.         }
  2061.  
  2062.         ArrayList<String> aux = new ArrayList<>();
  2063.  
  2064.         for (Album a: album_list) {
  2065.             aux.add(a.getAlbum_name());
  2066.         }
  2067.  
  2068.         if (!aux.contains(album_title)){//ÁLBUM NÃO CONSTA DA BASE DE DADOS
  2069.             String rsp = "pack_id|" + pack_id  + "; server_id|" + server_id + "; type|review" + "; status|unsuccessful; " + "msg|The selected album is not in our database";
  2070.             try {
  2071.                 byte[] buffer = rsp.getBytes();
  2072.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  2073.                 socket.send(packet);
  2074.             } catch (IOException e) {
  2075.                 e.printStackTrace();
  2076.             }
  2077.         }
  2078.  
  2079.     }
  2080.  
  2081.     void download (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  2082.         System.out.println("O cliente quer fazer download de uma música");
  2083.  
  2084.         String resp = "";
  2085.         String IP = "193.137.200.14" + server_id;
  2086.         int  porto = 80 + server_id;
  2087.  
  2088.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS
  2089.         ArrayList <Music> music_list = data.get_MusicList(server_id);
  2090.  
  2091.         for (Music m: music_list){
  2092.             if (m.getName().equals(music_name)){ //A MUSICA EXISTE NA BASE DE DADOS
  2093.                 //FALTA VERIFICAR SE TEM A FLAG "YES", OU SEJA, QUE EXISTE O FICHEIRO MP3 PARA QUE SEJA FEITO O DOWNLOAD----------------------------------------------------
  2094.                 for (int j = 0; j < m.getAllowed_users().size(); j++){
  2095.                     if (m.getAllowed_users().get(j).equals(user)){ //USER TEM PERMISSAO PARA FAZER DOWNLOAD DA MUSICA
  2096.                         resp = resp +  "pack_id|" + pack_id + ";server_id|" + server_id + ";username|" + user + ";type|download" +
  2097.                                 ";status|accepted; " + "porto|" + porto + ";ip|" + IP + ";msg|Download can start";
  2098.                     }
  2099.                 }
  2100.             }
  2101.         }
  2102.  
  2103.         int numero=0;
  2104.         try{
  2105.             int serverPort = porto;
  2106.             System.out.println("A Escuta no Porto " + porto);
  2107.             ServerSocket listenSocket = new ServerSocket(serverPort);
  2108.             //listenSocket.getLocalSocketAddress(); -> DEVE SER ASSIM QUE SE VAI ARRANJAR O ENDEREÇO IP PARA ENVIAR, MAS AINDA TENHO QUE CONFIRMAR
  2109.             System.out.println("LISTEN SOCKET="+listenSocket);
  2110.             while(true) {
  2111.                 Socket clientSocket = listenSocket.accept(); // BLOQUEANTE
  2112.                 System.out.println("CLIENT_SOCKET (created at accept())="+clientSocket);
  2113.                 numero ++;
  2114.                 new Connection(clientSocket, numero); //Thread para tratar de cada canal de comunicação com o cliente
  2115.             }
  2116.         }catch(IOException e)
  2117.         {System.out.println("Listen:" + e.getMessage());}
  2118.  
  2119.  
  2120.         //2. VER SE O UTILIZADOR TEM ACESSO A ESSA MÚSICA OU NÃO
  2121.  
  2122.         //3. SE AMBOS OS REQUISITOS SE CUMPRIREM
  2123.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  2124.  
  2125.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  2126.  
  2127.  
  2128.     }
  2129.  
  2130.     void upload (String pack_id, String user, String music_name, MulticastSocket socket, int server_id){ //EM FALTA
  2131.         System.out.println("O cliente quer fazer upload de uma música");
  2132.  
  2133.         String IP = "193.137.200.14" + server_id;
  2134.         int  porto = 80 + server_id;
  2135.  
  2136.         //String diretoria; //ESTA VARIAVEL SÓ INTERESSA AQUI DENTRO, QUE É PARA SABER ONDE VOU GUARDAR QUANDO FAÇO UPLOAD
  2137.  
  2138.         ArrayList <Music> music_list = data.get_MusicList(server_id);
  2139.  
  2140.         //1. VER SE A MÚSICA EXISTE NA BASE DE DADOS (SE JÁ ESTIVER, NÃO DEIXA ADICIONAR DE NOVO)
  2141.  
  2142.         /*for (Music m: music_list){
  2143.             if (m.getName().equals(music_name)){
  2144.                 //MUSICA JA EXISTE, MANDA RESPOSTA PARA CAGAR
  2145.             }*/
  2146.  
  2147.         //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)
  2148.             //R: TEMOS A STRING DIRETORIA CASO SEJA NECESSÁRIO
  2149.  
  2150.         //3. SE O REQUISITO 1 SE CUMPRIR
  2151.         //3.A. -> IR BUSCAR O PORTO E O ENDEREÇO IP DO SERVIDOR MULTICAST
  2152.  
  2153.         //3.B. -> CRIAR A SOCKET TCP E DEIXAR ABERTO À ESPERA DE UM ACCEPT PARA QUE O DOWNLOAD SEJA INICIADO
  2154.         int numero=0;
  2155.         try{
  2156.             int serverPort = porto;
  2157.             System.out.println("A Escuta no Porto " + porto);
  2158.             ServerSocket listenSocket = new ServerSocket(serverPort);
  2159.             System.out.println("LISTEN SOCKET="+listenSocket);
  2160.             while(true) {
  2161.                 Socket clientSocket = listenSocket.accept(); // BLOQUEANTE
  2162.                 System.out.println("CLIENT_SOCKET (created at accept())="+clientSocket);
  2163.                 numero ++;
  2164.                 new Connection(clientSocket, numero); //Thread para tratar de cada canal de comunicação com o cliente
  2165.             }
  2166.         }catch(IOException e)
  2167.         {System.out.println("Listen:" + e.getMessage());}
  2168.  
  2169.  
  2170.     }
  2171.  
  2172.     void share_music (String pack_id, String user, String music_name, ArrayList<String>user_list, MulticastSocket socket, int server_id){ //EM FALTA
  2173.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  2174.  
  2175.         //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
  2176.         //NA CLASSE MUSIC TENHO UM ARRAYLIST DE ALLOWED_USERS
  2177.         ArrayList <Music> music_list = data.get_MusicList(server_id);
  2178.         ArrayList <String> aux = new ArrayList<>();
  2179.  
  2180.         for (Music m: music_list){
  2181.             if (m.getName().equals(music_name)){ //MUSICA ENCONTRADA
  2182.                 if (m.getFlag().equals("yes")){ //MUSICA EXISTE E POR ISSO PODE SER PARTILHADA
  2183.                     for (int j = 0; j < m.getAllowed_users().size(); j++){
  2184.                         if (aux.get(j).equals(user)){ //O UTILIZADOR TEM ACESSO A ESSA MÚSICA
  2185.  
  2186.                         }
  2187.                     }
  2188.                 }
  2189.                 //aux = m.getAllowed_users();
  2190.             }
  2191.         }
  2192.  
  2193.         /*for (int j = 0; j < aux.size(); j++){
  2194.             if (aux.get(j).equals(user)){
  2195.                 //O utilizador tem acesso a essa música
  2196.             }
  2197.         }*/
  2198.  
  2199.         /*for (String u: user_list){
  2200.             aux.add(u);
  2201.         }*/
  2202.  
  2203.         for (Music m: music_list){
  2204.             if (m.getName().equals(music_name)){
  2205.                 m.setAllowed_users(aux);
  2206.             }
  2207.         }
  2208.  
  2209.         data.write_musiclist_file(music_list, server_id);
  2210.  
  2211.         //2. SE ESTE REQUISITO SE CUMPRIR, VOU AO ARRAYLIST DE USERS DESSA MÚSICA E ADICIONO OS UTILIZADORES QUE SE ENCONTRAM NA ARRAYLIST
  2212.  
  2213.         //3. POR FIM, ENVIO A MENSAGEM AO CLIENTE A DIZER SE TUDO CORREU BEM OU NÃO
  2214.  
  2215.  
  2216.     }
  2217.  
  2218.     void add (String pack_id, String user, String text, MulticastSocket socket, int server_id){
  2219.         ArrayList <Notification> n_list = data.get_NotificationList(server_id);
  2220.         Notification notif = new Notification(user, text);
  2221.         n_list.add(notif);
  2222.  
  2223.         data.write_notifications_file(n_list, server_id);
  2224.  
  2225.         String rsp = "pack_id|" + pack_id + ";server_id|" + server_id + ";type|add" + ";status|successful; " + "msg|Notification added to the list";
  2226.         try {
  2227.             byte[] buffer = rsp.getBytes();
  2228.             DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  2229.             socket.send(packet);
  2230.         } catch (IOException e) {
  2231.             e.printStackTrace();
  2232.         }
  2233.  
  2234.     }
  2235.  
  2236. }
  2237.  
  2238.  
  2239. class AnswerRequests extends Thread implements Serializable{
  2240.  
  2241.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  2242.     //private int PORT = 4444; //Porto de envio
  2243.     private String message;
  2244.     private String ip;
  2245.     private int porto;
  2246.     private MulticastSocket socket;
  2247.     private int server_id;
  2248.  
  2249.     MessageParsing parsing = new MessageParsing();
  2250.  
  2251.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  2252.         this.message = message;
  2253.         this.ip = ip;
  2254.         this.porto = porto;
  2255.         this.socket = socket;
  2256.         this.server_id = server_id;
  2257.     }
  2258.  
  2259.     public void run(){
  2260.  
  2261.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  2262.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  2263.  
  2264.         //Enviar resposta para o cliente
  2265.         //MulticastSocket socket = null;
  2266.  
  2267.         //Parsing da mensagem
  2268.         String [] pares = parsing.MessageParsing(message);
  2269.         String type = pares[2];
  2270.         String pack_id = pares[0];
  2271.  
  2272.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  2273.         //Trata do pedido para depois enviar a resposta para o cliente
  2274.         switch (type) {
  2275.             case "login":
  2276.                 prot.login(pack_id, pares[3], pares[4], socket, server_id);
  2277.                 break;
  2278.  
  2279.             case "search music":
  2280.                 prot.search_music(pack_id, pares[3], pares[4], socket, server_id);
  2281.                 break;
  2282.  
  2283.             case "make editor":
  2284.                 String username = pares[3];
  2285.                 String new_editor = pares[4];
  2286.                 prot.make_editor(pack_id, username, new_editor, socket, server_id); //EDITOR
  2287.                 break;
  2288.  
  2289.             case "register":
  2290.                 try {
  2291.                     prot.register(pack_id, pares[3], pares[4], socket, server_id);
  2292.                 } catch (IOException e) {
  2293.                     e.printStackTrace();
  2294.                 }
  2295.                 break;
  2296.  
  2297.             case "edit info":
  2298.                 String user = pares[3];
  2299.                 String search = pares[4];
  2300.                 String search_name = pares[5];
  2301.                 String op_type = pares[6];
  2302.                 String field_type = pares[7];
  2303.                 String msg = pares[8];
  2304.                 prot.manage_data(pack_id, user, search, search_name, op_type, field_type, msg, socket, server_id); //EDITOR
  2305.                 break;
  2306.  
  2307.             case "search info":
  2308.                 String search_type = pares[3];
  2309.                 String choice_name = pares[4];
  2310.                 prot.search_info(pack_id, search_type,choice_name, socket, server_id);
  2311.                 break;
  2312.  
  2313.             case "review":
  2314.                 String userr = pares[3];
  2315.                 String album_name = pares[4];
  2316.                 String rating = pares[5];
  2317.                 String review_text = pares[6];
  2318.                 prot.album_review(pack_id, userr, album_name, rating, review_text, socket, server_id); //ANY USER
  2319.                 break;
  2320.  
  2321.             case "share music": //DEPOIS
  2322.                 String Uuser = pares[3];
  2323.                 String musicc = pares[4];
  2324.                 //String counter = pares[5]; //ACHO QUE NAO VOU PRECISAR DISTO PARA NADA
  2325.                 ArrayList <String> lista = new ArrayList<>();
  2326.                 for (int j = 6; j < pares.length; j++){
  2327.                     lista.add(pares[j]);
  2328.                 }
  2329.                 prot.share_music(pack_id, Uuser, musicc, lista, socket, server_id);
  2330.                 break;
  2331.  
  2332.             case "download": //DEPOIS
  2333.                 String userrrr = pares[3];
  2334.                 String music = pares[4];
  2335.                 prot.download(pack_id, userrrr, music, socket, server_id);
  2336.                 break;
  2337.  
  2338.             case "upload":  //DEPOIS
  2339.                 String userrr = pares[3];
  2340.                 String music_name = pares[4];
  2341.                 prot.upload(pack_id,userrr, music_name, socket, server_id);
  2342.                 break;
  2343.  
  2344.             case "add":
  2345.                 String us = pares[3];
  2346.                 String txt = pares[4];
  2347.                 prot.add(pack_id, us, txt, socket, server_id);
  2348.                 break;
  2349.         }
  2350.  
  2351.     }
  2352.  
  2353. }
  2354.  
  2355. public class MulticastServer extends Thread implements Serializable{
  2356.  
  2357.     private String MULTICAST_ADDRESS = "224.3.2.1";
  2358.     private int PORT = 4321; //Porto de recepção
  2359.     private int BUFFER_SIZE = 4096;
  2360.     private static int SERVER_ID;
  2361.  
  2362.     MessageParsing parsemsg = new MessageParsing();
  2363.  
  2364.     public static void main(String[] args) {
  2365.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  2366.         MulticastServer server = new MulticastServer();
  2367.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  2368.     }
  2369.  
  2370.     public MulticastServer() {
  2371.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  2372.         super ("Server Multicast #" + SERVER_ID);
  2373.     }
  2374.  
  2375.     public void run(){
  2376.         MulticastSocket socket = null;
  2377.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  2378.  
  2379.         try {
  2380.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  2381.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  2382.             socket.joinGroup(group); //dá join ao grupo multicast
  2383.  
  2384.  
  2385.             while (true) {
  2386.                 //Recepcao
  2387.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  2388.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  2389.                 socket.receive(msgIn); //Recebe o datagrama UDP
  2390.  
  2391.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  2392.                 int clientport = msgIn.getPort(); //Porto do cliente
  2393.  
  2394.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  2395.                 String [] fields = parsemsg.MessageParsing(message);
  2396.  
  2397.                 //AutoMessage de 5 em 5 segundos
  2398.                 /*AutoMessage auto = new AutoMessage(SERVER_ID, socket);
  2399.                 auto.start();*/
  2400.  
  2401.                 if (Integer.parseInt(fields[1]) == SERVER_ID){
  2402.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  2403.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  2404.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  2405.                     work.start();
  2406.                 }
  2407.                 else{
  2408.                     RedundantAnswer work_too = new RedundantAnswer(message, SERVER_ID);
  2409.                     work_too.start();
  2410.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  2411.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  2412.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  2413.  
  2414.                 }
  2415.  
  2416.             }
  2417.  
  2418.         } catch (IOException e) {
  2419.             e.printStackTrace();
  2420.         } finally {
  2421.             socket.close(); //Fechar a socket
  2422.         }
  2423.     }
  2424.  
  2425. }
  2426.  
  2427.  
  2428.  
  2429.  /*JABARDICE
  2430.         data.write_albumlist_file(album_list, server_id);
  2431.         data.write_artislist_file(artist_list, server_id);
  2432.         data.write_musiclist_file(music_list, server_id);
  2433.            */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement