Advertisement
Guest User

AI JASOOO

a guest
Oct 22nd, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 31.18 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;
  39.     private int duration;
  40.  
  41.     public Music(String artist, String genre, String album, String name, int duration) {
  42.         this.artist = artist;
  43.         this.genre = genre;
  44.         this.album = album;
  45.         this.name = name;
  46.         this.duration = duration;
  47.     }
  48.  
  49.     public String getArtist() {
  50.         return artist;
  51.     }
  52.  
  53.     public String getGenre() {
  54.         return genre;
  55.     }
  56.  
  57.     public String getAlbum_title() {
  58.         return album;
  59.     }
  60.  
  61.     public String getName() {
  62.         return name;
  63.     }
  64.  
  65.     public int getDuration() {
  66.         return duration;
  67.     }
  68. }
  69.  
  70. class Album implements Serializable {
  71.     private String album_name, description;
  72.     private int rating; //rating médio
  73.     ArrayList <Music> music_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  74.     ArrayList <Review> review_list = new ArrayList<>(); //TALVEZ PÔR PRIVATE
  75.  
  76.     public Album(String album_name, String description, int rating, ArrayList<Music> music_list, ArrayList<Review> review_list) {
  77.         this.album_name = album_name;
  78.         this.description = description;
  79.         this.rating = rating;
  80.         this.music_list = music_list;
  81.         this.review_list = review_list;
  82.     }
  83.  
  84.     public String getAlbum_name() {
  85.         return album_name;
  86.     }
  87.  
  88.     public String getDescription() {
  89.         return description;
  90.     }
  91.  
  92.     public int getRating() {
  93.         return rating;
  94.     }
  95.  
  96.     public ArrayList<Music> getMusic_list() {
  97.         return music_list;
  98.     }
  99.  
  100.     public ArrayList<Review> getReview_list() {
  101.         return review_list;
  102.     }
  103.  
  104.     public void setDescription(String description) {
  105.         this.description = description;
  106.     }
  107.  
  108.     public void setRating(int rating) {
  109.         this.rating = rating;
  110.     }
  111.  
  112.     public double average_rating (ArrayList <Review> review_list){
  113.         int soma = 0;
  114.         int size = review_list.size();
  115.         double average_rating;
  116.  
  117.         for (Review r: review_list){
  118.             rating += r.getRating();
  119.         }
  120.  
  121.         average_rating = (double) rating / size;
  122.  
  123.         return average_rating;
  124.     }
  125.  
  126.  
  127. }
  128.  
  129. class Review implements Serializable { //AINDA TENHO QUE VER PRECISA DE SERIALIZABLE OU NÃO
  130.     private String text;
  131.     private int rating;
  132.     private String user;
  133.  
  134.     public Review(String text, int rating, String user) {
  135.         this.text = text;
  136.         this.rating = rating;
  137.         this.user = user;
  138.     }
  139.  
  140.     public String getText() {
  141.         return text;
  142.     }
  143.  
  144.     public int getRating() {
  145.         return rating;
  146.     }
  147.  
  148.     public String getUser() {
  149.         return user;
  150.     }
  151. }
  152.  
  153.  
  154. class DatabaseConnection {
  155.     //Ver como ir buscar a música a uma diretoria e colocar música nessa diretoria
  156.  
  157.     public DatabaseConnection() {
  158.     }
  159.  
  160.     boolean username_match (String username){
  161.  
  162.         ArrayList <User> users = new ArrayList<>();
  163.  
  164.         //Abrir para a leitura do ficheiro de objetos
  165.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  166.             users = (ArrayList) oin.readObject();
  167.         } catch (IOException e){
  168.             System.out.println(e.getMessage());
  169.         } catch (ClassNotFoundException e) {
  170.             e.printStackTrace();
  171.         }
  172.  
  173.         for (User u: users){
  174.             if (u.getUsername().equals(username)) {
  175.                 return true;
  176.             }
  177.         }
  178.  
  179.         return false;
  180.     }
  181.  
  182.     boolean password_match (String username, String password){
  183.         //Tenho que procurar por username e depois por password
  184.         //Porque se procuro apenas pela password, pode encontrar a password certa, mas ser de outro utilizador
  185.  
  186.         ArrayList <User> users = new ArrayList<>();
  187.  
  188.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  189.             users = (ArrayList) oin.readObject();
  190.         } catch (IOException e){
  191.             System.out.println(e.getMessage());
  192.         } catch (ClassNotFoundException e) {
  193.             e.printStackTrace();
  194.         }
  195.  
  196.         for (User u: users) {
  197.             if (u.getUsername().equals(username)) {
  198.                 if (u.getPassword().equals(password)) {
  199.                     return true;
  200.                 }
  201.             }
  202.  
  203.         }
  204.         return false;
  205.     }
  206.  
  207.     void write_user_file(String text, ArrayList <User> users) { //Para escrever no ficheiro de utilizadores
  208.         try {
  209.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
  210.             oS.writeObject(users);
  211.             oS.close();
  212.  
  213.         } catch (IOException e) {
  214.             System.out.print("ERRO");
  215.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  216.         }
  217.     }
  218.  
  219.     ArrayList <Album> get_AlbumList (){
  220.         ArrayList <Album> album_list = new ArrayList<>();
  221.  
  222.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("AlbumList_obj.txt"))) {
  223.             album_list = (ArrayList) oin.readObject();
  224.         } catch (IOException e){
  225.             System.out.println(e.getMessage());
  226.         } catch (ClassNotFoundException e) {
  227.             e.printStackTrace();
  228.         }
  229.  
  230.         return album_list;
  231.     }
  232.  
  233.     void write_albumlist_file (String text, ArrayList <Album> album_list) { //Para escrever no ficheiro de álbuns
  234.         try {
  235.             ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream(text));
  236.             oS.writeObject(album_list);
  237.             oS.close();
  238.  
  239.         } catch (IOException e) {
  240.             System.out.print("ERRO");
  241.             System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  242.         }
  243.     }
  244.  
  245.  
  246. }
  247.  
  248.  
  249. class MessageParsing {
  250.  
  251.     public String [] MessageParsing (String message){
  252.  
  253.         //Separar por ";" e saber o número de pares
  254.         String [] pares  = message.split(";");
  255.         String  [] campos = new String[pares.length] ;
  256.  
  257.         if (pares.length >= 3){ //NAO SEI SE PRECISO DESTA CONDICAO OU NAO, TENHO QUE TER ATENCAO POR CAUSA DA EXCEPTION
  258.             for (int i = 0; i < pares.length; i++){
  259.                 String [] aux = pares[i].split("\\|");
  260.                 campos[i] = aux[1];
  261.             }
  262.         }
  263.  
  264.         //É melhor imprimir num ciclo que vai ate ao total de elementos do array, caso contrario opde criar exception
  265.         //System.out.println ("Tipo da mensagem: " + campos[0] + " campo2: " + campos[1] + " campo3: " + campos[2]);
  266.  
  267.         return campos;
  268.     }
  269.  
  270. }
  271.  
  272.  
  273. class UDPMulticastProtocol implements Serializable {
  274.  
  275.     private String MULTICAST_ADDRESS = "224.3.2.1";
  276.     private int PORT = 4444; //Porto de envio
  277.     DatabaseConnection data = new DatabaseConnection();
  278.  
  279.     public UDPMulticastProtocol() {
  280.     }
  281.  
  282.     void login (String username, String password, MulticastSocket socket, int server_id){
  283.         System.out.println("O cliente deseja fazer login");
  284.         System.out.println("Username inserido: " + username);
  285.         System.out.println("Password inserida: " + password);
  286.         //Temos que ir à base de dados checkar se o username existe e qual a password associada e se é igual à inserida ou não
  287.  
  288.  
  289.         if (data.username_match(username)){
  290.             if (data.password_match(username, password)){ //SUCESSO
  291.                 //System.out.println("GREAT SUCCESS");
  292.                 String rsp = "server_id|" + server_id + "; type|status" + "; logged|on; " + "msg|Welcome to DropMusic";
  293.  
  294.                 try{
  295.                     byte[] buffer = rsp.getBytes();
  296.                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  297.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  298.                     socket.send(packet);
  299.  
  300.                 } catch (IOException e) {
  301.                     e.printStackTrace();
  302.                 }
  303.  
  304.             }
  305.             else { //PASSWORD ERRADA
  306.                 //System.out.println("PASSWORD ERRADA");
  307.                 String rsp = "server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Password incorreta";
  308.  
  309.                 try{
  310.                     byte[] buffer = rsp.getBytes();
  311.                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  312.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  313.                     socket.send(packet);
  314.  
  315.                 } catch (IOException e) {
  316.                     e.printStackTrace();
  317.                 }
  318.             }
  319.         }
  320.  
  321.         else{ //UTILIZADOR NAO EXISTE
  322.             //System.out.println("Utilizador nao existe");
  323.             String rsp = "server_id|" + server_id + "; type|status" + "; logged|failed; " + "msg|Utilizador nao existe";
  324.  
  325.             try{
  326.                 byte[] buffer = rsp.getBytes();
  327.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  328.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  329.                 socket.send(packet);
  330.  
  331.             } catch (IOException e) {
  332.                 e.printStackTrace();
  333.             }
  334.         }
  335.  
  336.  
  337.     }
  338.  
  339.     void register (String username, String password, MulticastSocket socket, int server_id) throws IOException {
  340.  
  341.         ArrayList <User> users = new ArrayList<>(); //ArrayList que contém todos os utilizadores
  342.         //Abrir para a leitura do ficheiro de objetos
  343.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  344.             users = (ArrayList) oin.readObject();
  345.         } catch (IOException e){
  346.             System.out.println(e.getMessage());
  347.         } catch (ClassNotFoundException e) {
  348.             e.printStackTrace();
  349.         }
  350.  
  351.         System.out.println("O cliente deseja registar-se");
  352.         System.out.println("Username inserido: " + username);
  353.         System.out.println("Password inserida: " + password);
  354.  
  355.         //Temos que ver se existe o username ou não
  356.         if (!data.username_match(username)) {
  357.  
  358.             //Abrir para escrita no ficheiro de objetos
  359.             if (users.isEmpty()){ //Se der mal, vou ver se o tamanho e zero
  360.                 User u = new User(username, password, "admin");
  361.                 users.add(u);
  362.             }
  363.             else{
  364.                 User u = new User(username, password, "normal");
  365.                 users.add(u);
  366.             }
  367.  
  368.             try {
  369.                 ObjectOutputStream oS = new ObjectOutputStream(new FileOutputStream("Users_obj.txt"));
  370.                 oS.writeObject(users);
  371.                 oS.close();
  372.  
  373.             } catch (IOException e) {
  374.                 System.out.print("ERRO");
  375.                 System.out.printf("Ocorreu a exceçao %s ao escrever no ficheiro\n", e);
  376.             }
  377.  
  378.             String rsp = "server_id|" + server_id + "; type|status;" + "; register|successful; " + "msg|Welcome to DropMusic";
  379.             try{
  380.  
  381.                 byte[] buffer = rsp.getBytes();
  382.  
  383.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  384.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  385.                 socket.send(packet);
  386.  
  387.             } catch (IOException e) {
  388.                 e.printStackTrace();
  389.             }
  390.         }
  391.  
  392.         else {
  393.             String rsp = "server_id|" + server_id + "; type|status;" + "; register|unsuccessful; " + "msg|Esse username ja existe";
  394.  
  395.             try{
  396.                 byte[] buffer = rsp.getBytes();
  397.  
  398.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  399.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  400.                 socket.send(packet);
  401.  
  402.             } catch (IOException e) {
  403.                 e.printStackTrace();
  404.             }
  405.         }
  406.  
  407.         //SÓ PARA VER QUEM TENHO REGISTADO
  408.         for (User uss: users){
  409.             System.out.println(uss.getUsername() + " " + uss.getPassword() + " -> " + uss.getUser_type());
  410.         }
  411.  
  412.  
  413.     }
  414.  
  415.     void search_music (String choice, String name, MulticastSocket socket, int server_id){ //EM FALTA
  416.         System.out.println("O cliente deseja procurar musica");
  417.  
  418.         switch (choice){
  419.             case "all": //Vai procurar por tudo o que os outros "cases" vao procurar
  420.  
  421.                 break;
  422.  
  423.             case "album": //Vai ao ficheiro de albuns e apresenta a lista de musicas desse album
  424.                 ArrayList <Album> album_list = data.get_AlbumList(); //Vai buscar o ficheiro de albuns e põe nesta arraylist
  425.                 //ArrayList <Music> aux = new ArrayList<>(); //ArrayList auxiliar para pôr todos os albuns com o nome "name"
  426.  
  427.                 for (Album a: album_list){
  428.                     if (a.getAlbum_name().equals(name)){
  429.                         for (int k = 0; k < a.music_list.size(); k++)
  430.  
  431.                         String x = "item_"+k+"_name| " + a.music_list.get(k).getName();
  432.  
  433.                     }
  434.                 }
  435.  
  436.                 int item_count = aux.size();
  437.  
  438.                 //1. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  439.                 String rsp = "server_id|" + server_id + "; type|status;" + "; music_search|successful; " + "msg|This is the music list from the searched album" +
  440.                         "item_count| " + item_count + ;
  441.  
  442.  
  443.                 try{
  444.                     byte[] buffer = rsp.getBytes();
  445.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  446.                     socket.send(packet);
  447.                 } catch (IOException e) {
  448.                     e.printStackTrace();
  449.                 }
  450.  
  451.  
  452.                 break;
  453.  
  454.             case "music":  //Vai ao ficheiro de musicas e apresenta uma lista de musicas que contenham esse nome
  455.                 ArrayList <Music> music_list; //1. CRIAR MÉTODO NA DATACONNECTION PARA IR AO FICHEIRO DE MÚSICA E PÔR TUDO NUM ARRAYLIST
  456.                 ArrayList <Music> auxappend = new ArrayList<>();
  457.  
  458.                 for (Music m: music_list){
  459.                     if (m.getName().equals(name)){
  460.                         auxappend.add(m);
  461.                     }
  462.                 }
  463.  
  464.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  465.  
  466.                 break;
  467.  
  468.             case "artist": //Vai ao ficheiro de artistas e apresenta as musicas desse artista
  469.  
  470.                 //NOTAAAA: DECIDIR SE CRIO UM FICHEIRO DE ARTISTAS OU SE NÃO É NECESSÁRIO
  471.                 ArrayList <Artist> artist_list; //1. CRIAR MÉTODO NA DATACONNECTION PARA IR AO FICHEIRO DE ARTISTAS E PÔR TUDO NUM ARRAYLIST
  472.                 ArrayList <Music> anotheraux = new ArrayList<>(); //ACHO QUE BASTA UM ÚNICO AUX NESTE MÉTODO
  473.  
  474.                 for (Music m: music_list){
  475.                     if(m.getArtist().equals(name)){
  476.                         anotheraux.add(m);
  477.                     }
  478.                 }
  479.  
  480.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  481.  
  482.                 break;
  483.  
  484.             case "genre": //Vai ao ficheiro de musicas e procura no arraylist de musicas pelo parâmetro "genre"
  485.                 ArrayList <Music> music_list; //1. CRIAR MÉTODO NA DATACONNECTION PARA IR AO FICHEIRO DE MÚSICA E PÔR TUDO NUM ARRAYLIST
  486.                 ArrayList <Music> auxaux = new ArrayList<>();
  487.  
  488.                 for (Music m: music_list){
  489.                     if (m.getGenre().equals(name)){
  490.                         auxaux.add(m);
  491.                     }
  492.                 }
  493.  
  494.                 //2. ENVIAR RESPOSTA PARA O CLIENTE COM A LISTA DE MÚSICAS
  495.  
  496.                 break;
  497.  
  498.         }
  499.  
  500.     }
  501.  
  502.     void make_editor (String username, String novo_editor, MulticastSocket socket, int server_id){ //TESTAR
  503.         System.out.println("O cliente deseja tornar o utilizador " + novo_editor + " editor");
  504.  
  505.         ArrayList <User> users = new ArrayList<>();
  506.  
  507.         try (ObjectInputStream oin = new ObjectInputStream (new FileInputStream("Users_obj.txt"))) {
  508.             users = (ArrayList) oin.readObject();
  509.         } catch (IOException e){
  510.             System.out.println(e.getMessage());
  511.         } catch (ClassNotFoundException e) {
  512.             e.printStackTrace();
  513.         }
  514.  
  515.         //Verificar se o utilizador que está a querer tornar o outro num editor é também um editor
  516.         if (data.username_match(username)) { //SUCESSO
  517.             for (User u : users) {
  518.                 if (u.getUsername().equals(username)) {
  519.                     if ((u.getUser_type().equals("editor")) || (u.getUser_type().equals("admin"))) {
  520.                         System.out.println("Tem permissao para tornar o utilizador " + novo_editor + " editor");
  521.                         for (User us : users) {
  522.                             if (us.getUsername().equals(novo_editor)) {
  523.                                 us.setUser_type("editor");
  524.                                 data.write_user_file("Users_obj.txt", users);
  525.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  526.                                 //String rsp = "server_id|" + server_id + "; type|status;" + "; logged|on; " + "msg|Welcome to DropMusic";
  527.                                 String rsp = "server_id|" + server_id + "; type|status" + "; make editor|successful; " + "msg|You can edit now";
  528.                                 try {
  529.                                     byte[] buffer = rsp.getBytes();
  530.                                     InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  531.                                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  532.                                     socket.send(packet);
  533.  
  534.                                 } catch (IOException e) {
  535.                                     e.printStackTrace();
  536.                                 }
  537.                             /*} else { //FALTA PÔR ESTE CHECK A FUNCIONAR
  538.                                 System.out.println("Utilizador nao existe");
  539.                                 //ENVIAR RESPOSTA PARA O RMI SERVER
  540.                             }*/
  541.                             }
  542.                         }
  543.                     }
  544.                 }
  545.             }
  546.  
  547.         } else { //ESSE MANO NAO CONSTA DA BASE DE DADOS
  548.             String rsp = "server_id|" + server_id + "; type|status" + "; make editor|unsuccessful; " + "msg|The user you entered is not in our database";
  549.             try {
  550.                 byte[] buffer = rsp.getBytes();
  551.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  552.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  553.                 socket.send(packet);
  554.  
  555.             } catch (IOException e) {
  556.                 e.printStackTrace();
  557.             }
  558.         }
  559.  
  560.  
  561.     }
  562.  
  563.     void manage_data (String username, String choice, String name) { //EM FALTA
  564.         System.out.println("O cliente pretende gerir artistas, álbuns e músicas");
  565.  
  566.         //1. Primeiro tenho que ver se o utilizador que quer editar a info é editor
  567.         ArrayList<User> users = new ArrayList<>();
  568.  
  569.         try (ObjectInputStream oin = new ObjectInputStream(new FileInputStream("Users_obj.txt"))) {
  570.             users = (ArrayList) oin.readObject();
  571.         } catch (IOException e) {
  572.             System.out.println(e.getMessage());
  573.         } catch (ClassNotFoundException e) {
  574.             e.printStackTrace();
  575.         }
  576.  
  577.         if (data.username_match(username)) { //SUCESSO
  578.             for (User u : users) {
  579.                 if (u.getUsername().equals(username)) {
  580.                     if (u.getUser_type().equals("editor")) {
  581.                         System.out.println("Tem permissao para editar");
  582.  
  583.                         //2. Tenho que ir ver no campo da mensagem, se é all, music, album ou review
  584.                         switch (choice) {
  585.                             case "artist":
  586.                                 String artist_name = name;
  587.  
  588.  
  589.                                 break;
  590.  
  591.                             case "album":
  592.                                 String album_title = name;
  593.  
  594.                                 break;
  595.  
  596.                             case "music":
  597.                                 String music_name = name;
  598.  
  599.                                 break;
  600.  
  601.                         }
  602.                         //3. De seguida, abro esse álbum para escrita e vou editar a info que lá está
  603.  
  604.  
  605.                         //4. Por fim envio a resposta ao utilizador
  606.  
  607.                     }
  608.                 }
  609.             }
  610.         }
  611.     }
  612.  
  613.     void search_info (String choice){ //EM FALTA
  614.         System.out.println("O cliente pretende consultar detalhes sobre álbum e sobre artista");
  615.  
  616.         //1. Ver se a choice é album ou artista
  617.         switch (choice){
  618.             case "album": //Ir ao ficheiro de albuns e mostrar toda a informacao sobre o album e mandar ao cliente
  619.  
  620.                 break;
  621.  
  622.             case "artist": //Ir ao ficheiro de artistas e mostrar toda a informacao sobre o artista e mandar ao cliente
  623.  
  624.                 break;
  625.         }
  626.     }
  627.  
  628.     void album_review (String user, String album_title, String rating, String text, MulticastSocket socket, int server_id){ //TESTAR
  629.         System.out.println("O cliente " + user + " pretende escrever uma crítica a um álbum");
  630.         //FALTA VERIFICAR SE A REVIEW TEM MENOS DE 300 CARACTERES-----------------------------------------
  631.  
  632.         //1. TENHO QUE ABRIR O FICHEIRO E PÔR LÁ A INFORMACAO
  633.         ArrayList <Album> album_list = data.get_AlbumList();
  634.         Review r = new Review(text, Integer.parseInt(rating), user);
  635.  
  636.         for (Album a: album_list){
  637.             if (a.getAlbum_name().equals(album_title)){
  638.                 a.review_list.add(r); //Adicionar a review à lista de reviews
  639.                 data.write_albumlist_file("AlbumList_obj.txt", album_list);
  640.  
  641.                 //1. NÃO SEI SE NAO PRECISO DE ADICIONAR ALGO AO MÉTODO DO RATING PARA CALCULAR O RATING MÉDIO
  642.                 String rsp = "server_id|" + server_id + "; type|status" + "; review|successful; " + "msg|Your review was submitted";
  643.                 try {
  644.                     byte[] buffer = rsp.getBytes();
  645.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT);
  646.                     socket.send(packet);
  647.                 } catch (IOException e) {
  648.                     e.printStackTrace();
  649.                 }
  650.             }
  651.             else { //ÁLBUM NÃO CONSTA DA BASE DE DADOS
  652.                 String rsp = "server_id|" + server_id + "; type|status" + "; review|unsuccessful; " + "msg|The selected album is not in our database";
  653.                 try {
  654.                     byte[] buffer = rsp.getBytes();
  655.                     DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  656.                     socket.send(packet);
  657.                 } catch (IOException e) {
  658.                     e.printStackTrace();
  659.                 }
  660.             }
  661.         }
  662.  
  663.     }
  664.  
  665.     void download (){ //EM FALTA
  666.         System.out.println("O cliente quer fazer download de uma música");
  667.     }
  668.  
  669.     void upload (){ //EM FALTA
  670.         System.out.println("O cliente quer fazer upload de uma música");
  671.     }
  672.  
  673.     void share_music (){ //EM FALTA
  674.         System.out.println("O cliente pretende partilhar música com outros utilizadores");
  675.     }
  676.  
  677. }
  678.  
  679.  
  680. class AnswerRequests extends Thread {
  681.  
  682.     //private String MULTICAST_ADDRESS = "224.3.2.1";
  683.     //private int PORT = 4444; //Porto de envio
  684.     private String message;
  685.     private String ip;
  686.     private int porto;
  687.     private MulticastSocket socket;
  688.     private int server_id;
  689.  
  690.     MessageParsing parsing = new MessageParsing();
  691.  
  692.     public AnswerRequests(String message, String ip, int porto, MulticastSocket socket, int server_id) {
  693.         this.message = message;
  694.         this.ip = ip;
  695.         this.porto = porto;
  696.         this.socket = socket;
  697.         this.server_id = server_id;
  698.     }
  699.  
  700.     public void run(){
  701.  
  702.         UDPMulticastProtocol prot = new UDPMulticastProtocol(); //Ver se é aqui que devo chamar o construtor ou não
  703.         System.out.println("Mensagem do cliente (IP: " + ip + ";Porto: " + porto + ")" + ": " + message);
  704.  
  705.         //Enviar resposta para o cliente
  706.         //MulticastSocket socket = null;
  707.  
  708.         //Parsing da mensagem
  709.         String [] pares = parsing.MessageParsing(message);
  710.         String type = pares[1];
  711.  
  712.         // De acordo com o tipo de argumento no campo "type" vamos definir a operacao pretendida e vai ser invocado o respetivo método
  713.         //Trata do pedido para depois enviar a resposta para o cliente
  714.         switch (type) {
  715.             case "login":
  716.                 prot.login(pares[2], pares[3], socket, server_id);
  717.                 break;
  718.  
  719.             case "search music":
  720.                 prot.search_music(pares[2], pares[3], socket, server_id);
  721.                 break;
  722.  
  723.             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
  724.                 String username = pares[2];
  725.                 String new_editor = pares[3];
  726.                 prot.make_editor(username, new_editor, socket, server_id); //EDITOR
  727.                 break;
  728.  
  729.             case "register":
  730.                 try {
  731.                     prot.register(pares[2], pares[3], socket, server_id);
  732.                 } catch (IOException e) {
  733.                     e.printStackTrace();
  734.                 }
  735.                 break;
  736.  
  737.             case "edit info":
  738.                 String user = pares[2];
  739.                 String search = pares[3];
  740.                 String msg = pares[4];
  741.                 prot.manage_data(user, search, msg); //EDITOR
  742.                 break;
  743.  
  744.             case "search info":
  745.                 prot.search_info(pares[2]);
  746.                 break;
  747.  
  748.             case "review":
  749.                 String userr = pares[2];
  750.                 String album_name = pares[3];
  751.                 String rating = pares[4];
  752.                 String review_text = pares[5];
  753.                 prot.album_review(userr, album_name, rating, review_text, socket, server_id); //ANY USER
  754.                 break;
  755.  
  756.             case "share music": //DEPOIS
  757.                 prot.share_music();
  758.                 break;
  759.  
  760.             case "download": //DEPOIS
  761.                 prot.download();
  762.                 break;
  763.  
  764.             case "upload":  //DEPOIS
  765.                 prot.upload();
  766.                 break;
  767.         }
  768.  
  769.     }
  770.  
  771. }
  772.  
  773. public class MulticastServer extends Thread {
  774.  
  775.     private String MULTICAST_ADDRESS = "224.3.2.1";
  776.     private int PORT = 4321; //Porto de recepção
  777.     private int BUFFER_SIZE = 4096;
  778.     private static int SERVER_ID;
  779.  
  780.     MessageParsing parsemsg = new MessageParsing();
  781.  
  782.     public static void main(String[] args) {
  783.         SERVER_ID = Integer.parseInt(args[0]); //ID DO SERVIDOR
  784.         MulticastServer server = new MulticastServer();
  785.         server.start(); //Ao invocar o start da thread, estamos a chamar o metodo run()
  786.     }
  787.  
  788.     public MulticastServer() {
  789.         //super ("Server Multicast #" + (long) (Math.random() * 100));
  790.         super ("Server Multicast #" + SERVER_ID);
  791.     }
  792.  
  793.     public void run(){
  794.         MulticastSocket socket = null;
  795.         System.out.println(this.getName() + " running..."); //Vai buscar o que está dentro do método do construtor
  796.  
  797.         try {
  798.             socket = new MulticastSocket(PORT); //cria socket e dá bind
  799.             InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  800.             socket.joinGroup(group); //dá join ao grupo multicast
  801.  
  802.  
  803.             while (true) {
  804.                 //Recepcao
  805.                 byte[] inBuffer = new byte[BUFFER_SIZE];
  806.                 DatagramPacket msgIn = new DatagramPacket(inBuffer, inBuffer.length);
  807.                 socket.receive(msgIn); //Recebe o datagrama UDP
  808.  
  809.                 String clientIP = msgIn.getAddress().getHostAddress(); //Endereço IP do cliente que enviou a mensagem
  810.                 int clientport = msgIn.getPort(); //Porto do cliente
  811.  
  812.                 String message = new String(msgIn.getData(), 0, msgIn.getLength());
  813.                 String [] fields = parsemsg.MessageParsing(message);
  814.  
  815.                 if (Integer.parseInt(fields[0]) == SERVER_ID){
  816.                     System.out.println("SO VOU RESPONDER EU -> SERVER " + SERVER_ID);
  817.  
  818.                     //Vai buscar a informação da mensagem e lança a thread para tratar do pedido
  819.                     AnswerRequests work = new AnswerRequests(message, clientIP , clientport, socket, SERVER_ID); //Também vou passar a socket por parâmetro
  820.                     work.start();
  821.                 }
  822.                 else{
  823.                     //Se for um registo, mudança de informação de álbuns ou cenas que têm que ser replicadas
  824.                     //Ou seja, tem que ir para as 3 bases de dados e vai ser este "else" que vai tratar disso
  825.                     System.out.println("VOU ESTAR QUIETO -> SERVER " + SERVER_ID);
  826.  
  827.                 }
  828.  
  829.             }
  830.  
  831.         } catch (IOException e) {
  832.             e.printStackTrace();
  833.         } finally {
  834.             socket.close(); //Fechar a socket
  835.         }
  836.     }
  837.  
  838. }
  839.  
  840. /*
  841. try{
  842.             socket = new MulticastSocket(); //Não é necessário dar bind porque está apenas a enviar
  843.             socket.setTimeToLive(1);
  844.  
  845.             Scanner keyboardScaner = new Scanner(System.in);
  846.             while (true){
  847.                 String keyboard = keyboardScaner.nextLine();
  848.                 byte[] buffer = keyboard.getBytes();
  849.  
  850.                 InetAddress group = InetAddress.getByName(MULTICAST_ADDRESS);
  851.                 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST_ADDRESS), PORT); //mudei aqui
  852.                 socket.send(packet);
  853.             }
  854.         } catch (IOException e) {
  855.             e.printStackTrace();
  856.         } finally {
  857.             socket.close();
  858.         }
  859.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement