From 2a654e486ba66f795a4f0352ead165f3e32a358b Mon Sep 17 00:00:00 2001 From: Davide Valsecchi Date: Wed, 25 Jul 2012 16:37:52 +0200 Subject: [PATCH] lavoro sul progetto --- src/it/valsecchi/polypserver/PolypServer.java | 4 +- .../polypserver/connection/Session.java | 174 ++++++++++++++++-- .../connection/SessionsManager.java | 4 + .../polypserver/data/FilesManager.java | 91 ++++++++- .../valsecchi/polypserver/data/PolypFile.java | 25 --- .../polypserver/data/UsersManager.java | 19 +- .../exception/GenericException.java | 10 + .../exception/StreamException.java | 11 ++ .../UserAlreadyConnectedException.java | 5 + 9 files changed, 299 insertions(+), 44 deletions(-) delete mode 100644 src/it/valsecchi/polypserver/data/PolypFile.java create mode 100644 src/it/valsecchi/polypserver/exception/GenericException.java create mode 100644 src/it/valsecchi/polypserver/exception/StreamException.java create mode 100644 src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java diff --git a/src/it/valsecchi/polypserver/PolypServer.java b/src/it/valsecchi/polypserver/PolypServer.java index ce5673d..eea53f5 100644 --- a/src/it/valsecchi/polypserver/PolypServer.java +++ b/src/it/valsecchi/polypserver/PolypServer.java @@ -5,6 +5,7 @@ import java.net.Socket; import it.valsecchi.polypserver.connection.SessionsManager; +import it.valsecchi.polypserver.data.FilesManager; import it.valsecchi.polypserver.data.UsersManager; import static it.valsecchi.polypserver.Utility.Log; @@ -27,7 +28,7 @@ public class PolypServer { public String polyp_path; private boolean run_polyp_server = true; - public PolypServer(String polyp_name, int port, int max_clients,String password) { + public PolypServer(String polyp_name, int port, int max_clients,String password, String path) { users_manager = new UsersManager(this); sessions_manager = new SessionsManager(this); files_manager = new FilesManager(this); @@ -35,6 +36,7 @@ public PolypServer(String polyp_name, int port, int max_clients,String password) this.port = port; this.max_clients = max_clients; this.polyp_password= password; + this.polyp_path= path; // inizializzo il server try { polyp_server = new ServerSocket(this.port, this.max_clients); diff --git a/src/it/valsecchi/polypserver/connection/Session.java b/src/it/valsecchi/polypserver/connection/Session.java index 0498bc5..8323bff 100644 --- a/src/it/valsecchi/polypserver/connection/Session.java +++ b/src/it/valsecchi/polypserver/connection/Session.java @@ -3,6 +3,9 @@ import it.valsecchi.polypserver.PolypServer; import it.valsecchi.polypserver.Utility; import it.valsecchi.polypserver.data.User; +import it.valsecchi.polypserver.exception.GenericException; +import it.valsecchi.polypserver.exception.StreamException; +import it.valsecchi.polypserver.exception.UserAlreadyConnectedException; import it.valsecchi.polypserver.exception.WrongPasswordException; import static it.valsecchi.polypserver.Utility.Log; import java.io.BufferedInputStream; @@ -11,6 +14,8 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; +import java.util.List; +import java.util.Map; import java.util.StringTokenizer; /** @@ -24,9 +29,11 @@ public class Session implements Runnable { private Socket socket; private User session_user; private String session_id; + private String user_id; private ObjectInputStream input; private ObjectOutputStream output; private PolypServer server; + private boolean session_active = false; public Session(Socket socket, PolypServer server) { // si memorizza il socket della sessione @@ -40,10 +47,51 @@ public void run() { // si avvia il thread della sessione // si acquisiscono gli stream this.getStreams(); + // la sessione è attiva + this.session_active = true; // ora si richiedono le informazioni dell'utente da confrontare con il // UsersManager - this.getUserInfo(); + try { + this.getUserInfo(); + } catch (StreamException e) { + Log.error("errore stream"); + this.close(); + return; + } catch (WrongPasswordException e) { + this.close(); + return; + } catch (UserAlreadyConnectedException e) { + this.close(); + return; + } + // ora si richiede la lista file e si invia quella del server + try { + this.manageFileList(); + } catch (StreamException e) { + Log.error("errore stream"); + this.close(); + return; + } catch (GenericException e) { + this.close(); + return; + } + // ora si sta in attesa di richieste. + this.listenForRequests(); + } + private void listenForRequests() { + try { + while (this.session_active) { + String cmd = this.readString(); + switch(cmd){ + + } + + + } + } catch (StreamException e) { + + } } /** Apre gli stream */ @@ -57,15 +105,17 @@ private void getStreams() { } } - /** Recupera le informazioni dell'utente e lo registra */ - public void getUserInfo() { + /** + * Recupera le informazioni dell'utente e lo registra + * + * @throws StreamException + * @throws WrongPasswordException + * @throws UserAlreadyConnectedException + */ + public void getUserInfo() throws StreamException, WrongPasswordException, + UserAlreadyConnectedException { String user_info = ""; - try { - user_info = (String) input.readObject(); - } catch (ClassNotFoundException | IOException e) { - Log.error("errore ricezione informazioni utente. sessione: " - + this.session_id); - } + user_info = this.readString(); StringTokenizer tok = new StringTokenizer(user_info, "@"); String userid, username, password; userid = tok.nextToken(); @@ -77,14 +127,24 @@ public void getUserInfo() { } catch (WrongPasswordException e) { // password errata Log.error("User: " + userid + ", password errata!"); - // si chiude - this.close(); + // si invia la risposta + this.sendConnectionAnswer("WRONG_PASSWORD"); + throw e; } // si attiva l'utente - server.users_manager.activateUser(userid); - + boolean connected = server.users_manager.activateUser(userid); + if (connected == false) { + // si chiude perchè è già connesso + Log.error("user già connesso: " + userid); + this.sendConnectionAnswer("ALREADY_CONNECTED"); + throw new UserAlreadyConnectedException(); + } + // si indica all'utente l'avvenuta connessione + this.sendConnectionAnswer("CONNECTED"); + this.user_id = userid; } + /** Si chiude la sessione */ public void close() { try { Log.info("chiusura sessione: " + this.session_id); @@ -92,11 +152,99 @@ public void close() { output.close(); input.close(); socket.close(); + // si disattiva l'utente + server.users_manager.deactivateUser(this.user_id); + // si elimina la sessione + server.sessions_manager.removeSession(this); + // la sessione non è più attiva + session_active = false; } catch (IOException e) { Log.error("errore chiusura sessione: " + this.session_id); } } + /** + * Metodo che gestisasce lo scambio della lista file + * + * @throws StreamException + * @throws GenericException + */ + private void manageFileList() throws StreamException, GenericException { + List file_list = null; + try { + file_list = this.readFileList(); + } catch (StreamException e) { + // si risponde che c'è stato un'errore + this.sendAnswer("ERRORE_LISTA"); + throw e; + } + // si invia l'ok + this.sendAnswer("OK"); + // si invia al file manager per aggiornarla + server.files_manager.setFileList(this.user_id, file_list); + // ora si invia la lista file completa + this.sendFileList(); + // si attende la risposta + String ans; + ans = this.readString(); + if (ans.equals("OK")) { + // ok la connessione è effettuata + } else if (ans.equals("ERROR")) { + // Si chiude la connessione + this.close(); + Log.error("errore comunicazione lista file"); + throw new GenericException(); + } + } + + /** Metodo che legge le stringhe inviate dal client */ + private String readString() throws StreamException { + try { + return (String) input.readObject(); + } catch (ClassNotFoundException | IOException e) { + Log.error("errore lettura stringa"); + throw new StreamException("errore lettura stringa"); + } + } + + private List readFileList() throws StreamException { + try { + return (List) input.readObject(); + } catch (ClassNotFoundException | IOException e) { + Log.error("errore lettura lista file"); + throw new StreamException("errore lettura lista file"); + } + } + + public void sendFileList() throws StreamException { + try { + output.writeObject(server.files_manager.getFileList()); + } catch (IOException e) { + Log.error("errore invio lista file"); + throw new StreamException("errore invio lista file"); + } + } + + public void sendConnectionAnswer(String ans) throws StreamException { + try { + output.writeObject(ans); + output.flush(); + } catch (IOException e) { + Log.error("errore invio risposta connessione"); + throw new StreamException("errore invio risposta connessione"); + } + } + + public void sendAnswer(String ans) throws StreamException { + try { + output.writeObject(ans); + output.flush(); + } catch (IOException e) { + Log.error("errore invio risposta"); + throw new StreamException("errore invio risposta"); + } + } + public Socket getSocket() { return socket; } diff --git a/src/it/valsecchi/polypserver/connection/SessionsManager.java b/src/it/valsecchi/polypserver/connection/SessionsManager.java index 1ea29b8..eff07c7 100644 --- a/src/it/valsecchi/polypserver/connection/SessionsManager.java +++ b/src/it/valsecchi/polypserver/connection/SessionsManager.java @@ -35,4 +35,8 @@ public void addSession(Socket socket) { Session session = new Session(socket,server); this.addSession(session); } + + public void removeSession(Session session){ + sessionsList.remove(session); + } } diff --git a/src/it/valsecchi/polypserver/data/FilesManager.java b/src/it/valsecchi/polypserver/data/FilesManager.java index 21c049c..a934d7f 100644 --- a/src/it/valsecchi/polypserver/data/FilesManager.java +++ b/src/it/valsecchi/polypserver/data/FilesManager.java @@ -1,8 +1,23 @@ package it.valsecchi.polypserver.data; +import static it.valsecchi.polypserver.Utility.Log; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.jdom2.Attribute; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + import it.valsecchi.polypserver.PolypServer; /** @@ -12,12 +27,84 @@ * */ public class FilesManager { - - private Map> filesMap; + + private Map> filesMap; private PolypServer server; public FilesManager(PolypServer server) { this.server = server; + //si caricano i dati + this.loadFiles(); + } + + /** Metodo che legge i file dal server del server da file files_data */ + private void loadFiles() { + // si legge il file Users + Document doc = new Document(); + if (Files.exists(Paths.get(server.polyp_path + + "\\files\\files_data.xml"))) { + // solo se esiste si legge se no si lascia così + SAXBuilder build = new SAXBuilder(); + try { + doc = build + .build(server.polyp_path + "\\files\\files_data.xml"); + } catch (JDOMException | IOException e) { + Log.error("errore lettura dati file"); + } + } + // ora si leggono i dati e si creano gli user + for (Element e : doc.getRootElement().getChildren("user_id")) { + for (Element e2 : e.getChildren("file")) { + this.addFile(e.getAttributeValue("id"), e2.getText()); + } + } + } + + /** Metodo che scrive i dati degli files nel file files_data */ + public void writeUsers() { + // si crea un document e lo si scrive + Document doc = new Document(); + doc.setRootElement(new Element("files_data")); + for (String u:filesMap.keySet()){ + Element e = new Element("user_id"); + e.setAttribute(new Attribute("id",u)); + for(String f: filesMap.get(u)){ + Element fi = new Element("file").setText(f); + e.addContent(fi); + } + doc.getRootElement().addContent(e); + } + XMLOutputter outputter = new XMLOutputter(); + outputter.setFormat(Format.getPrettyFormat()); + FileOutputStream output; + try { + output = new FileOutputStream(server.polyp_path + + "\\files\\files_data.xml"); + outputter.output(doc, output); + } catch (IOException e) { + Log.error("errore scrittura dati files"); + } } + public void addFile(String user_id, String file) { + if (filesMap.containsKey(user_id)) { + filesMap.get(user_id).add(file); + } else { + filesMap.put(user_id, new ArrayList()); + } + } + + public void setFileList(String user_id, List files){ + if(filesMap.containsKey(user_id)){ + filesMap.get(user_id).clear(); + filesMap.get(user_id).addAll(files); + }else{ + filesMap.put(user_id, files); + } + } + + public Map> getFileList(){ + return filesMap; + } + } diff --git a/src/it/valsecchi/polypserver/data/PolypFile.java b/src/it/valsecchi/polypserver/data/PolypFile.java deleted file mode 100644 index 7e25a68..0000000 --- a/src/it/valsecchi/polypserver/data/PolypFile.java +++ /dev/null @@ -1,25 +0,0 @@ -package it.valsecchi.polypserver.data; - -/** - * Rappresenta un file nell'applicazione - * @author Davide - * - */ -public class PolypFile { - - private String userid; - private String filename; - - public PolypFile(String userid,String filename){ - this.userid= userid; - this.filename= filename; - } - - public String getUserid() { - return userid; - } - - public String getFilename() { - return filename; - } -} diff --git a/src/it/valsecchi/polypserver/data/UsersManager.java b/src/it/valsecchi/polypserver/data/UsersManager.java index ad70b0b..c7199a0 100644 --- a/src/it/valsecchi/polypserver/data/UsersManager.java +++ b/src/it/valsecchi/polypserver/data/UsersManager.java @@ -46,7 +46,7 @@ private void loadUsers() { } // ora si leggono i dati e si creano gli user for (Element e : doc.getRootElement().getChildren("user")) { - this.addUser(new User((String) e.getChildText("id"), (String) e + this.addUser(new User(e.getChildText("id"), e .getChildText("username"))); } } @@ -92,9 +92,22 @@ public void addUser(String userid, String username, String password) } } - public void activateUser(String userid) { + public boolean activateUser(String userid) { if (usersMap.containsKey(userid)) { - usersMap.get(userid).setOnline(true); + if (usersMap.get(userid).isOnline() == true) { + return false; + } else { + usersMap.get(userid).setOnline(true); + return true; + } + } else { + return false; + } + } + + public void deactivateUser(String userid) { + if (usersMap.containsKey(userid)) { + usersMap.get(userid).setOnline(false); } } diff --git a/src/it/valsecchi/polypserver/exception/GenericException.java b/src/it/valsecchi/polypserver/exception/GenericException.java new file mode 100644 index 0000000..c6a3909 --- /dev/null +++ b/src/it/valsecchi/polypserver/exception/GenericException.java @@ -0,0 +1,10 @@ +package it.valsecchi.polypserver.exception; + +public class GenericException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -8475111504764690832L; + +} diff --git a/src/it/valsecchi/polypserver/exception/StreamException.java b/src/it/valsecchi/polypserver/exception/StreamException.java new file mode 100644 index 0000000..5e95173 --- /dev/null +++ b/src/it/valsecchi/polypserver/exception/StreamException.java @@ -0,0 +1,11 @@ +package it.valsecchi.polypserver.exception; + +public class StreamException extends Exception { + + private static final long serialVersionUID = 121931363756498398L; + + public StreamException(String mess) { + super(mess); + } + +} diff --git a/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java b/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java new file mode 100644 index 0000000..d71227f --- /dev/null +++ b/src/it/valsecchi/polypserver/exception/UserAlreadyConnectedException.java @@ -0,0 +1,5 @@ +package it.valsecchi.polypserver.exception; + +public class UserAlreadyConnectedException extends Exception { + +}