Advertisement
Guest User

ORA, ANTES DE MAIS, BOA NOITE

a guest
Oct 23rd, 2018
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 42.22 KB | None | 0 0
  1. import javax.xml.crypto.Data;
  2.         import java.awt.*;
  3.         import java.io.Serializable;
  4.         import java.net.*;
  5.         import java.io.IOException;
  6. import java.sql.Array;
  7. import java.sql.SQLOutput;
  8.         import java.util.ArrayList;
  9.         import java.util.Scanner;
  10.         import java.io.*;
  11.         import static java.lang.Thread.sleep;
  12.  
  13. class User implements Serializable {
  14.     private String username, password, user_type;
  15.  
  16.     public User(String username, String password, String user_type) {
  17.         this.username = username;
  18.         this.password = password;
  19.         this.user_type = user_type;
  20.     }
  21.  
  22.     public String getUsername() {
  23.         return username;
  24.     }
  25.  
  26.     public String getPassword() {
  27.         return password;
  28.     }
  29.  
  30.     public String getUser_type() { return user_type; }
  31.  
  32.     public void setUser_type(String user_type) {
  33.         this.user_type = user_type;
  34.     }
  35. }
  36.  
  37. class Music implements Serializable {
  38.     private String artist, genre, album, name; //Nao sei se fica String album ou se mudo para Album album
  39.     private int duration;
  40.  
  41.     //ArrayList <User> user;
  42.  
  43.     public Music(String artist, String genre, String album, String name, int duration) {
  44.         this.artist = artist;
  45.         this.genre = genre;
  46.         this.album = album;
  47.         this.name = name;
  48.         this.duration = duration;
  49.     }
  50.  
  51.     public String getArtist() {
  52.         return artist;
  53.     }
  54.  
  55.     public String getGenre() {
  56.         return genre;
  57.     }
  58.  
  59.     public String getAlbum_title() {
  60.         return album;
  61.     }
  62.  
  63.     public String getName() {
  64.         return name;
  65.     }
  66.  
  67.     public int getDuration() {
  68.         return duration;
  69.     }
  70. }
  71.  
  72. class Album implements Serializable {
  73.     private String album_name, description;
  74.     private int rating; //rating médio
  75.     private String artist;
  76.     ArrayList <Music> music_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  77.     ArrayList <Review> review_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  78.  
  79.     public Album(String album_name, String artist, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list) {
  80.         this.album_name = album_name;
  81.         this.description = description;
  82.         this.rating = rating;
  83.         this.artist = artist;
  84.         this.music_list = music_list;
  85.         this.review_list = review_list;
  86.     }
  87.  
  88.     public String getAlbum_name() {
  89.         return album_name;
  90.     }
  91.  
  92.     public String getDescription() {
  93.         return description;
  94.     }
  95.  
  96.     public double getRating() {
  97.         return rating;
  98.     }
  99.  
  100.     public ArrayList<Music> getMusic_list() {
  101.         return music_list;
  102.     }
  103.  
  104.     public ArrayList<Review> getReview_list() {
  105.         return review_list;
  106.     }
  107.  
  108.     public void setDescription(String description) {
  109.         this.description = description;
  110.     }
  111.  
  112.     public String getArtist() {
  113.         return artist;
  114.     }
  115.  
  116.     public double average_rating (ArrayList <Review> review_list){ //ALTERAR
  117.         int soma = 0;
  118.         int size = review_list.size();
  119.         double average_rating;
  120.  
  121.         for (Review r: review_list){
  122.             rating += r.getRating();
  123.         }
  124.  
  125.         average_rating = (double) rating / size;
  126.  
  127.         return average_rating;
  128.     }
  129.  
  130.  
  131. }
  132.  
  133. class Review implements Serializable { //AINDA TENHO QUE VER PRECISA DE SERIALIZABLE OU NÃO
  134.     private String text;
  135.     private int rating;
  136.     private String user;
  137.  
  138.     public Review(String text, int rating, String user) {
  139.         this.text = text;
  140.         this.rating = rating;
  141.         this.user = user;
  142.     }
  143.  
  144.     public String getText() {
  145.         return text;
  146.     }
  147.  
  148.     public int getRating() {
  149.         return rating;
  150.     }
  151.  
  152.     public String getUser() {
  153.         return user;
  154.     }
  155. }
  156.  
  157. class Artist implements  Serializable{
  158.  
  159.     private String nome, grupo, genre, biography;
  160.     private String data_nasc; //TALVIZ CRIAR UMA CLASSE DATA
  161.     ArrayList <Music> music_list;
  162.  
  163.     public Artist(String nome, String grupo, String data_nasc, String genre, String biography, ArrayList <Music> music_list) {
  164.         this.nome = nome;
  165.         this.grupo = grupo;
  166.         this.data_nasc = data_nasc;
  167.         this.genre = genre;
  168.         this.biography = biography;
  169.         this.music_list = music_list;
  170.     }
  171.  
  172.     public String getNome() {
  173.         return nome;
  174.     }
  175.  
  176.     public String getGrupo() {
  177.         return grupo;
  178.     }
  179.  
  180.     public String getData_nasc() {
  181.         return data_nasc;
  182.     }
  183.  
  184.     public String getGenre() {
  185.         return genre;
  186.     }
  187.  
  188.     public String getBiography() {
  189.         return biography;
  190.     }
  191.  
  192.     public ArrayList<Music> getMusic_list() {
  193.         return music_list;
  194.     }
  195. }
  196.  
  197.  
  198. class DatabaseConnection {
  199.     //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
  200.  
  201.     public DatabaseConnection() {
  202.     }
  203.  
  204.     boolean username_match (String username){
  205.  
  206.         ArrayList <User> users = new ArrayList<>();
  207.  
  208.         //Abrir para a leitura do ficheiro de objetos
  209.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  210.             users = (ArrayList) oin.readObject();
  211.         } catch (IOException e){
  212.             System.out.println(e.getMessage());
  213.         } catch (ClassNotFoundException e) {
  214.             e.printStackTrace();
  215.         }
  216.  
  217.         for (User u: users){
  218.             if (u.getUsername().equals(username)) {
  219.                 return true;
  220.             }
  221.         }
  222.  
  223.         return false;
  224.     }
  225.  
  226.     boolean password_match (String username, String password){
  227.         //Tenho que procurar por username e depois por password
  228.         //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
  229.  
  230.         ArrayList <User> users = new ArrayList<>();
  231.  
  232.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  233.             users = (ArrayList) oin.readObject();
  234.         } catch (IOException e){
  235.             System.out.println(e.getMessage());
  236.         } catch (ClassNotFoundException e) {
  237.             e.printStackTrace();
  238.         }
  239.  
  240.         for (User u: users) {
  241.             if (u.getUsername().equals(username)) {
  242.                 if (u.getPassword().equals(password)) {
  243.                     return true;
  244.                 }
  245.             }
  246.  
  247.         }
  248.         return false;
  249.     }
  250.  
  251.     void write_user_file(String text, ArrayList <User> users) { //Para escrever no ficheiro de utilizadores
  252.         try {
  253.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
  254.             oS.writeObject(users);
  255.             oS.close();
  256.  
  257.         } catch (IOException e) {
  258.             System.out.print("ERRO");
  259.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  260.         }
  261.     }
  262.  
  263.     ArrayList <Album> get_AlbumList (){
  264.         ArrayList <Album> album_list = new ArrayList<>();
  265.  
  266.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList_obj.txt"))) {
  267.             album_list = (ArrayList) oin.readObject();
  268.         } catch (IOException e){
  269.             System.out.println(e.getMessage());
  270.         } catch (ClassNotFoundException e) {
  271.             e.printStackTrace();
  272.         }
  273.  
  274.         return album_list;
  275.     }
  276.  
  277.     void write_albumlist_file (String text, ArrayList <Album> album_list) { //Para escrever no ficheiro de álbuns
  278.         try {
  279.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
  280.             oS.writeObject(album_list);
  281.             oS.close();
  282.  
  283.         } catch (IOException e) {
  284.             System.out.print("ERRO");
  285.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  286.         }
  287.     }
  288.  
  289.     ArrayList <Music> get_MusicList (){
  290.         ArrayList <Music> music_list = new ArrayList<>();
  291.  
  292.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("MusicList_obj.txt"))) {
  293.             music_list = (ArrayList) oin.readObject();
  294.         } catch (IOException e){
  295.             System.out.println(e.getMessage());
  296.         } catch (ClassNotFoundException e) {
  297.             e.printStackTrace();
  298.         }
  299.  
  300.         return music_list;
  301.     }
  302.  
  303.     ArrayList <Artist> get_ArtistList (){
  304.         ArrayList <Artist> artist_list = new ArrayList<>();
  305.  
  306.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("ArtistList_obj.txt"))) {
  307.             artist_list = (ArrayList) oin.readObject();
  308.         } catch (IOException e){
  309.             System.out.println(e.getMessage());
  310.         } catch (ClassNotFoundException e) {
  311.             e.printStackTrace();
  312.         }
  313.  
  314.         return artist_list;
  315.     }
  316.  
  317.     ArrayList <User> get_UserList (){
  318.         ArrayList <User> user_list = new ArrayList<>();
  319.  
  320.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  321.             user_list = (ArrayList) oin.readObject();
  322.         } catch (IOException e){
  323.             System.out.println(e.getMessage());
  324.         } catch (ClassNotFoundException e) {
  325.             e.printStackTrace();
  326.         }
  327.  
  328.         return user_list;
  329.     }
  330.  
  331. }
  332.  
  333.  
  334. class MessageParsing {
  335.  
  336.     public String [] MessageParsing (String message){
  337.  
  338.         //Separar por ";" e saber o número de pares
  339.         String [] pares  = message.split(";");
  340.         String  [] campos = new String[pares.length] ;
  341.  
  342.         if (pares.length >= 3){ //NAO SEI SE PRECISO DESTA CONDICAO OU NAO, TENHO QUE TER ATENCAO POR CAUSA DA EXCEPTION
  343.             for (int i = 0; i < pares.length; i++){
  344.                 String [] aux = pares[i].split("\\|");
  345.                 campos[i] = aux[1];
  346.             }
  347.         }
  348.  
  349.         //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
  350.         //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
  351.  
  352.         return campos;
  353.     }
  354.  
  355. }
  356.  
  357.  
  358. class UDPMulticastProtocol implements Serializable {
  359.  
  360.     private String MULTICAST_ADDRESS = "224.3.2.1";
  361.     private int PORT = 4444; //Porto de envio
  362.     DatabaseConnection data = new DatabaseConnection();
  363.  
  364.     public UDPMulticastProtocol() {
  365.     }
  366.  
  367.     void login (String pack_id, String username, String password, MulticastSocket socket, int server_id){
  368.         System.out.println("O cliente deseja fazer login");
  369.         System.out.println("Username inserido: " + username);
  370.         System.out.println("Password inserida: " + password);
  371.         //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
  372.  
  373.  
  374.         if (data.username_match(username)){
  375.             if (data.password_match(username, password)){ //SUCESSO
  376.                 //System.out.println("GREAT SUCCESS");
  377.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; logged|on; " + "msg|Welcome to DropMusic";
  378.  
  379.                 try{
  380.                     byte[] buffer = rsp.getBytes();
  381.                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  382.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  383.                     socket.send(packet);
  384.  
  385.                 } catch (IOException e) {
  386.                     e.printStackTrace();
  387.                 }
  388.  
  389.             }
  390.             else { //PASSWORD ERRADA
  391.                 //System.out.println("PASSWORD ERRADA");
  392.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Password incorreta";
  393.  
  394.                 try{
  395.                     byte[] buffer = rsp.getBytes();
  396.                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  397.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  398.                     socket.send(packet);
  399.  
  400.                 } catch (IOException e) {
  401.                     e.printStackTrace();
  402.                 }
  403.             }
  404.         }
  405.  
  406.         else{ //UTILIZADOR NAO EXISTE
  407.             //System.out.println("Utilizador nao existe");
  408.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Utilizador nao existe";
  409.  
  410.             try{
  411.                 byte[] buffer = rsp.getBytes();
  412.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  413.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  414.                 socket.send(packet);
  415.  
  416.             } catch (IOException e) {
  417.                 e.printStackTrace();
  418.             }
  419.         }
  420.  
  421.  
  422.     }
  423.  
  424.     void register (String pack_id, String username, String password, MulticastSocket socket, int server_id) throws IOException {
  425.  
  426.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  427.         //Abrir para a leitura do ficheiro de objetos
  428.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  429.             users = (ArrayList) oin.readObject();
  430.         } catch (IOException e){
  431.             System.out.println(e.getMessage());
  432.         } catch (ClassNotFoundException e) {
  433.             e.printStackTrace();
  434.         }
  435.  
  436.         System.out.println("O cliente deseja registar-se");
  437.         System.out.println("Username inserido: " + username);
  438.         System.out.println("Password inserida: " + password);
  439.  
  440.         //Temos que ver se existe o username ou não
  441.         if (!data.username_match(username)) {
  442.  
  443.             //Abrir para escrita no ficheiro de objetos
  444.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  445.                 User u = new User(username, password, "admin");
  446.                 users.add(u);
  447.             }
  448.             else{
  449.                 User u = new User(username, password, "normal");
  450.                 users.add(u);
  451.             }
  452.  
  453.             try {
  454.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
  455.                 oS.writeObject(users);
  456.                 oS.close();
  457.  
  458.             } catch (IOException e) {
  459.                 System.out.print("ERRO");
  460.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  461.             }
  462.  
  463.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; register|successful; " + "msg|Welcome to DropMusic";
  464.             try{
  465.  
  466.                 byte[] buffer = rsp.getBytes();
  467.  
  468.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  469.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  470.                 socket.send(packet);
  471.  
  472.             } catch (IOException e) {
  473.                 e.printStackTrace();
  474.             }
  475.         }
  476.  
  477.         else {
  478.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; register|unsuccessful; " + "msg|Esse username ja existe";
  479.  
  480.             try{
  481.                 byte[] buffer = rsp.getBytes();
  482.                 //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  483.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  484.                 socket.send(packet);
  485.  
  486.             } catch (IOException e) {
  487.                 e.printStackTrace();
  488.             }
  489.         }
  490.  
  491.         //SÓ PARA VER QUEM TENHO REGISTADO
  492.         for (User uss: users){
  493.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  494.         }
  495.  
  496.  
  497.     }
  498.  
  499.     void search_music (String pack_id, String choice, String name, MulticastSocket socket, int server_id){ //FALTA o ALL, COMPLETAR E TESTAR
  500.         System.out.println("O cliente deseja procurar musica");
  501.  
  502.         switch (choice){
  503.             case "all": //Vai procurar por tudo o que os outros "cases" vao procurar //ACHO QUE VOU RETIRAR ISTO
  504.  
  505.                 break;
  506.  
  507.             case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
  508.                 ArrayList <Album> album_list = data.get_AlbumList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  509.                 //ArrayList <Music> aux = new ArrayList<>(); //ArrayList auxiliar para pôr todos os albuns com o nome "name"
  510.                 String x = "";
  511.                 int item_count = 0;
  512.  
  513.                 for (Album a: album_list){
  514.                     if (a.getAlbum_name().equals(name)){
  515.                         item_count = a.music_list.size();
  516.                         for (int k = 0; k < item_count; k++)
  517.  
  518.                         x += "item_"+k+"_name| " + a.music_list.get(k).getName();
  519.  
  520.                     }
  521.                 }
  522.  
  523.                 //1. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  524.                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list from the searched album" +
  525.                         "item_count| " + item_count + x; //Ver se o item_count é bem apresentado
  526.  
  527.                 try{
  528.                     byte[] buffer = rsp.getBytes();
  529.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  530.                     socket.send(packet);
  531.                 } catch (IOException e) {
  532.                     e.printStackTrace();
  533.                 }
  534.  
  535.  
  536.                 break;
  537.  
  538.             case "music":  //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
  539.                 ArrayList <Music> music_list = data.get_MusicList();
  540.                 //ArrayList <Music> auxappend = new ArrayList<>();
  541.  
  542.                 String s = "";
  543.                 int item_size = 0;
  544.  
  545.                 for (Music m: music_list){
  546.                     if (m.getName().equals(name)){
  547.                         s += "item_"+item_size+"_name| " + m.getName();
  548.                         item_size++;
  549.  
  550.                     }
  551.                 }
  552.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  553.                 String ans = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  554.                         "item_count| " + item_size + s; //Ver se o item_size é bem apresentado
  555.                 //ENVIAR RESPOSTA PARA O CLIENTE
  556.                 try {
  557.                     byte[] buffer = ans.getBytes();
  558.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  559.                     socket.send(packet);
  560.                 } catch (IOException e) {
  561.                     e.printStackTrace();
  562.                 }
  563.  
  564.                 break;
  565.  
  566.             case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
  567.  
  568.                 //NOTAAAA: DECIDIR SE CRIO UM FICHEIRO DE ARTISTAS OU SE NÃO É NECESSÁRIO
  569.                 ArrayList <Artist> artist_list = data.get_ArtistList();
  570.  
  571.                 String z = "";
  572.                 int tam = 0;
  573.  
  574.                 for (Artist a: artist_list){
  575.                     if (a.getNome().equals(name)){
  576.                         for (int j = 0; j < a.getMusic_list().size(); j++){
  577.                             tam = a.getMusic_list().size();
  578.                             z += "item_"+ j +"_name| " + a.getMusic_list().get(j).getName();
  579.                         }
  580.                     }
  581.                 }
  582.  
  583.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  584.                 String resp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  585.                         "item_count| " + tam + z; //Ver se o item_size é bem apresentado
  586.                 //ENVIAR RESPOSTA PARA O CLIENTE
  587.                 try {
  588.                     byte[] buffer = resp.getBytes();
  589.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  590.                     socket.send(packet);
  591.                 } catch (IOException e) {
  592.                     e.printStackTrace();
  593.                 }
  594.  
  595.                 break;
  596.  
  597.             case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
  598.                 ArrayList <Music> music_list1 = data.get_MusicList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  599.  
  600.                 String aux = "";
  601.                 int conta = 0;
  602.  
  603.                 for (Music m: music_list1){
  604.                     if (m.getGenre().equals(name)){
  605.                         aux += "item_"+conta +"_name| " + m.getName();
  606.                         conta++;
  607.                     }
  608.                 }
  609.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  610.                 String envia = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list you requested" +
  611.                         "item_count| " + conta + aux; //Ver se o conta é bem apresentado
  612.  
  613.                 //ENVIAR RESPOSTA PARA O CLIENTE
  614.                 try {
  615.                     byte[] buffer = envia.getBytes();
  616.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  617.                     socket.send(packet);
  618.                 } catch (IOException e) {
  619.                     e.printStackTrace();
  620.                 }
  621.  
  622.                 break;
  623.  
  624.         }
  625.  
  626.     }
  627.  
  628.     void make_editor (String pack_id, String username, String novo_editor, MulticastSocket socket, int server_id){ //VERIFICAR E TESTAR
  629.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  630.  
  631.         ArrayList <User> users = new ArrayList<>();
  632.  
  633.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  634.             users = (ArrayList) oin.readObject();
  635.         } catch (IOException e){
  636.             System.out.println(e.getMessage());
  637.         } catch (ClassNotFoundException e) {
  638.             e.printStackTrace();
  639.         }
  640.  
  641.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  642.         if (data.username_match(username)) { //SUCESSO
  643.             for (User u : users) {
  644.                 if (u.getUsername().equals(username)) {
  645.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) {
  646.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  647.                         for (User us : users) {
  648.                             if (us.getUsername().equals(novo_editor)) {
  649.                                 us.setUser_type("editor");
  650.                                 data.write_user_file("Users_obj.txt", users);
  651.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  652.                                 //String rsp = "server_id|" + server_id + "; type|status;" + "; logged|on; " + "msg|Welcome to DropMusic";
  653.                                 String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; make editor|successful; " + "msg|You can edit now";
  654.                                 try {
  655.                                     byte[] buffer = rsp.getBytes();
  656.                                     //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  657.                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  658.                                     socket.send(packet);
  659.  
  660.                                 } catch (IOException e) {
  661.                                     e.printStackTrace();
  662.                                 }
  663.                             /*} else { //FALTA PÔR ESTE CHECK A FUNCIONAR
  664.                                 System.out.println("Utilizador nao existe");
  665.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  666.                             }*/
  667.                             }
  668.                         }
  669.                     }
  670.                 }
  671.             }
  672.  
  673.         } else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
  674.             String rsp = "pack_id|" + pack_id +  "; server_id|" + server_id + "; type|status" + "; make editor|unsuccessful; " + "msg|The user you entered is not in our database";
  675.             try {
  676.                 byte[] buffer = rsp.getBytes();
  677.                 //InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  678.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  679.                 socket.send(packet);
  680.  
  681.             } catch (IOException e) {
  682.                 e.printStackTrace();
  683.             }
  684.         }
  685.  
  686.  
  687.     }
  688.  
  689.     void manage_data (String pack_id, String username, String choice, String op_type, String name) { //EM FALTA
  690.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  691.  
  692.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  693.         ArrayList<User> users = data.get_UserList();
  694.  
  695.         if (data.username_match(username)) { //SUCESSO
  696.             for (User u : users) {
  697.                 if (u.getUsername().equals(username)) {
  698.                     if (u.getUser_type().equals("editor")) {
  699.                         System.out.println("Tem permissao para editar");
  700.  
  701.                         switch (choice) {
  702.                             case "artist": /*-------------------------ARTIST--------------------------*/
  703.                                 String artist_name = name;
  704.                                 switch (op_type){
  705.                                     case "insert":
  706.  
  707.                                         break;
  708.                                     case "change":
  709.  
  710.                                         break;
  711.                                     case "remove":
  712.  
  713.                                         break;
  714.                                 }
  715.  
  716.                                 break;
  717.  
  718.                             case "album": /*-------------------------ALBUM--------------------------*/
  719.                                 String album_title = name;
  720.                                 switch (op_type){
  721.                                     case "insert":
  722.  
  723.                                         break;
  724.                                     case "change":
  725.  
  726.                                         break;
  727.                                     case "remove":
  728.  
  729.                                         break;
  730.                                 }
  731.                                 break;
  732.  
  733.                             case "music": /*-------------------------MUSIC--------------------------*/
  734.                                 String music_name = name;
  735.                                 switch (op_type){
  736.                                     case "insert":
  737.  
  738.                                         break;
  739.                                     case "change":
  740.  
  741.                                         break;
  742.                                     case "remove":
  743.  
  744.                                         break;
  745.                                 }
  746.                                 break;
  747.  
  748.                         }
  749.                         //3. De seguida, abro esse álbum para escrita e vou editar a info que lá está
  750.  
  751.  
  752.                         //4. Por fim envio a resposta ao utilizador
  753.  
  754.                     }
  755.                 }
  756.             }
  757.         }
  758.     }
  759.  
  760.     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
  761.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  762.  
  763.         //1. Ver se a choice é album ou artista //E TALVEZ TAMBÉM MÚSICA
  764.         switch (choice){
  765.             case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
  766.                     ArrayList <Album> show_albuns = data.get_AlbumList();
  767.                     String info = ""; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  768.                     String lista_music = "Music_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  769.                     String lista_review = "Review_list: "; //VER SE ISTO ESTÁ BEM FEITO OU NAO
  770.  
  771.                     for (Album a: show_albuns){
  772.                         if (a.getAlbum_name().equals(msg)){
  773.                             info += a.getAlbum_name() + a.getArtist() + a.getDescription(); /*a.average_rating()*/
  774.                         }
  775.                     }
  776.  
  777.                     for (Album a: show_albuns) {
  778.                         if (a.getAlbum_name().equals(msg)) {
  779.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  780.                                 lista_music += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  781.                             }
  782.                         }
  783.                     }
  784.  
  785.                     for (Album a: show_albuns) {
  786.                         if (a.getAlbum_name().equals(msg)) {
  787.                             for (int k = 0; k < a.getReview_list().size(); k++) {
  788.                                 lista_review += "item_" + k + "_name" + " user: " + a.getReview_list().get(k).getText() +
  789.                                         " review: " + a.getReview_list().get(k).getText() + " rating: " + a.getReview_list().get(k).getRating();
  790.                             }
  791.                         }
  792.                     }
  793.  
  794.                     String answer = "pack_id|" + pack_id +  "; " + "server_id|" + server_id + "; " + info + lista_music + lista_review; //VER SE OBEDECE AO PROTOCOLO
  795.                     //ENVIAR RESPOSTA PARA O CLIENTE
  796.                     try {
  797.                         byte[] buffer = answer.getBytes();
  798.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  799.                         socket.send(packet);
  800.                     } catch (IOException e) {
  801.                         e.printStackTrace();
  802.                     }
  803.  
  804.                 break;
  805.  
  806.             case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
  807.                     ArrayList <Artist> artist_list = data.get_ArtistList();
  808.                     String msg_send = "";
  809.                     String musicas = "";
  810.  
  811.                     for (Artist a : artist_list){
  812.                         if (a.getNome().equals(msg)){
  813.                             msg_send = a.getGrupo() + a.getData_nasc() + a.getGenre() + a.getBiography();
  814.                         }
  815.                     }
  816.  
  817.                     for (Artist a: artist_list) {
  818.                         if (a.getNome().equals(msg)) {
  819.                             for (int j = 0; j < a.getMusic_list().size(); j++) {
  820.                                 musicas += "item_" + j + "_name" + a.getMusic_list().get(j).getName();
  821.                             }
  822.                         }
  823.                     }
  824.  
  825.                     String env_answer = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + msg_send + musicas;
  826.                     //ENVIAR RESPOSTA PARA O CLIENTE
  827.                     try {
  828.                         byte[] buffer = env_answer.getBytes();
  829.                         DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  830.                         socket.send(packet);
  831.                     } catch (IOException e) {
  832.                         e.printStackTrace();
  833.                     }
  834.  
  835.                 break;
  836.  
  837.             case "music":
  838.                 ArrayList <Music> music_list = data.get_MusicList();
  839.                 String resp_aux = "";
  840.  
  841.                 for (Music m: music_list){
  842.                     if (m.getName().equals(msg)){
  843.                         resp_aux += m.getName() + m.getAlbum_title() + m.getGenre() + m.getArtist() + m.getDuration();
  844.                     }
  845.                 }
  846.  
  847.                 String resp = "pack_id|" + pack_id + "; server_id|" + server_id + "; " + resp_aux;
  848.                 //ENVIAR RESPOSTA PARA O CLIENTE
  849.                 try {
  850.                     byte[] buffer = resp.getBytes();
  851.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  852.                     socket.send(packet);
  853.                 } catch (IOException e) {
  854.                     e.printStackTrace();
  855.                 }
  856.  
  857.                 break;
  858.         }
  859.     }
  860.  
  861.     void album_review (String pack_id, String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
  862.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  863.         //FALTA VERIFICAR SE A REVIEW TEM MENOS DE 300 CARACTERES-----------------------------------------
  864.  
  865.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  866.         ArrayList <Album> album_list = data.get_AlbumList();
  867.         Review r = new Review(text, Integer.parseInt(rating), user);
  868.  
  869.         for (Album a: album_list){
  870.             if (a.getAlbum_name().equals(album_title)){
  871.                 a.review_list.add(r); //Adicionar a review à lista de reviews
  872.                 data.write_albumlist_file("AlbumList_obj.txt", album_list);
  873.  
  874.                 //1. NÃO SEI SE NAO PRECISO DE ADICIONAR ALGO AO MÉTODO DO RATING PARA CALCULAR O RATING MÉDIO
  875.                 String rsp = "pack_id|" + pack_id + "; server_id|" + server_id + "; type|status" + "; review|successful; " + "msg|Your review was submitted";
  876.                 try {
  877.                     byte[] buffer = rsp.getBytes();
  878.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  879.                     socket.send(packet);
  880.                 } catch (IOException e) {
  881.                     e.printStackTrace();
  882.                 }
  883.             }
  884.             else { //ÁLBUM NÃO CONSTA DA BASE DE DADOS
  885.                 String rsp = "pack_id|" + pack_id  + "; server_id|" + server_id + "; type|status" + "; review|unsuccessful; " + "msg|The selected album is not in our database";
  886.                 try {
  887.                     byte[] buffer = rsp.getBytes();
  888.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  889.                     socket.send(packet);
  890.                 } catch (IOException e) {
  891.                     e.printStackTrace();
  892.                 }
  893.             }
  894.         }
  895.  
  896.     }
  897.  
  898.     void download (){ //EM FALTA
  899.         System.out.println("O cliente quer fazer download de uma música");
  900.     }
  901.  
  902.     void upload (){ //EM FALTA
  903.         System.out.println("O cliente quer fazer upload de uma música");
  904.     }
  905.  
  906.     void share_music (){ //EM FALTA
  907.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  908.     }
  909.  
  910. }
  911.  
  912.  
  913. class AnswerRequests extends Thread {
  914.  
  915.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  916.     //private int PORT = 4444; //Porto de envio
  917.     private String message;
  918.     private String ip;
  919.     private int porto;
  920.     private MulticastSocket socket;
  921.     private int server_id;
  922.  
  923.     MessageParsing parsing = new MessageParsing();
  924.  
  925.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  926.         this.message = message;
  927.         this.ip = ip;
  928.         this.porto = porto;
  929.         this.socket = socket;
  930.         this.server_id = server_id;
  931.     }
  932.  
  933.     public void run(){
  934.  
  935.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  936.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  937.  
  938.         //Enviar resposta para o cliente
  939.         //MulticastSocket socket = null;
  940.  
  941.         //Parsing da mensagem
  942.         String [] pares = parsing.MessageParsing(message);
  943.         String type = pares[2];
  944.         String pack_id = pares[0];
  945.  
  946.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  947.         //Trata do pedido para depois enviar a resposta para o cliente
  948.         switch (type) {
  949.             case "login":
  950.                 prot.login(pack_id, pares[3], pares[4], socket, server_id); //MUDAR NO MÉTODO
  951.                 break;
  952.  
  953.             case "search music":
  954.                 prot.search_music(pack_id, pares[3], pares[4], socket, server_id); //MUDAR NO MÉTODO
  955.                 break;
  956.  
  957.             case "make editor": //RESOLVER O PROBLEMA: COMO É QUE HEI DE SABER QUEM É QUE ESTÁ A QUERER TORNAR ALGUÉM EDITOR, PARA SABER SE TAMBÉM É EDITOR
  958.                 String username = pares[3];
  959.                 String new_editor = pares[4];
  960.                 prot.make_editor(pack_id, username, new_editor, socket, server_id); //EDITOR  //MUDAR NO MÉTODO
  961.                 break;
  962.  
  963.             case "register":
  964.                 try {
  965.                     prot.register(pack_id, pares[3], pares[4], socket, server_id);  //MUDAR NO MÉTODO
  966.                 } catch (IOException e) {
  967.                     e.printStackTrace();
  968.                 }
  969.                 break;
  970.  
  971.             case "edit info":
  972.                 String user = pares[3];
  973.                 String search = pares[4];
  974.                 String op_type = pares[5];
  975.                 String msg = pares[6];
  976.                 prot.manage_data(pack_id, user, search,op_type, msg); //EDITOR  //MUDAR NO MÉTODO
  977.                 break;
  978.  
  979.             case "search info":
  980.                 String search_type = pares[3];
  981.                 String choice_name = pares[4];
  982.                 prot.search_info(pack_id, search_type,choice_name, socket, server_id);  //MUDAR NO MÉTODO
  983.                 break;
  984.  
  985.             case "review":
  986.                 String userr = pares[3];
  987.                 String album_name = pares[4];
  988.                 String rating = pares[5];
  989.                 String review_text = pares[6];
  990.                 prot.album_review(pack_id, userr, album_name, rating, review_text, socket, server_id); //ANY USER //MUDAR NO MÉTODO
  991.                 break;
  992.  
  993.             case "share music": //DEPOIS
  994.                 prot.share_music();
  995.                 break;
  996.  
  997.             case "download": //DEPOIS
  998.                 prot.download();
  999.                 break;
  1000.  
  1001.             case "upload":  //DEPOIS
  1002.                 prot.upload();
  1003.                 break;
  1004.         }
  1005.  
  1006.     }
  1007.  
  1008. }
  1009.  
  1010. public class MulticastServer extends Thread {
  1011.  
  1012.     private String MULTICAST_ADDRESS = "224.3.2.1";
  1013.     private int PORT = 4321; //Porto de recepção
  1014.     private int BUFFER_SIZE = 4096;
  1015.     private static int SERVER_ID;
  1016.  
  1017.     MessageParsing parsemsg = new MessageParsing();
  1018.  
  1019.     public static void main(String[] args) {
  1020.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  1021.         MulticastServer server = new MulticastServer();
  1022.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  1023.     }
  1024.  
  1025.     public MulticastServer() {
  1026.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  1027.         super ("Server Multicast #" + SERVER_ID);
  1028.     }
  1029.  
  1030.     public void run(){
  1031.         MulticastSocket socket = null;
  1032.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  1033.  
  1034.         try {
  1035.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  1036.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1037.             socket.joinGroup(group); //dá join ao grupo multicast
  1038.  
  1039.  
  1040.             while (true) {
  1041.                 //Recepcao
  1042.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  1043.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  1044.                 socket.receive(msgIn); //Recebe o datagrama UDP
  1045.  
  1046.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  1047.                 int clientport = msgIn.getPort(); //Porto do cliente
  1048.  
  1049.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  1050.                 String [] fields = parsemsg.MessageParsing(message);
  1051.  
  1052.                 if (Integer.parseInt(fields[1]) == SERVER_ID){
  1053.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  1054.  
  1055.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  1056.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  1057.                     work.start();
  1058.                 }
  1059.                 else{
  1060.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  1061.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  1062.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  1063.  
  1064.                 }
  1065.  
  1066.             }
  1067.  
  1068.         } catch (IOException e) {
  1069.             e.printStackTrace();
  1070.         } finally {
  1071.             socket.close(); //Fechar a socket
  1072.         }
  1073.     }
  1074.  
  1075. }
  1076.  
  1077. /*
  1078. try{
  1079.             socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
  1080.             socket.setTimeToLive(1);
  1081.  
  1082.             Scanner keyboardScaner = new Scanner(System.in);
  1083.             while (true){
  1084.                 String keyboard = keyboardScaner.nextLine();
  1085.                 byte[] buffer = keyboard.getBytes();
  1086.  
  1087.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  1088.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  1089.                 socket.send(packet);
  1090.             }
  1091.         } catch (IOException e) {
  1092.             e.printStackTrace();
  1093.         } finally {
  1094.             socket.close();
  1095.         }
  1096.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement