diff --git a/Jenkinsfile b/Jenkinsfile index 399f133..d1f3664 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,6 +14,9 @@ sh 'echo "BUILDING TRACKER"' sh 'echo Main-Class: tracker/Tracker > MANIFEST.MF' sh 'jar -cvmf MANIFEST.MF tracker.jar $(find bin/ -maxdepth 1 -mindepth 1 -printf "-C bin %f\n")' + sh 'echo "BUILDING CLIENT GUI"' + sh 'echo Main-Class: gui/Gui > MANIFEST.MF' + sh 'jar -cvmf MANIFEST.MF clientGUI.jar $(find bin/ -maxdepth 1 -mindepth 1 -printf "-C bin %f\n")' sh 'echo "CREATING sources.tar.gz"' sh 'tar -zcvf sources.tar.gz src/' } @@ -29,6 +32,7 @@ archiveArtifacts artifacts: 'client.jar', fingerprint: true archiveArtifacts artifacts: 'server.jar', fingerprint: true archiveArtifacts artifacts: 'tracker.jar', fingerprint: true + archiveArtifacts artifacts: 'clientGUI.jar', fingerprint:true archiveArtifacts artifacts: 'sources.tar.gz', fingerprint: true } } diff --git a/src/exception/LocalException.java b/src/exception/LocalException.java index 2fbc0f2..6ee4520 100644 --- a/src/exception/LocalException.java +++ b/src/exception/LocalException.java @@ -1,5 +1,5 @@ package exception; public abstract class LocalException extends Exception { - private static final long serialVersionUID = 12L; + private static final long serialVersionUID = 13L; } diff --git a/src/gui/ArgumentsGen.java b/src/gui/ArgumentsGen.java new file mode 100644 index 0000000..c7bb5d3 --- /dev/null +++ b/src/gui/ArgumentsGen.java @@ -0,0 +1,179 @@ +package gui; + +import javax.swing.JFrame; +import javax.swing.SwingUtilities; + +/** +* @author Louis Royer +* @author Flavien Haas +* @author JS Auge +*@version 1.0 + */ +public class ArgumentsGen extends javax.swing.JPanel { + + + private javax.swing.JButton jButton1; + private javax.swing.JComboBox jComboBox1; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JTextField jTextField1; + private javax.swing.JTextField jTextField2; + private javax.swing.JTextField jTextField3; + private javax.swing.JTextField jTextField4; + private static final long serialVersionUID = 13L; + + /** + * Creates new form ArgumentsGen + */ + public ArgumentsGen() { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + */ + + @SuppressWarnings("unchecked") + // + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + jLabel6 = new javax.swing.JLabel(); + jComboBox1 = new javax.swing.JComboBox<>(); + jTextField1 = new javax.swing.JTextField("7070"); + jTextField2 = new javax.swing.JTextField("localhost"); + jTextField3 = new javax.swing.JTextField("localhost"); + jTextField4 = new javax.swing.JTextField("6969"); + jButton1 = new javax.swing.JButton(); + + jLabel1.setText("Enter connection informations:"); + + jLabel2.setText("Server hostname:"); + + jLabel3.setText("Server port:"); + + jLabel4.setText("Tracker hostname:"); + + jLabel5.setText("Tracker port:"); + + jLabel6.setText("Client's protocol:"); + + jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "TCP", "UDP" })); + + jTextField1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField1ActionPerformed(evt); + } + }); + + jTextField2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jTextField2ActionPerformed(evt); + } + }); + + jButton1.setText("Connect"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jLabel3) + .addComponent(jLabel4) + .addComponent(jLabel5) + .addComponent(jLabel6)) + .addGap(71, 71, 71) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jTextField1) + .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE) + .addComponent(jTextField3) + .addComponent(jTextField4))))) + .addContainerGap(138, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addGap(19, 19, 19) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(7, 7, 7) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(6, 6, 6) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 12, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton1) + .addContainerGap(16, Short.MAX_VALUE)) + ); + }// + + private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { + // TODO add your handling code here: + } + + private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) { + // TODO add your handling code here: + } + + +/** Actions when click on connect: creat a clientP2Pgui with the infos from textfields*/ + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { + String hostnameServer = jTextField2.getText(); + String portServerStr = jTextField1.getText(); + String hostnameTracker = jTextField3.getText(); + String portTrackerStr = jTextField4.getText(); + String protocolClient = jComboBox1.getSelectedItem().toString(); + System.out.println("hostnameServer: " + hostnameServer); + System.out.println("portServer: " + portServerStr); + System.out.println("hostnameTracker: " + hostnameTracker); + System.out.println("portTracker: " + portTrackerStr); + System.out.println("protocol: " + protocolClient); + int portServer = Integer.parseInt(portServerStr); + int portTracker = Integer.parseInt(portTrackerStr); + ClientP2PGUI c = new ClientP2PGUI(hostnameServer, portServer, hostnameTracker, portTracker, protocolClient); + c.connect(); + JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); + topFrame.dispose(); + } + +} diff --git a/src/gui/ClientInterfaceGUI.java b/src/gui/ClientInterfaceGUI.java new file mode 100644 index 0000000..238f950 --- /dev/null +++ b/src/gui/ClientInterfaceGUI.java @@ -0,0 +1,145 @@ +package gui; + +import clientP2P.*; +import clientP2P.ClientInterface; +import clientP2P.ClientManagement; +import tools.SearchFile; +import tools.LogLevel; +import tools.Logger; +import localException.ProtocolError; +import localException.InternalError; +import localException.ProtocolError; +import localException.SizeError; +import localException.TransmissionError; +import localException.VersionError; +import localException.SocketClosed; +import remoteException.EmptyFile; +import remoteException.EmptyDirectory; +import remoteException.InternalRemoteError; +import remoteException.NotFound; +import remoteException.ProtocolRemoteError; +import remoteException.VersionRemoteError; +import remoteException.NotATracker; +import remoteException.UnknownHost; +import java.io.IOException; +import java.net.UnknownHostException; +import java.net.SocketException; +import javax.swing.JFrame; +import serverP2P.ServerManagementUDP; +import serverP2P.ServerManagementTCP; + +/** Implementation of P2P-JAVA-PROJECT CLIENT interface for CLI + * @author Louis Royer + * @author Flavien Haas + * @author JS Auge + * @version 1.0 + */ +public class ClientInterfaceGUI extends ClientInterface { + + /** Constructor with clientManagement, logger and scanner. + * @param clientManagement ClientManagement used + * @param logger Logger used + */ + + Logger loggerC; + private ServerManagementTCP smtcp; + private ServerManagementUDP smudp; + + + public ClientInterfaceGUI(ClientManagement clientManagement, Logger logger, ServerManagementTCP smtcp, ServerManagementUDP smudp) { + super(clientManagement, logger); + this.loggerC = logger; + this.smtcp = smtcp; + this.smudp = smudp; + } + + /** Implementation of Runnable + */ + + + public void run(){ + boolean isRunning = initHostList(); + if (isRunning) { + try{ + int i = 1; + SearchFile searchEngine = new SearchFile(); + int optionSearch = 0; + String searchInput = ""; + String[] list = clientManagement.listDirectory(); + //System.out.println("running ClientInterfaceGUI and creating window"); + //for(String listItem: list){ + //System.out.println(listItem); + //} + JFrame win = new JFrame(); + win.setTitle("Client"); + win.setSize(550, 250); + win.setLocationRelativeTo(null); + win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + win.add(new DownloadSelectionGen(list, clientManagement, loggerC, smtcp, smudp)); + win.setVisible(true); + } catch (EmptyDirectory e) { + writeLog("Server has no file in directory", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server has no file in directory"); + } + catch (InternalError e) { + writeLog("Client internal error", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Client internal error"); + } catch (UnknownHostException e) { + writeLog("Server host is unknown", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server host is unknown"); + } catch (IOException e) { + writeLog("Request cannot be send or response cannot be received", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Request cannot be send or response cannot be received"); + } catch (TransmissionError e) { + writeLog("Message received is too big", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Message received is too big"); + } catch (ProtocolError e) { + writeLog("Cannot decode server’s response", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Cannot decode server’s response"); + } catch (VersionError e) { + writeLog("Server’s response use bad version of the protocol", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server’s response use bad version of the protocol"); + } catch (SizeError e) { + writeLog("Cannot handle this packets because of internal representation limitations of numbers on the client", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Cannot handle this packets because of internal representation limitations of numbers on the client"); + } catch (InternalRemoteError e) { + writeLog("Server internal error", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server internal error"); + } catch (ProtocolRemoteError e) { + writeLog("Server cannot decode client’s request", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server cannot decode client’s request"); + } catch (VersionRemoteError e) { + writeLog("Server cannot decode this version of the protocol", LogLevel.Error); + ErrorFrame err = new ErrorFrame("Server cannot decode this version of the protocol"); + } + } + } + + + /** Initialization of hostList with retry in failure + * @return true if successfully initialized + */ + private boolean initHostList() { + boolean contacted = false; + boolean firstLoop = true; + boolean stop = false; + while (!contacted && !stop) { + try { + if (!firstLoop) { + writeLog("Cannot contact tracker... ", LogLevel.Error); + } + firstLoop = false; + clientManagement.initHostList(); + contacted = true; + } catch (SocketException e) { + } catch (UnknownHostException e) { + } catch (IOException e) { + } catch (Exception e) { + return false; + } + } + return !stop; + } + + +} diff --git a/src/gui/ClientP2PGUI.java b/src/gui/ClientP2PGUI.java new file mode 100644 index 0000000..e054cb9 --- /dev/null +++ b/src/gui/ClientP2PGUI.java @@ -0,0 +1,133 @@ +package gui; + +import clientP2P.*; +import java.util.List; +import clientP2P.ClientManagementUDP; +import clientP2P.ClientManagementTCP; +import serverP2P.ServerManagementUDP; +import clientP2P.ClientInterfaceCLI; +import serverP2P.ServerManagementTCP; +import tools.Logger; +import tools.LogLevel; +import tools.Directories; +import tools.HostItem; +import tools.ServerPortRange; +import tools.TrackerPortRange; + +/** Client + Server implementation in GUI + * @author Louis Royer + * @author Flavien Haas + * @author JS Auge + * @version 1.0 + */ + +public class ClientP2PGUI { + private String logDir = "logs/"; + private String partsDir = ".parts/"; + private Logger loggerServer; + private Logger loggerClient; + private Directories directories; + private HostItem tracker; + private HostItem server; + final static boolean DEBUG = false; + private String hostnameServer; + private String hostnameTracker; + private int portServer; + private int portTracker; + private String protocolP2P; + + /** Initialize loggers if directories and logger are null, + * else fail silently. + */ + public void initDirectoriesAndLoggers() { + if (directories == null && loggerServer == null && loggerClient == null) { + directories = new Directories("P2P_JAVA_PROJECT_" + server.getPort()); + directories.createSubdir(logDir); + loggerServer = new Logger(directories.getDataHomeDirectory() + logDir + "server.log", DEBUG); + loggerClient = new Logger(directories.getDataHomeDirectory() + logDir + "client.log", DEBUG); + directories.createSubdir(partsDir); + } + } + + /** Constructor. + * @param hostnameServer hostname to bind + * @param portServer port to bind + * @param hostnameTracker hostname of tracker + * @param portTracker port of tracker + * @param protocolP2P protocol used + */ + public ClientP2PGUI(String hostnameServer, int portServer, String hostnameTracker, int portTracker, String protocolP2P) { + + this.hostnameServer = hostnameServer; + this.hostnameTracker = hostnameTracker; + this.portServer = portServer; + this.portTracker = portTracker; + this.protocolP2P = protocolP2P; + final ServerPortRange serverPortRange = new ServerPortRange(); + final TrackerPortRange trackerPortRange = new TrackerPortRange(); + if (!serverPortRange.isPortInRange(portServer)){ + ErrorFrame erreur = new ErrorFrame("SERVER: Port not in range. "); + } + if (!trackerPortRange.isPortInRange(portTracker)){ + ErrorFrame erreur = new ErrorFrame("TRACKER: Port not in range"); + } + server = new HostItem(hostnameServer, portServer); + tracker = new HostItem(hostnameTracker, portTracker); + initDirectoriesAndLoggers(); + System.out.println("Server will listen on port " + portServer + " and serve files from " + directories.getDataHomeDirectory()); + } + +/**Initiate a connection using fields from ArgumentsGen*/ + + public void connect(){ + System.out.println("using hostname : " + hostnameServer); + System.out.println("using port : " + portServer); + System.out.println("tracker hostname : " + hostnameTracker); + System.out.println("tracker port : " + portTracker); + ServerManagementUDP smudp = new ServerManagementUDP(directories.getDataHomeDirectory(), server, tracker, loggerServer); + ServerManagementTCP smtcp = new ServerManagementTCP(directories.getDataHomeDirectory(), server, tracker, loggerServer); + Thread tudp = new Thread(smudp); + tudp.setName("server UDP P2P-JAVA-PROJECT"); + tudp.start(); + Thread ttcp = new Thread(smtcp); + ttcp.setName("server TCP P2P-JAVA-PROJECT"); + ttcp.start(); + + // Wait a bit before printing client interface + // This is not required, but allow to have a cleaner interface + try { + Thread.sleep(200); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + Thread tclient; + switch (protocolP2P) { + case "UDP": + case "udp": + case "upd": // to avoid users typos + case "2" : + System.out.println("Starting with UDP"); + ClientManagementUDP cmudp = new ClientManagementUDP(directories.getDataHomeDirectory(), tracker, directories.getDataHomeDirectory() + partsDir, loggerClient, server); + tclient = new Thread(new ClientInterfaceGUI(cmudp, loggerClient, smtcp, smudp)); + break; + case "TCP": + case "tcp": + case "1": + default: + System.out.println("Starting with TCP"); + ClientManagementTCP cmtcp = new ClientManagementTCP(directories.getDataHomeDirectory(), tracker, directories.getDataHomeDirectory() + partsDir, loggerClient, server); + tclient = new Thread(new ClientInterfaceGUI(cmtcp, loggerClient, smtcp, smudp)); + break; + } + tclient.setName("client P2P-JAVA-PROJECT GUI"); + tclient.start(); + try { + tclient.join(); + } catch (InterruptedException e) {} + //smudp.setStop(); + //smtcp.setStop(); + } + + +} diff --git a/src/gui/DownloadFileGUI.java b/src/gui/DownloadFileGUI.java new file mode 100644 index 0000000..bf08432 --- /dev/null +++ b/src/gui/DownloadFileGUI.java @@ -0,0 +1,88 @@ +package gui; + +import clientP2P.*; +import clientP2P.ClientInterface; +import clientP2P.ClientManagement; +import tools.SearchFile; +import tools.LogLevel; +import tools.Logger; +import localException.ProtocolError; +import localException.InternalError; +import localException.ProtocolError; +import localException.SizeError; +import localException.TransmissionError; +import localException.VersionError; +import localException.SocketClosed; +import remoteException.EmptyFile; +import remoteException.EmptyDirectory; +import remoteException.InternalRemoteError; +import remoteException.NotFound; +import remoteException.ProtocolRemoteError; +import remoteException.VersionRemoteError; +import remoteException.NotATracker; +import remoteException.UnknownHost; +import java.io.IOException; +import java.net.UnknownHostException; +import java.net.SocketException; +import javax.swing.JFrame; +import javax.swing.JPanel; +import serverP2P.ServerManagementUDP; +import serverP2P.ServerManagementTCP; + + +public class DownloadFileGUI extends JPanel{ + + + private static final long serialVersionUID = 13L; + private String fileToDownload; + private ClientManagement clientManagement; + private Logger logger; + private ServerManagementTCP smtcp; + private ServerManagementUDP smudp; + + + public DownloadFileGUI(String fileToDownload, ClientManagement clientManagement, Logger logger, ServerManagementTCP smtcp, ServerManagementUDP smudp){ + this.fileToDownload = fileToDownload; + this.clientManagement = clientManagement; + this.logger = logger; + this.smtcp = smtcp; + this.smudp = smudp; + } + + public void download() { + try { + System.out.println("Downloading " + fileToDownload + " ... "); + clientManagement.download(fileToDownload); + smudp.setStop(); + smtcp.setStop(); + ErrorFrame erreur = new ErrorFrame("File " + fileToDownload + " sucessfully downloaded"); + } catch (NumberFormatException e) { + ErrorFrame erreur = new ErrorFrame("File " + fileToDownload + " unsucessfully downloaded, wrong number"); + } catch (InternalError e) { + ErrorFrame err = new ErrorFrame("Client internal error"); + } catch (UnknownHostException e) { + ErrorFrame err = new ErrorFrame("Server host is unknown"); + } catch (IOException e) { + ErrorFrame err = new ErrorFrame("Request cannot be send or response cannot be received"); + } catch (TransmissionError e) { + ErrorFrame err = new ErrorFrame("Message received is too big"); + } catch (ProtocolError e) { + ErrorFrame err = new ErrorFrame("Cannot decode server’s response"); + } catch (VersionError e) { + ErrorFrame err = new ErrorFrame("Server’s response use bad version of the protocol"); + } catch (SizeError e) { + ErrorFrame err = new ErrorFrame("Cannot handle this packets because of internal representation limitations of numbers on the client"); + } catch (InternalRemoteError e) { + ErrorFrame err = new ErrorFrame("Server internal error"); + } catch (ProtocolRemoteError e) { + ErrorFrame err = new ErrorFrame("Server cannot decode client’s request"); + } catch (VersionRemoteError e) { + ErrorFrame err = new ErrorFrame("Server cannot decode this version of the protocol"); + } catch (NotFound e) { + ErrorFrame err = new ErrorFrame("Server has not this file in directory"); + } catch (EmptyFile e) { + ErrorFrame err = new ErrorFrame("File is empty"); + } + } + +} diff --git a/src/gui/DownloadSelectionGen.java b/src/gui/DownloadSelectionGen.java new file mode 100644 index 0000000..a48b8b1 --- /dev/null +++ b/src/gui/DownloadSelectionGen.java @@ -0,0 +1,143 @@ +package gui; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + + + import javax.swing.JFrame; + import javax.swing.SwingUtilities; + import clientP2P.*; + import tools.LogLevel; + import tools.Logger; + import serverP2P.ServerManagementUDP; + import serverP2P.ServerManagementTCP; + +/** +* @author Louis Royer +* @author Flavien Haas +* @author JS Auge +* @version 1.0 + */ +public class DownloadSelectionGen extends javax.swing.JPanel { + + private javax.swing.JButton jButton1; + private javax.swing.JButton jButton2; + private javax.swing.JLabel jLabel1; + private javax.swing.JList jList1; + private javax.swing.JScrollPane jScrollPane1; + private static final long serialVersionUID = 13L; + private String[] listFilesToDownload; + private ClientManagement clientManagement; + private Logger logger; + private ServerManagementTCP smtcp; + private ServerManagementUDP smudp; + + + /** + * @param listFilesToDownload list of files to display + * @param clientManagement clientManagement + * @param logger logger + * Creates new form ArgumentsGen + */ + public DownloadSelectionGen(String[] listFilesToDownload, ClientManagement clientManagement, Logger logger, ServerManagementTCP smtcp, ServerManagementUDP smudp) { + this.listFilesToDownload = listFilesToDownload; + this.clientManagement = clientManagement; + this.logger = logger; + this.smtcp = smtcp; + this.smudp = smudp; + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + */ + @SuppressWarnings("unchecked") + // + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + jButton1 = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + jList1 = new javax.swing.JList<>(); + jButton2 = new javax.swing.JButton(); + + jLabel1.setText("Select a file to download:"); + + jButton1.setText("Download"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + jList1.setModel(new javax.swing.AbstractListModel() { + String[] strings = listFilesToDownload; + public int getSize() { return strings.length; } + public String getElementAt(int i) { return strings[i]; } + }); + jScrollPane1.setViewportView(jList1); + + jList1.setSelectedIndex(0); + jButton2.setText("Back"); + jButton2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton2ActionPerformed(evt); + } + }); + + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(97, 97, 97) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(104, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(jButton2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(23, 23, 23)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jButton1) + .addComponent(jButton2)) + .addContainerGap(24, Short.MAX_VALUE)) + ); + }// + + + /** Actions to initiate when button "Download" is pressed */ + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { + String fileSelected = jList1.getSelectedValue(); + System.out.println("File to download: " + fileSelected); + DownloadFileGUI dl = new DownloadFileGUI(fileSelected, clientManagement, logger, smtcp, smudp); + dl.download(); + } + + /** Actions to initiate when button "Back" is initiate */ + private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { + ArgumentsGen a = new ArgumentsGen(); + JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); + topFrame.add(a); + this.setVisible(false); + } + +} diff --git a/src/gui/ErrorFrame.java b/src/gui/ErrorFrame.java new file mode 100644 index 0000000..2cdb577 --- /dev/null +++ b/src/gui/ErrorFrame.java @@ -0,0 +1,92 @@ +package gui; + + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + + /** + * @author Louis Royer + * @author Flavien Haas + * @author JS Auge + * @version 1.0 + */ +public class ErrorFrame extends javax.swing.JFrame { + + private javax.swing.JLabel jLabel1; + private javax.swing.JToggleButton jToggleButton1; + private String message; + private static final long serialVersionUID = 13L; + + + /** + * @param message error message that will be displayed + * Create new Errorframe, used to display an error and stop the program when needed + */ + + public ErrorFrame(String message) { + this.message = message; + initComponents(); + this.setVisible(true); + } + + /** + * This method is called from within the constructor to initialize the form. + */ + @SuppressWarnings("unchecked") + // + private void initComponents() { + + jToggleButton1 = new javax.swing.JToggleButton(); + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + + jToggleButton1.setText("Close"); + jToggleButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jToggleButton1ActionPerformed(evt); + } + }); + + jLabel1.setText(message); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1)) + .addGroup(layout.createSequentialGroup() + .addGap(253, 253, 253) + .addComponent(jToggleButton1))) + .addContainerGap(205, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addGap(30, 30, 30) + .addComponent(jToggleButton1) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + this.setLocationRelativeTo(null); + this.setAlwaysOnTop(true); + pack(); + }// + + + /**force exit the program when the button "Close" is pressed*/ + private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) { + System.exit(1); + } + + +} diff --git a/src/gui/Gui.java b/src/gui/Gui.java new file mode 100644 index 0000000..1272a84 --- /dev/null +++ b/src/gui/Gui.java @@ -0,0 +1,20 @@ +package gui; + +import javax.swing.JFrame; + +/** Class to download file +* @author Louis Royer +* @author Flavien Haas +* @author JS Auge +* @version 1.0 +* Class used to create the Graphical interface +*/ + +public class Gui{ + + public static void main(String[] args) { + MainWindow win = new MainWindow(); + } + + +} diff --git a/src/gui/MainWindow.java b/src/gui/MainWindow.java new file mode 100644 index 0000000..fd3dbe7 --- /dev/null +++ b/src/gui/MainWindow.java @@ -0,0 +1,28 @@ +package gui; + +import javax.swing.JFrame; + +/** Class to download file +* @author Louis Royer +* @author Flavien Haas +* @author JS Auge +* @version 1.0 +* Class used to create the main window of the GUI +*/ + + +public class MainWindow extends JFrame{ + + private static final long serialVersionUID = 13L; + + public MainWindow(){ + JFrame fenetre = new JFrame(); + fenetre.setTitle("Client"); + fenetre.setSize(550, 250); + fenetre.setLocationRelativeTo(null); + fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + fenetre.add(new ArgumentsGen()); + fenetre.setVisible(true); + } + +}