Advertisement
Guest User

suuup

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