Advertisement
Guest User

LY

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