Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 31.16 KB | None | 0 0
  1. // Gruppe 4: Usmanov, Reschke, Vogel
  2.  
  3. import java.io.*;
  4. import java.net.Socket;
  5. import java.net.UnknownHostException;
  6. import java.util.ArrayList;
  7. import java.util.Optional;
  8. import javafx.application.Application;
  9. import javafx.event.ActionEvent;
  10. import javafx.geometry.Insets;
  11. import javafx.geometry.Pos;
  12. import javafx.scene.Scene;
  13. import javafx.scene.control.*;
  14. import javafx.scene.control.Alert.AlertType;
  15. import javafx.scene.layout.GridPane;
  16. import javafx.scene.layout.HBox;
  17. import javafx.scene.layout.VBox;
  18. import javafx.scene.text.Font;
  19. import javafx.scene.text.FontWeight;
  20. import javafx.scene.text.Text;
  21. import javafx.stage.Stage;
  22.  
  23. /**
  24.  * This class extends Application and has several functions that focus on the
  25.  * Graphical User Interface. It displays a menu to the user in which he
  26.  * can choose what action to take next. The class contains an OutputStream
  27.  * {@link #outStrClient} and an InputStream {@link #inStrClient} to
  28.  * create a connection to 'Server'.
  29.  *
  30.  * @see Server
  31.  * @see ServerGUI
  32.  * @see Controller
  33.  * @see Person
  34.  * @see Database
  35.  * @see DatabaseSQL
  36.  * @see DatabaseCSV
  37.  *
  38.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  39.  */
  40. public class Client extends Application {
  41.     private static Socket cSocket;
  42.     private static OutputStream outStrClient;
  43.     private static InputStream inStrClient;
  44.     private static int serverPort;
  45.     private static String serverIP;
  46.     private static int persNr = 0;
  47.     private static String[] persDatenCheck = {
  48.             "[A-ZÄÖÜ][a-zäöüß\\-\\s]+",
  49.             "[A-ZÄÖÜ][a-zäöüß\\-\\s]+",
  50.             "Herr|Frau|AttackHelicopter",
  51.             "[A-ZÄÖÜ][a-zäöüß\\-\\s\\.]+[1-9][0-9]*[a-z]?",
  52.             "[0-9]{5}",
  53.             "[A-Za-zäöüÄÖÜß\\s\\-]{3,40}",
  54.             "[0-9\\.\\-]*",
  55.             "[0-9\\.\\-]*",
  56.             "[^;]{0,300}" };
  57.  
  58.    
  59.     /**
  60.      * This is the Client's {@link #main(String[])}-function
  61.      * which launches the {@link #start(Stage)}-function.
  62.      *
  63.      * @param args command line arguments.
  64.      */
  65.     public static void main(String[] args) {
  66.         launch(args);
  67.     }
  68.  
  69.    
  70.     /**
  71.      * This function displays most of the Client's GUI
  72.      * and also calls other functions for alerts and the
  73.      * login prompt.
  74.      *
  75.      * @param mainStage primary Stage of the function
  76.      */
  77.     public void start(Stage mainStage) {
  78.         Alert alert = new Alert(AlertType.ERROR);
  79.         alert.setTitle("Adreli-Adressverwaltung");
  80.         alert.setHeaderText("Adreli-Benachrichtigung");
  81.         login();
  82.         try {
  83.             cSocket = new Socket(serverIP, serverPort);
  84.             outStrClient = cSocket.getOutputStream();
  85.             inStrClient = cSocket.getInputStream();
  86.         } catch (UnknownHostException uhe) {
  87.             System.exit(1);
  88.         } catch (IOException ioe) {
  89.             System.exit(1);
  90.         }
  91.         mainStage.setTitle("Adreli-Adressverwaltung");
  92.         VBox vbox = new VBox();
  93.         vbox.setAlignment(Pos.TOP_LEFT);
  94.         GridPane grid = new GridPane();
  95.         grid.setAlignment(Pos.CENTER);
  96.         grid.setHgap(10);
  97.         grid.setVgap(10);
  98.         grid.setPadding(new Insets(20, 20, 20, 20));
  99.         MenuBar menuBar = new MenuBar();
  100.         Menu menuApp = new Menu("Anwendung");
  101.         MenuItem appPerson = new MenuItem("Person hinzufuegen");
  102.         appPerson.setOnAction((ActionEvent ae0) -> {
  103.             grid.getChildren().clear();
  104.             Text sceneTitle = new Text("Geben Sie die Personendaten ein!");
  105.             sceneTitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
  106.             grid.add(sceneTitle, 0, 0, 2, 1);
  107.             for (int i = 0; i < Person.persAttributes.length; i++) {
  108.                 grid.add(new Label(Person.persAttributes[i] + ":"), 0, (i+1));
  109.             }
  110.             TextField nName = new TextField();
  111.             grid.add(nName, 1, 1);
  112.             TextField vName = new TextField();
  113.             grid.add(vName, 1, 2);
  114.             TextField anrede = new TextField();
  115.             grid.add(anrede, 1, 3);
  116.             TextField strasse = new TextField();
  117.             grid.add(strasse, 1, 4);
  118.             TextField plz = new TextField();
  119.             grid.add(plz, 1, 5);
  120.             TextField ort = new TextField();
  121.             grid.add(ort, 1, 6);
  122.             TextField telefon = new TextField();
  123.             grid.add(telefon, 1, 7);
  124.             TextField fax = new TextField();
  125.             grid.add(fax, 1, 8);
  126.             TextField bemerkung = new TextField();
  127.             grid.add(bemerkung, 1, 9);
  128.             Button btn = new Button("Hinzufuegen");
  129.             btn.setOnAction((ActionEvent ae1) -> {
  130.                 String[] attr = {nName.getText(), vName.getText(),
  131.                                  anrede.getText(), strasse.getText(),
  132.                                  plz.getText(), ort.getText(),
  133.                                  telefon.getText(), fax.getText(),
  134.                                  bemerkung.getText()};
  135.                 for (int i = 0; i < attr.length; i++) {
  136.                     if (attr[i].isEmpty()) {
  137.                         alert.setAlertType(AlertType.ERROR);
  138.                         alert.setContentText("Bitte alle Felder ausfüllen!");
  139.                         alert.showAndWait(); return;
  140.                     } else if (attr[i].matches(persDatenCheck[i]) == false) {
  141.                         alert.setAlertType(AlertType.ERROR);
  142.                         alert.setContentText(Person.persAttributes[i] +
  143.                                 " bitte korrekt eingeben!");
  144.                         alert.showAndWait(); return;
  145.                     }
  146.                 }
  147.                 alert.setAlertType(AlertType.CONFIRMATION);
  148.                 alert.setContentText("Sind die Daten korrekt?");
  149.                 Optional<ButtonType> result = alert.showAndWait();
  150.                 if (result.get() == ButtonType.OK) {
  151.                     sendCommand(new SendCommand(1, attr));
  152.                     alert.setAlertType(AlertType.CONFIRMATION);
  153.                     alert.setContentText("Noch eine Person aufnehmen?");
  154.                     result = alert.showAndWait();
  155.                     if (result.get() == ButtonType.OK) {
  156.                         nName.clear(); vName.clear(); anrede.clear();
  157.                         strasse.clear(); plz.clear(); ort.clear();
  158.                         telefon.clear(); fax.clear(); bemerkung.clear();
  159.                     } else {
  160.                         grid.getChildren().clear();
  161.                     }
  162.                 }
  163.             });
  164.             HBox hbBtn = new HBox(10);
  165.             hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
  166.             hbBtn.getChildren().add(btn);
  167.             grid.add(hbBtn, 1, 10);
  168.         });
  169.         MenuItem appStop = new MenuItem("Anwendung beenden");
  170.         appStop.setOnAction((ActionEvent ae) -> {
  171.             menuHandler(alert, 7, "Die Anwendung wird beendet!");
  172.             try {
  173.                 cSocket.close();
  174.             } catch (IOException ioe) {
  175.                 System.exit(1);
  176.             }
  177.             System.exit(0);
  178.         });
  179.         Menu menuCache = new Menu("Cache");
  180.         MenuItem cList = new MenuItem("Cache auflisten");
  181.         cList.setOnAction((ActionEvent ae0) -> {
  182.             grid.getChildren().clear();
  183.             sendCommand(new SendCommand(2));
  184.             try {
  185.                 ObjectInputStream ois = new ObjectInputStream(inStrClient);
  186.                 @SuppressWarnings("unchecked")
  187.                 ArrayList<Person> persList = (ArrayList<Person>)
  188.                     ois.readObject();
  189.                 GridPane subGrid = new GridPane();
  190.                 subGrid.setAlignment(Pos.CENTER);
  191.                 subGrid.setHgap(10);
  192.                 subGrid.setVgap(10);
  193.                 subGrid.setPadding(new Insets(10, 10, 10, 10));
  194.                 Text sceneTitle = new Text();
  195.                 sceneTitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
  196.                 sceneTitle.setText("Benutzen Sie die Navigationsbuttons!");
  197.                 grid.add(sceneTitle, 0, 0, 2, 1);
  198.                 Button next = new Button("Weiter");
  199.                 next.setOnAction((ActionEvent ae1) -> {
  200.                     persNr++;
  201.                     if (persNr > persList.size()) {
  202.                         alert.setAlertType(AlertType.INFORMATION);
  203.                         alert.setContentText("Die Auflistung wird beendet.");
  204.                         alert.showAndWait();
  205.                         persNr = 0;
  206.                         grid.getChildren().clear();
  207.                     } else {
  208.                         navigation(subGrid, sceneTitle, persList);
  209.                     }
  210.                 });
  211.                 Button prev = new Button("Zurueck");
  212.                 prev.setOnAction((ActionEvent ae2) -> {
  213.                     persNr--;
  214.                     if (persNr < 1) {
  215.                         subGrid.getChildren().clear();
  216.                         sceneTitle.setText("Benutzen Sie die "
  217.                                 + "Navigationsbuttons!");
  218.                         persNr = 0;
  219.                     } else {
  220.                         navigation(subGrid, sceneTitle, persList);
  221.                     }
  222.                 });
  223.                 HBox hbBtn = new HBox(10);
  224.                 hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
  225.                 hbBtn.getChildren().addAll(prev, next);
  226.                 grid.add(hbBtn,  1, 10);
  227.                 grid.add(subGrid, 0, 1);
  228.             } catch (IOException ioe) {
  229.                 System.exit(1);
  230.             } catch (ClassNotFoundException cnfe) {
  231.                 System.exit(1);
  232.             }  
  233.         });
  234.         MenuItem cSave = new MenuItem("Cache in Datenbank speichern");
  235.         cSave.setOnAction((ActionEvent ae) -> {
  236.             menuHandler(alert, 3, "Personendatensaetze werden gespeichert!");
  237.         });
  238.         MenuItem cLoad = new MenuItem("Aus Datenbank laden");
  239.         cLoad.setOnAction((ActionEvent ae) -> {
  240.             menuHandler(alert, 4, "Personendatensaetze werden geladen!");
  241.         });
  242.         MenuItem cSort = new MenuItem("Cache sortieren");
  243.         cSort.setOnAction((ActionEvent ae) -> {
  244.             menuHandler(alert, 5, "Personendatensaetze werden sortiert!");
  245.         });
  246.         Menu menuFile = new Menu("Datenbank");
  247.         MenuItem fDelete = new MenuItem("Datei löschen");
  248.         fDelete.setOnAction((ActionEvent ae) -> {
  249.             menuHandler(alert, 6, "Die Datei wird geloescht!");
  250.         });
  251.         menuApp.getItems().addAll(appPerson, appStop);
  252.         menuCache.getItems().addAll(cList, cSave, cLoad, cSort);
  253.         menuFile.getItems().add(fDelete);
  254.         menuBar.getMenus().addAll(menuApp, menuCache, menuFile);
  255.         Scene scene = new Scene(vbox, 600, 550);
  256.         ((VBox) scene.getRoot()).getChildren().add(menuBar);
  257.         vbox.getChildren().add(grid);
  258.         mainStage.setScene(scene);
  259.         mainStage.show();
  260.     }
  261.    
  262.    
  263.     /**
  264.      * This function creates 2 TextInputDialogs to receive
  265.      * the server's port and IP from the user.
  266.      */
  267.     public static void login() {
  268.         TextInputDialog dialog = new TextInputDialog();
  269.         dialog.setTitle("Adreli-Adressverwaltung");
  270.         dialog.setHeaderText("Geben Sie den Server-Port ein!");
  271.         dialog.setContentText("Server-Port:");
  272.         Optional<String> result = dialog.showAndWait();
  273.         if (result.isPresent()) {
  274.             serverPort = Integer.parseInt(result.get());
  275.             dialog.setHeaderText("Geben Sie die Server-IP ein!");
  276.             dialog.setContentText("Server-IP:");
  277.             result = dialog.showAndWait();
  278.             if (result.isPresent()) {
  279.                 serverIP = result.get(); return;
  280.             } else {
  281.                 System.exit(0);
  282.             }
  283.         } else {
  284.             System.exit(0);
  285.         }
  286.     }
  287.    
  288.    
  289.     /**
  290.      * This function supports the cache listing part of the
  291.      * {@link #start(Stage)}-function, it helps navigate through
  292.      * the person saved in the cache.
  293.      *
  294.      * @param grid simple layout.
  295.      * @param text scene title for the window.
  296.      * @param list ArrayList of type Person which is being navigated through.
  297.      */
  298.     public static void navigation(GridPane grid, Text text,
  299.             ArrayList<Person> list) {
  300.         grid.getChildren().clear();
  301.         text.setText("Satzinhalt des " + persNr + ". Datensatzes "
  302.                 + "(Person " + persNr + "/" + list.size() + ")");
  303.         String[] attr = {list.get(persNr-1).name, list.get(persNr-1).vorname,
  304.                          list.get(persNr-1).anrede, list.get(persNr-1).strasse,
  305.                          list.get(persNr-1).plz, list.get(persNr-1).ort,
  306.                          list.get(persNr-1).telefon, list.get(persNr-1).fax,
  307.                          list.get(persNr-1).bemerkung};
  308.         for (int i = 0; i < Person.persAttributes.length; i++) {
  309.             grid.add(new Text(Person.persAttributes[i] + ":"), 0, (i+1));
  310.             grid.add(new Text(attr[i]), 1, (i+1));
  311.         }
  312.     }
  313.    
  314.    
  315.     /**
  316.      * This function is used in several EventHandlers from the
  317.      * {@link #start(Stage)}-function.
  318.      *
  319.      * @param alert Alert object passed from {@link #start(Stage)}.
  320.      * @param action gets sent via {@link #sendCommand(SendCommand)}.
  321.      * @param text contentText of the alert object.
  322.      */
  323.     public static void menuHandler(Alert alert, int action, String text) {
  324.         sendCommand(new SendCommand(action));
  325.         alert.setAlertType(AlertType.INFORMATION);
  326.         alert.setContentText(text);
  327.         alert.showAndWait();
  328.     }
  329.  
  330.    
  331.     /**
  332.      * This function receives an object of SendCommand. It then sends
  333.      * that object over to 'Server' via an ObjectOutputStream.
  334.      *
  335.      * @param sC Object of SendCommand.
  336.      */
  337.     public static void sendCommand(SendCommand sC) {
  338.         try {
  339.             ObjectOutputStream oos = new ObjectOutputStream(outStrClient);
  340.             oos.flush();
  341.             oos.writeObject(sC);
  342.         } catch (IOException ioe) {
  343.             System.exit(1);
  344.         }
  345.     }
  346. }
  347.  
  348.  
  349.  
  350.  
  351. /**
  352.  * This class is meant to be used as an object containing input
  353.  * and attribute data of 'Client' in {@link #inputSend} and
  354.  * {@link #attrSend}.It is sent from 'Client' to 'Server' via
  355.  * ObjectOutputStreams in various functions in 'Client'.
  356.  *
  357.  * @see Client
  358.  * @see Server
  359.  * @see ServerGUI
  360.  * @see Controller
  361.  * @see Person
  362.  *
  363.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  364.  */
  365. class SendCommand implements Serializable {
  366.     int inputSend;
  367.     String[] attrSend;
  368.    
  369.     public SendCommand(int input) {
  370.         this.inputSend = input;
  371.     }
  372.    
  373.     public SendCommand(int input, String[] attr) {
  374.         this.inputSend = input;
  375.         this.attrSend = attr;
  376.     }
  377. }
  378.  
  379.  
  380.  
  381.  
  382. import java.io.IOException;
  383. import java.net.ServerSocket;
  384. import java.net.Socket;
  385. import javafx.beans.property.IntegerProperty;
  386. import javafx.beans.property.SimpleIntegerProperty;
  387.                                                                                
  388. /**
  389.  * This class extends Thread and
  390.  * initializes a server instance of the class 'Server'. The
  391.  * server socket gets initialized and waits for a client socket,
  392.  * then starts the server once a client has logged in.
  393.  *
  394.  * @see Client
  395.  * @see Server
  396.  * @see ServerGUI
  397.  * @see Person
  398.  * @see Database
  399.  * @see DatabaseSQL
  400.  * @see DatabaseCSV
  401.  *
  402.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  403.  */
  404. public class Controller extends Thread {
  405.     private int port;
  406.     private ServerSocket sSocket;
  407.     private Database database;
  408.     public IntegerProperty numConnections;
  409.        
  410.    
  411.     public Controller(int port, Database database) {
  412.         this.port = port;
  413.         this.database = database;
  414.         this.numConnections = new SimpleIntegerProperty(0);
  415.     }
  416.    
  417.    
  418.     /**
  419.      * This is the run()-function for classes that
  420.      * implement Thread. It initializes the server socket
  421.      * with the specified port and loops endlessly to initialize
  422.      * client Sockets and document clients logging on and off.
  423.      */
  424.     public void run() {
  425.         try {
  426.             sSocket = new ServerSocket(port);
  427.             System.out.println("Server is online.");
  428.             while (true) {
  429.                 Socket cSocket = sSocket.accept();
  430.                 Server server = new Server(cSocket.getOutputStream(),
  431.                         cSocket.getInputStream(),
  432.                         cSocket.getInetAddress(), database);
  433.                 server.connected.addListener((observable,
  434.                         oldstatus, newstatus) -> {
  435.                     if (newstatus == true) {
  436.                         numConnections.set(numConnections.get() + 1);
  437.                     }
  438.                     if (newstatus == false) {
  439.                         numConnections.set(numConnections.get() - 1);
  440.                     }
  441.                 });
  442.                 server.start();
  443.             }
  444.         } catch (IOException ioe) {
  445.             System.out.println(ioe.getMessage());
  446.         }
  447.     }
  448.    
  449.    
  450.     /**
  451.      * This function closes the server socket.
  452.      */
  453.     public void closeSocket() {
  454.         try {
  455.             numConnections.set(0);
  456.             sSocket.close();
  457.         } catch (IOException ioe) {
  458.             System.out.println(ioe.getMessage());
  459.         }
  460.     }
  461. }
  462.  
  463.  
  464.  
  465.  
  466. import java.io.*;
  467. import java.net.InetAddress;
  468. import java.text.SimpleDateFormat;
  469. import java.util.*;
  470. import javafx.beans.property.BooleanProperty;
  471. import javafx.beans.property.SimpleBooleanProperty;
  472.  
  473. /**
  474.  * This class extends Thread and uses an object of Database which has
  475.  * several functions that focus on data storage (save, load and delete).
  476.  * The cache is representend by {@link #persList}. It also contains the
  477.  * Output/Inputstreams {@link #outStrServer} and {@link #inStrServer}
  478.  * to create a connection with 'Client'.
  479.  *
  480.  * @see Client
  481.  * @see ServerGUI
  482.  * @see Controller
  483.  * @see Person
  484.  * @see Database
  485.  * @see DatabaseSQL
  486.  * @see DatabaseCSV
  487.  *
  488.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  489.  */
  490. public class Server extends Thread {
  491.     private final String FILE_PROTOCOL = "adrelilog.txt";
  492.     private Database database;
  493.     private InetAddress clientIP;
  494.     private OutputStream outStrServer;
  495.     private InputStream inStrServer;
  496.     private List<Person> persList = new ArrayList<Person>();
  497.     public BooleanProperty connected;
  498.    
  499.    
  500.     public Server(OutputStream outStr, InputStream inStr,
  501.             InetAddress clientIP, Database database) {
  502.         this.clientIP = clientIP;
  503.         this.outStrServer = outStr;
  504.         this.inStrServer = inStr;
  505.         this.database = database;
  506.         connected = new SimpleBooleanProperty();
  507.     }
  508.    
  509.    
  510.     /**
  511.      * This is the run()-function for classes that
  512.      * implement Thread. It loops through a switch-case and waits
  513.      * for 'Client' to send it an object of 'SendCommand'.
  514.      * This object contains an integer that tells the switch-case what
  515.      * action to take aswell as a String array containing attributes
  516.      * for {@link #persList}.
  517.      */
  518.     public void run() {
  519.         try {
  520.             connected.set(true);
  521.             while (true) {
  522.                 ObjectInputStream ois = new ObjectInputStream(inStrServer);
  523.                 SendCommand sC = (SendCommand) ois.readObject();
  524.                 switch (sC.inputSend) {
  525.                 case 1:
  526.                     persList.add(new Person(sC.attrSend));
  527.                     String logAdd = new String("Person added to cache (");
  528.                     for (int i = 0; i < sC.attrSend.length; i++) {
  529.                         logAdd = logAdd + sC.attrSend[i] + ";";
  530.                     }
  531.                     log(logAdd + ")");
  532.                     break;
  533.                 case 2:
  534.                     sendPersList();
  535.                     log("Cache sent");
  536.                     break;
  537.                 case 3:
  538.                     database.saveToDB(persList);
  539.                     log("Cache saved to database");
  540.                     break;
  541.                 case 4:
  542.                     database.loadFromDB(persList);
  543.                     log("Loaded database to cache");
  544.                     break;
  545.                 case 5:
  546.                     Collections.sort(persList);
  547.                     log("Cache sorted");
  548.                     break;
  549.                 case 6:
  550.                     database.deleteDB();
  551.                     log("Database deleted");
  552.                     break;
  553.                 case 7:
  554.                     log("Connection closed");
  555.                     connected.set(false);
  556.                     return;
  557.                 default: break;
  558.                 }
  559.             }
  560.         } catch (IOException ioe) {
  561.             System.exit(1);
  562.         } catch (ClassNotFoundException cnfe) {
  563.             System.exit(1);
  564.         }
  565.     }
  566.    
  567.    
  568.     /**
  569.      * Logs the Server's activity in CSV-format in a file called
  570.      * "adrelilog.txt" and prints it out on the console aswell.
  571.      * The log is formatted like this:
  572.      * "yyyy-MM-dd HH:mm:ss;USER_IP;ACTION_TAKEN".
  573.      *
  574.      * @param action Contains the action taken that's printed in the log.
  575.      */
  576.     public void log(String action) {
  577.         Date date = new Date();
  578.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  579.         try {
  580.             File log = new File(FILE_PROTOCOL);
  581.             FileWriter fw = new FileWriter(log, true);
  582.             PrintWriter pw = new PrintWriter(fw);
  583.             pw.println(sdf.format(date) + ";" + clientIP + ";" + action + ";");
  584.             pw.close();
  585.         } catch (IOException ioe) {
  586.             System.out.println(ioe.getMessage());
  587.         }
  588.         System.out.println(sdf.format(date) + "; " + clientIP + "; " + action);
  589.     }
  590.    
  591.    
  592.     /**
  593.      * Sends {@link #persList} via a local ObjectOutputStream
  594.      * to 'Client'.
  595.      */
  596.     public void sendPersList() {
  597.         try {
  598.             ObjectOutputStream oos = new ObjectOutputStream(outStrServer);
  599.             oos.flush();
  600.             oos.writeObject(persList);
  601.         } catch (IOException ioe) {
  602.             System.out.println(ioe.getMessage());
  603.         }
  604.     }
  605. }
  606.  
  607.  
  608.  
  609.  
  610. import java.util.ArrayList;
  611. import java.util.List;
  612. import java.util.Optional;
  613.  
  614. import javafx.application.Application;
  615. import javafx.event.ActionEvent;
  616. import javafx.geometry.Insets;
  617. import javafx.geometry.Pos;
  618. import javafx.scene.Scene;
  619. import javafx.scene.control.Alert;
  620. import javafx.scene.control.Alert.AlertType;
  621. import javafx.scene.control.Button;
  622. import javafx.scene.control.ButtonType;
  623. import javafx.scene.control.Label;
  624. import javafx.scene.control.Menu;
  625. import javafx.scene.control.MenuBar;
  626. import javafx.scene.control.MenuItem;
  627. import javafx.scene.control.TextField;
  628. import javafx.scene.layout.GridPane;
  629. import javafx.scene.layout.HBox;
  630. import javafx.scene.layout.VBox;
  631. import javafx.scene.text.Text;
  632. import javafx.stage.FileChooser;
  633. import javafx.stage.Stage;
  634.  
  635. /**
  636.  * This class extends Application and contains the server's
  637.  * entire GUI.
  638.  *
  639.  * @see Client
  640.  * @see Server
  641.  * @see Controller
  642.  * @see Person
  643.  * @see Database
  644.  * @see DatabaseSQL
  645.  * @see DatabaseCSV
  646.  *
  647.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  648.  */
  649. public class ServerGUI extends Application {
  650.     Controller server;
  651.     final String CSVFILE = "adrelibase.txt";
  652.  
  653.    
  654.     /**
  655.      * This is the Client's {@link #main(String[])}-function
  656.      * which launches the {@link #start(Stage)}-function.
  657.      *
  658.      * @param args command line arguments.
  659.      */
  660.     public static void main(String[] args) {
  661.         launch(args);
  662.     }
  663.    
  664.    
  665.     /**
  666.      * This function displays all of the Server's GUI.
  667.      */
  668.     public void start(Stage mainStage) {
  669.         mainStage.setTitle("Adreli-Server");
  670.         Alert error = new Alert(AlertType.ERROR);
  671.         error.setTitle("Adreli-Server");
  672.         error.setHeaderText("Adreli-Benachrichtigung");
  673.         VBox vbox = new VBox();
  674.         vbox.setAlignment(Pos.TOP_LEFT);
  675.         GridPane grid = new GridPane();
  676.         grid.setAlignment(Pos.CENTER);
  677.         grid.setHgap(10);
  678.         grid.setVgap(10);
  679.         grid.setPadding(new Insets(20, 20, 20, 20));
  680.         Text conText = new Text("Anzahl der aktiven Verbindungen:");
  681.         Text connections = new Text();
  682.         MenuBar menuBar = new MenuBar();
  683.         Menu menuServer = new Menu("Server");
  684.         MenuItem sStart = new MenuItem("Server starten");
  685.         sStart.setOnAction((ActionEvent ae0) -> {
  686.             Text sceneTitle = new Text("Stellen Sie den Serverport ein!");
  687.             grid.add(sceneTitle, 0, 0, 2, 1);
  688.             Label portName = new Label("Port:");
  689.             grid.add(portName, 0, 1);
  690.             TextField port = new TextField();
  691.             grid.add(port, 1, 1);
  692.             Button portBtn = new Button("Portwert setzen");
  693.             portBtn.setOnAction((ActionEvent ae1) -> {
  694.                 if (!port.getText().isEmpty()) {
  695.                     Alert confirmation = new Alert(AlertType.CONFIRMATION);
  696.                     confirmation.setTitle("Adreli-Server");
  697.                     confirmation.setHeaderText("Adreli-Benachrichtigung");
  698.                     confirmation.setContentText(
  699.                             "Wählen Sie bitte die Speicherart aus.");
  700.                     ButtonType buttonSQL = new ButtonType("MySQL");
  701.                     ButtonType buttonCSV = new ButtonType("CSV-Datei");
  702.                     confirmation.getButtonTypes().setAll(buttonSQL, buttonCSV);
  703.                     Optional<ButtonType> result = confirmation.showAndWait();
  704.                     if (result.get() == buttonSQL) {
  705.                         server = new Controller(
  706.                                 Integer.parseInt(port.getText()),
  707.                                 new DatabaseSQL());
  708.                     } else if (result.get() == buttonCSV) {
  709.                         Alert information = new Alert(AlertType.INFORMATION);
  710.                         information.setAlertType(AlertType.INFORMATION);
  711.                         information.setContentText("Waehlen Sie bitte in "
  712.                                 + "die zu speichernde Datei aus");
  713.                         information.showAndWait();
  714.                         FileChooser fC = new FileChooser();
  715.                         fC.setTitle("Wählen Sie in die "
  716.                                 + "zu speichernde Datei aus");
  717.                         fC.getExtensionFilters().addAll(
  718.                                 new FileChooser.ExtensionFilter(
  719.                                         "Alle Dateien", "*.*"),
  720.                                 new FileChooser.ExtensionFilter(
  721.                                         "Textdateien", "*.txt", "*.csv"),
  722.                                 new FileChooser.ExtensionFilter(
  723.                                         "SQL-Dateien", "*.sql"));
  724.                         server = new Controller(
  725.                                 Integer.parseInt(port.getText()),
  726.                                 new DatabaseCSV(fC.showOpenDialog(mainStage)));
  727.                     }
  728.                     connections.textProperty().
  729.                         bind(server.numConnections.asString());
  730.                     server.start();
  731.                     sStart.setDisable(true);
  732.                     grid.getChildren().clear();
  733.                     grid.add(conText, 0, 1);
  734.                     grid.add(connections, 1, 1);
  735.                 } else {
  736.                     Alert noPort = new Alert(AlertType.ERROR);
  737.                     noPort.setContentText("Geben Sie bitte einen Port ein!");
  738.                     noPort.showAndWait();
  739.                 }
  740.             });
  741.             HBox hbBtn = new HBox(10);
  742.             hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
  743.             hbBtn.getChildren().add(portBtn);
  744.             grid.add(hbBtn, 1, 2);
  745.         });
  746.         MenuItem sStop = new MenuItem("Server herunterfahren");
  747.         sStop.setOnAction((ActionEvent ae) -> {
  748.             Alert stop = new Alert(AlertType.INFORMATION);
  749.             stop.setContentText("Der Server wird heruntergefahren!");
  750.             stop.showAndWait();
  751.             server.closeSocket();
  752.             sStart.setDisable(false);
  753.             grid.getChildren().clear();
  754.         });
  755.         menuServer.getItems().addAll(sStart, sStop);
  756.         Menu copy = new Menu("Datenaustausch");
  757.         MenuItem importieren = new MenuItem("Importieren");
  758.         importieren.setOnAction((ActionEvent ae) -> {
  759.             csvRead();
  760.             Alert importerino = new Alert(AlertType.INFORMATION);
  761.             importerino.setContentText(
  762.                     "Die Daten wurden erfolgreich importiert!");
  763.             importerino.showAndWait();
  764.         });
  765.         MenuItem exportieren = new MenuItem("Exportieren");
  766.         exportieren.setOnAction((ActionEvent ae) -> {
  767.             csvWrite();
  768.             Alert exporterino = new Alert(AlertType.INFORMATION);
  769.             exporterino.setContentText(
  770.                     "Die Daten wurden erfolgreich exportiert!");
  771.             exporterino.showAndWait();
  772.         });
  773.         copy.getItems().addAll(importieren, exportieren);
  774.         menuBar.getMenus().addAll(menuServer, copy);
  775.         Scene scene = new Scene(vbox, 400, 350);
  776.         ((VBox) scene.getRoot()).getChildren().add(menuBar);
  777.         vbox.getChildren().add(grid);
  778.         mainStage.setScene(scene);
  779.         mainStage.show();
  780.     }
  781.    
  782.    
  783.     /**
  784.      * This function loads the source database's data into the bufferList,
  785.      * then saves it into the destination database.
  786.      *
  787.      * @param src source Database
  788.      * @param dest destination Database
  789.      */
  790.     public void copy(Database src, Database dest) {
  791.         List<Person> bufferList = new ArrayList<Person>();
  792.         src.loadFromDB(bufferList);
  793.         dest.saveToDB(bufferList);
  794.     }
  795.    
  796.    
  797.     /**
  798.      * Imports SQL data into a CSV file.
  799.      */
  800.     public void csvRead() {
  801.         copy(new DatabaseSQL(), new DatabaseCSV(CSVFILE));
  802.     }
  803.    
  804.    
  805.     /**
  806.      * Exports a CSV file's data into a SQL database.
  807.      */
  808.     public void csvWrite() {
  809.         copy(new DatabaseCSV(CSVFILE), new DatabaseSQL());
  810.     }
  811. }
  812.  
  813.  
  814.  
  815.  
  816. import java.io.Serializable;
  817.  
  818. /**
  819.  * This class carries all attributes a person has in 'Client' and
  820.  * 'Server' aswell as the {@link #compareTo(Person)}-function
  821.  * for the ArrayList used in 'Server'.
  822.  *
  823.  * @see Client
  824.  * @see Server
  825.  * @see ServerGUI
  826.  * @see Controller
  827.  * @see Database
  828.  * @see DatabaseSQL
  829.  * @see DatabaseCSV
  830.  *
  831.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  832.  */
  833. public class Person implements Serializable, Comparable<Person> {
  834.     String name;
  835.     String vorname;
  836.     String anrede;
  837.     String strasse;
  838.     String plz;
  839.     String ort;
  840.     String telefon;
  841.     String fax;
  842.     String bemerkung;
  843.     String[] attributes;
  844.     static String[] persAttributes = {
  845.             "Nachname", "Vorname", "Anrede", "Strasse",
  846.             "PLZ", "Ort", "Telefon", "Fax", "Bemerkung" };
  847.  
  848.    
  849.     public Person(String[] attr) {
  850.         this.name = attr[0];
  851.         this.vorname = attr[1];
  852.         this.anrede = attr[2];
  853.         this.strasse = attr[3];
  854.         this.plz = attr[4];
  855.         this.ort = attr[5];
  856.         this.telefon = attr[6];
  857.         this.fax = attr[7];
  858.         this.bemerkung = attr[8];
  859.         attributes = attr.clone();
  860.     }
  861.  
  862.    
  863.     public int compareTo(Person p1) {
  864.         return this.name.compareToIgnoreCase(p1.name);
  865.     }
  866. }
  867.  
  868.  
  869.  
  870.  
  871. import java.util.List;
  872.  
  873. /**
  874.  * Abstract class with 2 children that are needed for
  875.  * server functionality.
  876.  *
  877.  * @see Client
  878.  * @see Server
  879.  * @see ServerGUI
  880.  * @see Controller
  881.  * @see Person
  882.  * @see DatabaseSQL
  883.  * @see DatabaseCSV
  884.  *
  885.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  886.  */
  887. public abstract class Database {
  888.  
  889.    
  890.     abstract void saveToDB(List<Person> persList);
  891.    
  892.    
  893.     abstract void loadFromDB(List<Person> persList);
  894.    
  895.    
  896.     abstract void deleteDB();
  897. }
  898.  
  899.  
  900.  
  901.  
  902. import java.io.BufferedReader;
  903. import java.io.File;
  904. import java.io.FileReader;
  905. import java.io.FileWriter;
  906. import java.io.IOException;
  907. import java.io.PrintWriter;
  908. import java.util.List;
  909.  
  910.  
  911. /**
  912.  * Inherits the class Database and its abstract functions
  913.  * to save/load from a CSV file or delete it.
  914.  *
  915.  * @see Client
  916.  * @see Server
  917.  * @see ServerGUI
  918.  * @see Controller
  919.  * @see Person
  920.  * @see Database
  921.  * @see DatabaseSQL
  922.  *
  923.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  924.  */
  925. public class DatabaseCSV extends Database {
  926.     private File csvFile;
  927.    
  928.    
  929.     public DatabaseCSV(File file) {
  930.         csvFile = file;
  931.     }
  932.    
  933.    
  934.     public DatabaseCSV(String name) {
  935.         csvFile = new File(name);
  936.     }
  937.    
  938.    
  939.     /**
  940.      * Saves all Person-objects in persList to the
  941.      * selected file, the saving format is CSV.
  942.      *
  943.      * @param persList Cache for Persons.
  944.      */
  945.     public void saveToDB(List<Person> persList) {
  946.         try {
  947.             FileWriter fw = new FileWriter(csvFile, true);
  948.             PrintWriter pw = new PrintWriter(fw);
  949.             for (int i = 0; i < persList.size(); i++) {
  950.                 pw.print(persList.get(i).name + ";");
  951.                 pw.print(persList.get(i).vorname + ";");
  952.                 pw.print(persList.get(i).anrede + ";");
  953.                 pw.print(persList.get(i).strasse + ";");
  954.                 pw.print(persList.get(i).plz + ";");
  955.                 pw.print(persList.get(i).ort + ";");
  956.                 pw.print(persList.get(i).telefon + ";");
  957.                 pw.print(persList.get(i).fax + ";");
  958.                 pw.print(persList.get(i).bemerkung + ";");
  959.                 pw.println();
  960.             }
  961.             pw.close();
  962.         } catch (IOException ioe) {
  963.             System.out.println(ioe.getMessage());
  964.         }
  965.     }
  966.    
  967.    
  968.     /**
  969.      * Loads all persons saved in the selected file
  970.      * into the persList.
  971.      *
  972.      * @param persList Cache for Persons
  973.      */
  974.     public void loadFromDB(List<Person> persList) {
  975.         try {
  976.             FileReader fr = new FileReader(csvFile);
  977.             BufferedReader br = new BufferedReader(fr);
  978.             while (br.ready()) {
  979.                 String[] persDataLoad = br.readLine().split(";", -1);
  980.                 persList.add(new Person(persDataLoad));
  981.             }
  982.             br.close();
  983.         } catch (IOException ioe) {
  984.             System.out.println(ioe.getMessage());
  985.         }
  986.     }
  987.    
  988.    
  989.     /**
  990.      * Deletes the selected file.
  991.      */
  992.     public void deleteDB() {
  993.         if (csvFile.exists()) {
  994.             csvFile.delete();
  995.         }
  996.     }
  997. }
  998.  
  999.  
  1000.  
  1001.  
  1002. import java.sql.Connection;
  1003. import java.sql.DriverManager;
  1004. import java.sql.PreparedStatement;
  1005. import java.sql.ResultSet;
  1006. import java.sql.SQLException;
  1007. import java.util.List;
  1008.  
  1009. /**
  1010.  * Inherits the class Database and its abstract functions
  1011.  * to save/load from an SQL database or truncate the table.
  1012.  *
  1013.  * @see Client
  1014.  * @see Server
  1015.  * @see ServerGUI
  1016.  * @see Controller
  1017.  * @see Person
  1018.  * @see Database
  1019.  * @see DatabaseCSV
  1020.  *
  1021.  * @author Gruppe 4: Usmanov, Reschke, Vogel
  1022.  */
  1023. public class DatabaseSQL extends Database {
  1024.     static String datenbankURL = "jdbc:mysql://127.0.0.1/adreli";
  1025.     static String datenbankUserName = "root";
  1026.     static String datenbankPW = "";
  1027.    
  1028.    
  1029.     /**
  1030.      * Saves all Person-objects in persList to the
  1031.      * SQL database.
  1032.      *
  1033.      * @param persList Cache for Persons.
  1034.      */
  1035.     public void saveToDB(List<Person> persList) {
  1036.         try {
  1037.             Connection con = DriverManager.getConnection(
  1038.                     datenbankURL, datenbankUserName, datenbankPW);
  1039.             con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
  1040.             for (Person person : persList) {
  1041.                 PreparedStatement pstmt = con.prepareStatement(
  1042.                         "INSERT INTO adreli5_gr4 "
  1043.                         + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
  1044.                 for (int i = 0; i < Person.persAttributes.length; i++) {
  1045.                     pstmt.setString((i + 1), person.attributes[i]);
  1046.                 }
  1047.                 pstmt.executeUpdate();
  1048.             }
  1049.         } catch (SQLException sqle) {
  1050.             System.out.println(sqle.getMessage());
  1051.         }
  1052.     }
  1053.    
  1054.    
  1055.     /**
  1056.      * Loads all SQL table rows into the persList
  1057.      *
  1058.      * @param persList Cache for Persons.
  1059.      */
  1060.     public void loadFromDB(List<Person> persList) {
  1061.         try {
  1062.             Connection con = DriverManager.getConnection(
  1063.                     datenbankURL, datenbankUserName, datenbankPW);
  1064.             con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
  1065.             PreparedStatement pstmt = con.prepareStatement(
  1066.                     "SELECT * FROM adreli5_gr4");
  1067.             ResultSet rs = pstmt.executeQuery();
  1068.             String[] persDataLoad = new String[Person.persAttributes.length];
  1069.             while (rs.next()) {
  1070.                 for (int i = 0; i < Person.persAttributes.length; i++) {
  1071.                     persDataLoad[i] = rs.getString(Person.persAttributes[i]);
  1072.                 }
  1073.                 persList.add(new Person(persDataLoad));
  1074.             }
  1075.         } catch (SQLException sqle) {
  1076.             System.out.println(sqle.getMessage());
  1077.         }
  1078.     }
  1079.    
  1080.    
  1081.     /**
  1082.      * Deletes all rows in the table "adreli5_gr4".
  1083.      */
  1084.     public void deleteDB() {
  1085.         try {
  1086.             Connection con = DriverManager.getConnection(datenbankURL);
  1087.             con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
  1088.             PreparedStatement pstmt = con.prepareStatement(
  1089.                     "TRUNCATE adreli5_gr4");
  1090.             pstmt.executeQuery();
  1091.         } catch (SQLException sqle) {
  1092.             System.out.println(sqle.getMessage());
  1093.         }
  1094.     }
  1095. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement