diff --git a/client/app/src/main/java/customUI/Button.java b/client/app/src/main/java/customUI/Button.java index 3d4d4bf..61df976 100644 --- a/client/app/src/main/java/customUI/Button.java +++ b/client/app/src/main/java/customUI/Button.java @@ -3,6 +3,6 @@ package customUI; public class Button extends javafx.scene.control.Button { public void setTextValue(String text){ - super.setText(Converter.CONVERT_STR(text)); + super.setText(Converter.convertString(text)); } } diff --git a/client/app/src/main/java/customUI/Converter.java b/client/app/src/main/java/customUI/Converter.java index bf0c895..dc737af 100644 --- a/client/app/src/main/java/customUI/Converter.java +++ b/client/app/src/main/java/customUI/Converter.java @@ -8,7 +8,7 @@ public class Converter { ß \u00df */ @SuppressWarnings("all") - public static String CONVERT_STR(String str){ + public static String convertString(String str){ return str .replace("ä", "\u00e4") .replace("Ä", "\u00c4") diff --git a/client/app/src/main/java/customUI/Label.java b/client/app/src/main/java/customUI/Label.java index 8ba0ce2..ad5321e 100644 --- a/client/app/src/main/java/customUI/Label.java +++ b/client/app/src/main/java/customUI/Label.java @@ -2,7 +2,7 @@ package customUI; public class Label extends javafx.scene.control.Label { public Label(String content){ - super(Converter.CONVERT_STR(content)); + super(Converter.convertString(content)); } public Label(){ @@ -10,6 +10,6 @@ public class Label extends javafx.scene.control.Label { } public void setTextValue(String text){ - super.setText(Converter.CONVERT_STR(text)); + super.setText(Converter.convertString(text)); } } diff --git a/client/app/src/main/java/main/CreateEventController.java b/client/app/src/main/java/main/CreateEventController.java index b0b8992..0511b96 100644 --- a/client/app/src/main/java/main/CreateEventController.java +++ b/client/app/src/main/java/main/CreateEventController.java @@ -1,6 +1,7 @@ package main; import com.jfoenix.controls.*; +import helper.HttpRequestException; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; @@ -73,16 +74,20 @@ public class CreateEventController { System.out.println(event.getAsUrlParam()); - DataController dataController = new DataController(); - dataController.createEvent(event); + sendHttpRequest(event); Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow(); stage.close(); - } catch (RuntimeException e) { + } catch (HttpRequestException e) { labelError.setText(e.getMessage()); } } + protected void sendHttpRequest(Event event) throws HttpRequestException { + DataController dataController = new DataController(); + dataController.createEvent(event); + } + @FXML protected void abortBtnClick(ActionEvent event) { Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); diff --git a/client/app/src/main/java/main/EditEventController.java b/client/app/src/main/java/main/EditEventController.java new file mode 100644 index 0000000..3e34d04 --- /dev/null +++ b/client/app/src/main/java/main/EditEventController.java @@ -0,0 +1,25 @@ +package main; + +import helper.HttpRequestException; +import res.DataController; +import res.Event; + +public class EditEventController extends CreateEventController{ + + private Event currentEvent; + + public Event getCurrentEvent() { + return currentEvent; + } + + public void setCurrentEvent(Event currentEvent) { + this.currentEvent = currentEvent; + } + + @Override + protected void sendHttpRequest(Event event) throws HttpRequestException { + DataController dataController = new DataController(); + dataController.deleteEvent(currentEvent.getOwnerId(), currentEvent.getId(), currentEvent.getDate()); + dataController.createEvent(event); + } +} diff --git a/client/app/src/main/java/main/MainApplication.java b/client/app/src/main/java/main/MainApplication.java index 6108243..09274f4 100644 --- a/client/app/src/main/java/main/MainApplication.java +++ b/client/app/src/main/java/main/MainApplication.java @@ -1,10 +1,13 @@ package main; +import config.Config; +import config.ConfigLoader; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; import res.DataController; +import res.HttpRequest; import java.io.IOException; import java.util.Objects; @@ -12,10 +15,47 @@ import java.util.Objects; public class MainApplication extends Application { @Override public void start(Stage stage) throws IOException { + Config config = ConfigLoader.load(); + if(config == null){ + config = new Config(false, -1, ""); + } System.out.println("Ignore 'Illegal reflective access operation'-Warning. See https://github.com/sshahine/JFoenix/issues/1170"); - // Load login-scene + if( + !config.isSaveLogin() + || !new DataController().loginWithToken(config.getId(), config.getToken()) + ){ + // Load login-scene + loadLoginScene(); + } + + if (DataController.USER_ID >= 0) { + if(config.isSaveLogin()){ + config.setId(DataController.USER_ID); + config.setToken(HttpRequest.TOKEN); + ConfigLoader.save(config); + } + // Load main-scene + loadMainScene(stage); + + System.out.println("Logged in..."); + } + } + + private void loadMainScene(Stage stage) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml")); + + Scene scene = new Scene(fxmlLoader.load(), 1200, 700); + scene.getStylesheets().add(Objects.requireNonNull( + MainApplication.class.getResource("main-view.css")).toExternalForm() + ); + stage.setTitle("SharePlaner"); + stage.setScene(scene); + stage.show(); + } + + private void loadLoginScene() throws IOException { FXMLLoader fxmlLoaderLogin = new FXMLLoader(MainApplication.class.getResource("../users/login.fxml")); Scene sceneLogin = new Scene(fxmlLoaderLogin.load(), 650, 500); sceneLogin.getStylesheets().add(Objects.requireNonNull( @@ -25,21 +65,6 @@ public class MainApplication extends Application { stageLogin.setTitle("Anmelden"); stageLogin.setScene(sceneLogin); stageLogin.showAndWait(); - - if (DataController.USER_ID >= 0) { - // Load main-scene - FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml")); - - Scene scene = new Scene(fxmlLoader.load(), 1200, 700); - scene.getStylesheets().add(Objects.requireNonNull( - MainApplication.class.getResource("main-view.css")).toExternalForm() - ); - stage.setTitle("SharePlaner"); - stage.setScene(scene); - stage.show(); - - System.out.println("Logged in..."); - } } public static void main(String[] args) { diff --git a/client/app/src/main/java/main/MainController.java b/client/app/src/main/java/main/MainController.java index 098fd12..150c4b8 100644 --- a/client/app/src/main/java/main/MainController.java +++ b/client/app/src/main/java/main/MainController.java @@ -3,11 +3,13 @@ package main; import customUI.Button; import customUI.Label; import helper.SvgBtnCreator; +import helper.HttpRequestException; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; -import javafx.scene.Group; import javafx.scene.Scene; +import customUI.Button; +import customUI.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; @@ -65,10 +67,14 @@ public class MainController { } DataController dataController = new DataController(); - ArrayList eventList = dataController.getAllVisibleEvents(weekStartDateTime, weekStartDateTime.plusDays(7)); + try { + ArrayList eventList = dataController.getAllVisibleEvents(weekStartDateTime, weekStartDateTime.plusDays(7)); - for (Event event : eventList) { - addEvent(event); + for (Event event : eventList) { + addEvent(event); + } + } catch (HttpRequestException e) { + e.printStackTrace(); } } @@ -106,6 +112,7 @@ public class MainController { stage.setScene(scene); stage.initModality(Modality.APPLICATION_MODAL); stage.setResizable(false); + //stage.initStyle(StageStyle.UNDECORATED); stage.showAndWait(); } catch (IOException e) { e.printStackTrace(); @@ -166,7 +173,11 @@ public class MainController { deleteBtn.getStyleClass().add("deleteEventBtn"); deleteBtn.setOnAction(e -> { DataController dataController = new DataController(); - dataController.deleteEvent(event.getOwnerId(), event.getId(), event.getDate()); + try { + dataController.deleteEvent(event.getOwnerId(), event.getId(), event.getDate()); + } catch (HttpRequestException ex) { + ex.printStackTrace(); + } updateEvents(); }); @@ -189,7 +200,10 @@ public class MainController { stage.setScene(scene); stage.initModality(Modality.APPLICATION_MODAL); stage.setResizable(false); + EditEventController editEventController = fxmlLoader.getController(); + editEventController.setCurrentEvent(event); stage.showAndWait(); + updateEvents(); } catch (IOException e) { e.printStackTrace(); } @@ -320,6 +334,4 @@ public class MainController { GridPane.setColumnIndex(nextBtn, 3); buttonBox.getChildren().add(nextBtn); } - - } \ No newline at end of file diff --git a/client/app/src/main/java/users/CreateUserController.java b/client/app/src/main/java/users/CreateUserController.java index e40cc43..3f54a46 100644 --- a/client/app/src/main/java/users/CreateUserController.java +++ b/client/app/src/main/java/users/CreateUserController.java @@ -4,6 +4,7 @@ import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; import javafx.stage.Stage; @@ -13,8 +14,8 @@ import java.util.Objects; public class CreateUserController { public TextField textName; - public TextField textPassword; - public TextField textPasswordSecond; + public PasswordField textPassword; + public PasswordField textPasswordSecond; public ToggleButton checkButtonIsAdmin; public TextField textLogin; public TextField textForename; diff --git a/client/app/src/main/resources/main/edit-event.fxml b/client/app/src/main/resources/main/edit-event.fxml index 9180344..939dddb 100644 --- a/client/app/src/main/resources/main/edit-event.fxml +++ b/client/app/src/main/resources/main/edit-event.fxml @@ -8,7 +8,7 @@ + fx:controller="main.EditEventController"> diff --git a/client/app/src/main/resources/users/create-user.fxml b/client/app/src/main/resources/users/create-user.fxml index 3a40ebd..e542f73 100644 --- a/client/app/src/main/resources/users/create-user.fxml +++ b/client/app/src/main/resources/users/create-user.fxml @@ -37,8 +37,8 @@ - - + + diff --git a/client/data/src/main/java/config/Config.java b/client/data/src/main/java/config/Config.java new file mode 100644 index 0000000..07e8b2f --- /dev/null +++ b/client/data/src/main/java/config/Config.java @@ -0,0 +1,41 @@ +package config; + +public class Config { + private boolean saveLogin; + private long id; + private String token; + + public Config(){ + + } + + public Config(boolean saveLogin, long id, String token) { + this.saveLogin = saveLogin; + this.id = id; + this.token = token; + } + + public boolean isSaveLogin() { + return saveLogin; + } + + public void setSaveLogin(boolean saveLogin) { + this.saveLogin = saveLogin; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/client/data/src/main/java/config/ConfigLoader.java b/client/data/src/main/java/config/ConfigLoader.java new file mode 100644 index 0000000..56e195e --- /dev/null +++ b/client/data/src/main/java/config/ConfigLoader.java @@ -0,0 +1,38 @@ +package config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import res.DataController; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class ConfigLoader { + + public static Config load(){ + try { + String jsonString = Files.readString(Paths.get("config.json")); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + return objectMapper.readValue(jsonString, Config.class); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static void save(Config config){ + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + + try { + Files.writeString(Paths.get( + "config.json"), + objectMapper.writeValueAsString(config) + ); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/client/data/src/main/java/helper/HttpRequestException.java b/client/data/src/main/java/helper/HttpRequestException.java new file mode 100644 index 0000000..972dd3f --- /dev/null +++ b/client/data/src/main/java/helper/HttpRequestException.java @@ -0,0 +1,23 @@ +package helper; + +public class HttpRequestException extends Exception{ + private int status; + + public HttpRequestException(String message, int status) { + super(message); + this.status = status; + } + + public HttpRequestException(Tuple response) { + super(response.getValue()); + this.status = response.getKey(); + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/client/data/src/main/java/res/DataController.java b/client/data/src/main/java/res/DataController.java index 2937b9b..f920bac 100644 --- a/client/data/src/main/java/res/DataController.java +++ b/client/data/src/main/java/res/DataController.java @@ -3,6 +3,7 @@ package res; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import helper.HttpRequestException; import helper.Tuple; import java.io.BufferedReader; @@ -24,6 +25,7 @@ public class DataController { private static final String DELETE_EVENT_ENDPOINT = "http://localhost:8080/event/del"; private static final String LOGIN_ENDPOINT = "http://localhost:8080/user/login"; + private static final String LOGIN_WITH_TOKEN_ENDPOINT = "http://localhost:8080/user/login-with-token"; private static final String ALL_USERS_ENDPOINT = "http://localhost:8080/user/all"; private static final String HEADER_TEST_ENDPOINT = "http://localhost:8080/vpr/header-test"; @@ -60,28 +62,59 @@ public class DataController { return USER_ID >= 0; } - public void createEvent(Event event) { + public boolean loginWithToken(long userId, String token) { try { - System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam(), true)); + HttpRequest.TOKEN = token; + Tuple response = httpRequest.sendPostRequest( + LOGIN_WITH_TOKEN_ENDPOINT, + "userId=" + userId, + true + ); + + System.out.println(response.getKey() + " " + response.getValue()); + + if(response.getKey() != 200) return false; } catch (Exception e) { - throw new RuntimeException("Es konnte keine Verbindung mit dem Server hergestellt werden."); + e.printStackTrace(); + return false; + } + USER_ID = userId; + HttpRequest.TOKEN = token; + return USER_ID >= 0; + } + + public void createEvent(Event event) throws HttpRequestException { + try { + Tuple response = httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam(), true); + if(response.getKey() != 200){ + throw new HttpRequestException(response); + } + }catch (HttpRequestException e){ + throw e; + }catch (Exception e) { + throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600); } } - public void deleteEvent(int userId, int eventId, LocalDateTime date) { + public void deleteEvent(int userId, int eventId, LocalDateTime date) throws HttpRequestException { try { System.out.println("DELETE: userId=" + userId + "&eventId=" + eventId + "&date=" + date.toLocalDate()); - System.out.println(httpRequest.sendPostRequest( + Tuple response = httpRequest.sendPostRequest( DELETE_EVENT_ENDPOINT, "userId=" + userId + "&eventId=" + eventId + "&date=" + date.toLocalDate(), true - )); - } catch (Exception e) { - e.printStackTrace(); + ); + if(response.getKey() != 200){ + throw new HttpRequestException(response); + } + }catch (HttpRequestException e){ + throw e; + }catch (Exception e) { + throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600); } } - public ArrayList getAllVisibleEvents(LocalDateTime startDate, LocalDateTime endDate) { + public ArrayList getAllVisibleEvents(LocalDateTime startDate, LocalDateTime endDate) throws HttpRequestException { ArrayList eventList = new ArrayList<>(); try { Tuple response = httpRequest.sendPostRequest( @@ -89,6 +122,9 @@ public class DataController { "userId=" + USER_ID + "&startDate=" + startDate.toLocalDate() + "&endDate=" + endDate.toLocalDate(), true ); + if(response.getKey() != 200){ + throw new HttpRequestException(response); + } String jsonResponse = response.getValue(); System.out.println(jsonResponse); @@ -97,35 +133,14 @@ public class DataController { eventList = (ArrayList) objectMapper.readValue(jsonResponse, new TypeReference>(){}); - } catch (Exception e) { - e.printStackTrace(); + }catch (HttpRequestException e){ + throw e; + }catch (Exception e) { + throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600); } return eventList; } - public Event[] getAllEvents() { - Event[] eventList = null; - try { - String jsonResponse = httpRequest.sendGetRequest("http://localhost:8080/vpr/all-events-test"); - eventList = parseJsonToEventList(jsonResponse); - for (Event e : eventList) { - System.out.println(e); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return eventList; - } - - private Event[] parseJsonToEventList(String jsonString) throws JsonProcessingException { - ArrayList eventList; - - // Parse JSON - ObjectMapper objectMapper = new ObjectMapper(); - - return objectMapper.readValue(jsonString, Event[].class); - } } \ No newline at end of file