diff --git a/db/nursingHome.db b/db/nursingHome.db index 87428bb..b89b146 100644 Binary files a/db/nursingHome.db and b/db/nursingHome.db differ diff --git a/src/main/java/de/hitec/nhplus/Main.java b/src/main/java/de/hitec/nhplus/Main.java index 52813b3..2393731 100644 --- a/src/main/java/de/hitec/nhplus/Main.java +++ b/src/main/java/de/hitec/nhplus/Main.java @@ -2,6 +2,8 @@ package de.hitec.nhplus; import de.hitec.nhplus.datastorage.ConnectionBuilder; import de.hitec.nhplus.login.LoginController; +import de.hitec.nhplus.login.User; +import de.hitec.nhplus.main.MainWindowController; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLLoader; @@ -54,8 +56,8 @@ public class Main extends Application { loginStage.showAndWait(); - if(controller.user == null){ - executeMainApplication(); + if(controller.user != null){ + executeMainApplication(controller.user); } } catch (IOException exception) { exception.printStackTrace(); @@ -65,7 +67,7 @@ public class Main extends Application { /** * Executes the main application. */ - private void executeMainApplication() { + private void executeMainApplication(User user) { try { FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/main/MainWindowView.fxml")); TabPane pane = loader.load(); @@ -74,6 +76,10 @@ public class Main extends Application { this.primaryStage.setTitle("NHPlus"); this.primaryStage.setScene(scene); this.primaryStage.setResizable(true); + + MainWindowController controller = loader.getController(); + controller.initialize(user); + this.primaryStage.show(); this.primaryStage.setOnCloseRequest(event -> { diff --git a/src/main/java/de/hitec/nhplus/fixtures/Fixtures.java b/src/main/java/de/hitec/nhplus/fixtures/Fixtures.java index 0ea398b..5897378 100644 --- a/src/main/java/de/hitec/nhplus/fixtures/Fixtures.java +++ b/src/main/java/de/hitec/nhplus/fixtures/Fixtures.java @@ -46,7 +46,7 @@ public class Fixtures { medicationFixture.setupTable(connection); medicationFixture.load(); - UserFixture userFixture = new UserFixture(); + UserFixture userFixture = new UserFixture(nursesByName); userFixture.dropTable(connection); userFixture.setupTable(connection); userFixture.load(); diff --git a/src/main/java/de/hitec/nhplus/fixtures/NurseFixture.java b/src/main/java/de/hitec/nhplus/fixtures/NurseFixture.java index c5d0c0f..3da00ed 100644 --- a/src/main/java/de/hitec/nhplus/fixtures/NurseFixture.java +++ b/src/main/java/de/hitec/nhplus/fixtures/NurseFixture.java @@ -54,6 +54,12 @@ public class NurseFixture implements Fixture { true )); + nurses.add(new Nurse( + "Maria", + "Höller", + "666" + )); + NurseDao dao = DaoFactory.getInstance().createNurseDAO(); for (Nurse nurse : nurses) { dao.create(nurse); diff --git a/src/main/java/de/hitec/nhplus/fixtures/UserFixture.java b/src/main/java/de/hitec/nhplus/fixtures/UserFixture.java index 2fff14f..7b3550f 100644 --- a/src/main/java/de/hitec/nhplus/fixtures/UserFixture.java +++ b/src/main/java/de/hitec/nhplus/fixtures/UserFixture.java @@ -2,9 +2,10 @@ package de.hitec.nhplus.fixtures; import de.hitec.nhplus.Main; import de.hitec.nhplus.datastorage.DaoFactory; +import de.hitec.nhplus.login.Permissions; import de.hitec.nhplus.login.User; import de.hitec.nhplus.login.database.UserDao; -import de.hitec.nhplus.medication.Medication; +import de.hitec.nhplus.nurse.Nurse; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -16,6 +17,13 @@ public class UserFixture implements Fixture{ private static final String SCHEMA = "/de/hitec/nhplus/login/database/User.sql"; private static final String PERMISSION_SCHEMA = "/de/hitec/nhplus/login/database/UserPermission.sql"; private static final String TO_NURSE_SCHEMA = "/de/hitec/nhplus/login/database/UserToNurse.sql"; + + private final Map nursesByName; + + public UserFixture(Map nursesByName) { + this.nursesByName = nursesByName; + } + @Override public void dropTable(Connection connection) throws SQLException { connection.createStatement().execute("DROP TABLE IF EXISTS user"); @@ -54,9 +62,7 @@ public class UserFixture implements Fixture{ User udo = new User( "udo", - null, - null, - Integer.parseInt("00000001", 2), + Permissions.OWNER, null ); udo.setPassword("uD0_187!"); @@ -64,14 +70,28 @@ public class UserFixture implements Fixture{ User maria = new User( "maria", - null, - null, - 0, - null + Permissions.NURSE, + nursesByName.get("Maria") ); maria.setPassword("H!mm3lf4hrt"); users.add(maria); + User werner = new User( + "werner", + Permissions.MANAGEMENT, + null + ); + werner.setPassword("TurboSchraube42!"); + users.add(werner); + + User fullPermissionsTestUser = new User( + "test", + -1, + null + ); + fullPermissionsTestUser.setPassword(""); + users.add(fullPermissionsTestUser); + UserDao dao = DaoFactory.getInstance().createUserDAO(); Map usersByUsername = new HashMap<>(); for (User user : users){ diff --git a/src/main/java/de/hitec/nhplus/login/LoginController.java b/src/main/java/de/hitec/nhplus/login/LoginController.java index dca1cd7..bec7101 100644 --- a/src/main/java/de/hitec/nhplus/login/LoginController.java +++ b/src/main/java/de/hitec/nhplus/login/LoginController.java @@ -88,6 +88,5 @@ public class LoginController { } catch (SQLException | NoSuchAlgorithmException exception) { exception.printStackTrace(); } - } } diff --git a/src/main/java/de/hitec/nhplus/login/Permissions.java b/src/main/java/de/hitec/nhplus/login/Permissions.java new file mode 100644 index 0000000..8420986 --- /dev/null +++ b/src/main/java/de/hitec/nhplus/login/Permissions.java @@ -0,0 +1,8 @@ +package de.hitec.nhplus.login; + +public class Permissions { + public final static int EVERYBODY = 0b0; + public final static int NURSE = 0b1; + public final static int MANAGEMENT = 0b10; + public final static int OWNER = 0b100; +} diff --git a/src/main/java/de/hitec/nhplus/login/User.java b/src/main/java/de/hitec/nhplus/login/User.java index 0621b9d..50e604f 100644 --- a/src/main/java/de/hitec/nhplus/login/User.java +++ b/src/main/java/de/hitec/nhplus/login/User.java @@ -9,6 +9,7 @@ import java.security.SecureRandom; public class User { + private int id; private String username; private byte[] passwordSalt; @@ -34,30 +35,13 @@ public class User { public User( String username, - byte[] passwordSalt, - byte[] passwordHash, int permissions, Nurse nurse ) { this.username = username; - this.passwordSalt = passwordSalt; - this.passwordHash = passwordHash; this.permissions = permissions; this.nurse = nurse; } - - public int getId() { - return id; - } - - public byte[] getPasswordSalt() { - return passwordSalt; - } - - public byte[] getPasswordHash() { - return passwordHash; - } - public void setPassword(String password) { try { SecureRandom random = new SecureRandom(); @@ -72,6 +56,25 @@ public class User { } } + public boolean hasNursePermissions(){ + return (permissions & Permissions.NURSE) != 0; + } + public boolean hasAdminPermissions(){ + return (permissions & Permissions.MANAGEMENT) != 0; + } + + public int getId() { + return id; + } + + public byte[] getPasswordSalt() { + return passwordSalt; + } + + public byte[] getPasswordHash() { + return passwordHash; + } + public String getUsername() { return username; } diff --git a/src/main/java/de/hitec/nhplus/login/database/UserDao.java b/src/main/java/de/hitec/nhplus/login/database/UserDao.java index 8807ca1..915ec08 100644 --- a/src/main/java/de/hitec/nhplus/login/database/UserDao.java +++ b/src/main/java/de/hitec/nhplus/login/database/UserDao.java @@ -86,7 +86,7 @@ public class UserDao implements Dao { statement.setBytes(3, user.getPasswordHash()); statement.execute(); - ResultSet generatedKeys = connection.createStatement().executeQuery("SELECT id FROM user"); + ResultSet generatedKeys = connection.createStatement().executeQuery("SELECT last_insert_rowid()"); connection.commit(); //Finish SQL Transaction connection.setAutoCommit(true); //Switch back Mode @@ -112,13 +112,11 @@ public class UserDao implements Dao { INSERT INTO user__nurse (userId, nurseId) VALUES (?, ?); - - """; PreparedStatement nurseStatement = this.connection.prepareStatement(nurseSQL); - permissionStatement.setInt(1, newId); - permissionStatement.setInt(2, user.getNurse().getId()); - permissionStatement.execute(); + nurseStatement.setInt(1, newId); + nurseStatement.setInt(2, user.getNurse().getId()); + nurseStatement.execute(); } @Override diff --git a/src/main/java/de/hitec/nhplus/main/MainWindowController.java b/src/main/java/de/hitec/nhplus/main/MainWindowController.java index 5b7b4e4..aa00e93 100644 --- a/src/main/java/de/hitec/nhplus/main/MainWindowController.java +++ b/src/main/java/de/hitec/nhplus/main/MainWindowController.java @@ -1,20 +1,15 @@ package de.hitec.nhplus.main; -import de.hitec.nhplus.Main; -import de.hitec.nhplus.nurse.Nurse; +import de.hitec.nhplus.login.Permissions; +import de.hitec.nhplus.login.User; +import de.hitec.nhplus.utils.tab.TabManager; +import de.hitec.nhplus.utils.tab.TabStruct; +import javafx.event.Event; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.control.SelectionModel; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.BorderPane; -import de.hitec.nhplus.treatment.Treatment; -import de.hitec.nhplus.medication.Medication; -import de.hitec.nhplus.patient.Patient; -import java.io.IOException; -import java.util.Objects; +import java.util.List; /** * Controller for the main window of the application, which holds all tabs. @@ -26,199 +21,65 @@ import java.util.Objects; */ public class MainWindowController { @FXML - private TabPane mainTabPane; - @FXML - private AnchorPane patientPage; - @FXML - private Tab patientTab; - @FXML - private AnchorPane activeTreatmentPage; - @FXML - private Tab treatmentTab; - @FXML - private TabPane treatmentTabPane; - @FXML - private Tab activeTreatmentTab; - @FXML - private AnchorPane lockedTreatmentPage; - @FXML - private Tab lockedTreatmentTab; - @FXML - private Tab nurseTab; - @FXML - private TabPane nurseTabPane; - @FXML - private AnchorPane activeNursePage; - @FXML - private Tab activeNurseTab; - @FXML - private AnchorPane lockedNursePage; - @FXML - private Tab lockedNurseTab; - @FXML - private AnchorPane medicationPage; - @FXML - private Tab medicationTab; + public TabPane mainTabPane; + + private User user; + private TabManager tabManager; /** - * Initialization method that is called after the binding of all the fields. + * JavaFX Initialization method that is called after the binding of all the fields. + * + * @param user The logged in {@link User}. */ @FXML - public void initialize() { - loadPatientPage(); - mainTabPane.getSelectionModel().select(patientTab); - - patientTab.setOnSelectionChanged(event -> loadPatientPage()); - medicationTab.setOnSelectionChanged(event -> loadMedicationPage()); - - - nurseTab.setOnSelectionChanged(event -> loadNursePage()); - nurseTabPane.getSelectionModel().select(activeNurseTab); - - activeNurseTab.setOnSelectionChanged(event -> loadActiveNursePage()); - lockedNurseTab.setOnSelectionChanged(event -> loadLockedNursePage()); - - treatmentTab.setOnSelectionChanged(event -> loadTreatmentPage()); - treatmentTabPane.getSelectionModel().select(activeTreatmentTab); - - activeTreatmentTab.setOnSelectionChanged(event -> loadActiveTreatmentPage()); - lockedTreatmentTab.setOnSelectionChanged(event -> loadLockedTreatmentPage()); - + public void initialize(User user) { + this.user = user; + this.tabManager = new TabManager(user); + setupTabs(); } /** - * Loads the {@link Patient} page into its tab. + * Sets up all Tabs Accessible, with help of the {@link TabManager}. */ - private void loadPatientPage() { - try { - BorderPane patientsPane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/patient/AllPatientView.fxml")) - ); - patientPage.getChildren().setAll(patientsPane); - AnchorPane.setTopAnchor(patientsPane, 0d); - AnchorPane.setBottomAnchor(patientsPane, 0d); - AnchorPane.setLeftAnchor(patientsPane, 0d); - AnchorPane.setRightAnchor(patientsPane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } - } + private void setupTabs() { + tabManager.setupTab(mainTabPane, new TabStruct( + "Patienten", + "/de/hitec/nhplus/patient/AllPatientView.fxml", + Permissions.NURSE + )); + tabManager.setupSubTabPane(mainTabPane, "Behandlungen", Permissions.NURSE, List.of( + new TabStruct( + "Behandlungen", + "/de/hitec/nhplus/treatment/AllTreatmentView.fxml", + Permissions.NURSE + ), + new TabStruct( + "Gesperrte Behandlungen", + "/de/hitec/nhplus/treatment/LockedTreatmentView.fxml", + Permissions.NURSE + ) + )); + tabManager.setupSubTabPane(mainTabPane, "Pfleger", Permissions.EVERYBODY, List.of( + new TabStruct( + "Pfleger", + "/de/hitec/nhplus/nurse/AllNurseView.fxml", + Permissions.NURSE | Permissions.MANAGEMENT + ), + new TabStruct( + "Gesperrte Pfleger", + "/de/hitec/nhplus/nurse/LockedNurseView.fxml", + Permissions.MANAGEMENT | Permissions.OWNER + ) + )); + tabManager.setupTab(mainTabPane, new TabStruct( + "Medikamente", + "/de/hitec/nhplus/medication/AllMedicationView.fxml", + Permissions.MANAGEMENT + )); - /** - * Loads the {@link Treatment } tab. - */ - private void loadTreatmentPage() { - SelectionModel selectionModel = treatmentTabPane.getSelectionModel(); - Tab selectedTab = selectionModel.getSelectedItem(); - if (selectedTab == activeTreatmentTab) { - loadActiveTreatmentPage(); - } - if (selectedTab == lockedTreatmentTab) { - loadLockedTreatmentPage(); - } - } - /** - * Loads the active {@link Treatment} page into its tab. - */ - private void loadActiveTreatmentPage() { - try { - BorderPane activeTreatmentPane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/treatment/AllTreatmentView.fxml")) - ); - activeTreatmentPage.getChildren().setAll(activeTreatmentPane); - AnchorPane.setTopAnchor(activeTreatmentPane, 0d); - AnchorPane.setBottomAnchor(activeTreatmentPane, 0d); - AnchorPane.setLeftAnchor(activeTreatmentPane, 0d); - AnchorPane.setRightAnchor(activeTreatmentPane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - /** - * Loads the locked {@link Treatment} page into its tab. - */ - private void loadLockedTreatmentPage() { - try { - BorderPane treatmentsPane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/treatment/LockedTreatmentView.fxml")) - ); - lockedTreatmentPage.getChildren().setAll(treatmentsPane); - AnchorPane.setTopAnchor(treatmentsPane, 0d); - AnchorPane.setBottomAnchor(treatmentsPane, 0d); - AnchorPane.setLeftAnchor(treatmentsPane, 0d); - AnchorPane.setRightAnchor(treatmentsPane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - /** - * Loads the {@link Nurse} page into its tab. - */ - private void loadNursePage() { - SelectionModel selectionModel = nurseTabPane.getSelectionModel(); - Tab selectedTab = selectionModel.getSelectedItem(); - if (selectedTab == activeNurseTab) { - loadActiveNursePage(); - } - if (selectedTab == lockedNurseTab) { - loadLockedNursePage(); - } - } - - /** - * Loads the active {@link Nurse} page into its tab. - */ - private void loadActiveNursePage() { - try { - BorderPane activeNursePane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/nurse/AllNurseView.fxml")) - ); - activeNursePage.getChildren().setAll(activeNursePane); - AnchorPane.setTopAnchor(activeNursePane, 0d); - AnchorPane.setBottomAnchor(activeNursePane, 0d); - AnchorPane.setLeftAnchor(activeNursePane, 0d); - AnchorPane.setRightAnchor(activeNursePane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - /** - * Loads the locked {@link Nurse} page into its tab. - */ - private void loadLockedNursePage() { - try { - BorderPane lockedNursePane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/nurse/LockedNurseView.fxml")) - ); - lockedNursePage.getChildren().setAll(lockedNursePane); - AnchorPane.setTopAnchor(lockedNursePane, 0d); - AnchorPane.setBottomAnchor(lockedNursePane, 0d); - AnchorPane.setLeftAnchor(lockedNursePane, 0d); - AnchorPane.setRightAnchor(lockedNursePane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - /** - * Loads the {@link Medication} page into its tab. - */ - private void loadMedicationPage() { - try { - BorderPane medicationPane = FXMLLoader.load( - Objects.requireNonNull(Main.class.getResource("/de/hitec/nhplus/medication/AllMedicationView.fxml")) - ); - medicationPage.getChildren().setAll(medicationPane); - AnchorPane.setTopAnchor(medicationPane, 0d); - AnchorPane.setBottomAnchor(medicationPane, 0d); - AnchorPane.setLeftAnchor(medicationPane, 0d); - AnchorPane.setRightAnchor(medicationPane, 0d); - } catch (IOException exception) { - exception.printStackTrace(); - } + Tab defaultTab = mainTabPane.getTabs().get(0); + mainTabPane.getSelectionModel().select(defaultTab); + defaultTab.getOnSelectionChanged().handle(new Event(Event.ANY)); } } diff --git a/src/main/java/de/hitec/nhplus/utils/tab/TabManager.java b/src/main/java/de/hitec/nhplus/utils/tab/TabManager.java new file mode 100644 index 0000000..16a67ba --- /dev/null +++ b/src/main/java/de/hitec/nhplus/utils/tab/TabManager.java @@ -0,0 +1,82 @@ +package de.hitec.nhplus.utils.tab; + +import de.hitec.nhplus.Main; +import de.hitec.nhplus.login.Permissions; +import de.hitec.nhplus.login.User; +import javafx.event.Event; +import javafx.event.EventHandler; +import javafx.fxml.FXMLLoader; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.BorderPane; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +public class TabManager { + private final User user; + + public TabManager(User user) { + this.user = user; + } + + private boolean hasPermissions(int requiredPermissions, int permissions) { + return requiredPermissions == Permissions.EVERYBODY + || (permissions & requiredPermissions) != 0; + } + + public void setupTab(TabPane tabPane, TabStruct tabStruct) { + if (!hasPermissions(tabStruct.requiredPermissions, user.getPermissions())) { + return; + } + Tab tab = new Tab(); + tab.setText(tabStruct.title); + AnchorPane pane = new AnchorPane(); + tab.setContent(pane); + tab.setOnSelectionChanged(loadTabEventHandler(tabStruct, pane)); + tabPane.getTabs().add(tab); + } + + private EventHandler loadTabEventHandler(TabStruct tabStruct, AnchorPane pane) { + return event -> { + try { + BorderPane patientsPane = FXMLLoader.load( + Objects.requireNonNull(Main.class.getResource(tabStruct.view)) + ); + pane.getChildren().setAll(patientsPane); + AnchorPane.setTopAnchor(patientsPane, 0d); + AnchorPane.setBottomAnchor(patientsPane, 0d); + AnchorPane.setLeftAnchor(patientsPane, 0d); + AnchorPane.setRightAnchor(patientsPane, 0d); + } catch (IOException exception) { + exception.printStackTrace(); + } + }; + } + + public void setupSubTabPane(TabPane parentTabPane, String title, int requiredPermissions, List subTabs) { + if (!hasPermissions(requiredPermissions, user.getPermissions())) { + return; + } + Tab tab = new Tab(); + tab.setText(title); + TabPane subTabPane = new TabPane(); + subTabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); + tab.setContent(subTabPane); + subTabs.forEach(tabStruct -> setupTab(subTabPane, tabStruct)); + if (subTabPane.getTabs().isEmpty()) { + return; + } + tab.setOnSelectionChanged(loadSubTabPaneEventHandler(subTabPane)); + parentTabPane.getTabs().add(tab); + } + + private EventHandler loadSubTabPaneEventHandler(TabPane tabPane) { + return event -> { + Tab tab = tabPane.getSelectionModel().getSelectedItem(); + tab.getOnSelectionChanged().handle(new Event(Event.ANY)); + }; + } +} diff --git a/src/main/java/de/hitec/nhplus/utils/tab/TabStruct.java b/src/main/java/de/hitec/nhplus/utils/tab/TabStruct.java new file mode 100644 index 0000000..9a49919 --- /dev/null +++ b/src/main/java/de/hitec/nhplus/utils/tab/TabStruct.java @@ -0,0 +1,13 @@ +package de.hitec.nhplus.utils.tab; + +public class TabStruct { + public String title; + public String view; + public int requiredPermissions; + + public TabStruct(String title, String view, int requiredPermissions) { + this.title = title; + this.view = view; + this.requiredPermissions = requiredPermissions; + } +} \ No newline at end of file diff --git a/src/main/resources/de/hitec/nhplus/main/MainWindowView.fxml b/src/main/resources/de/hitec/nhplus/main/MainWindowView.fxml index fdb8bef..033a28e 100644 --- a/src/main/resources/de/hitec/nhplus/main/MainWindowView.fxml +++ b/src/main/resources/de/hitec/nhplus/main/MainWindowView.fxml @@ -1,38 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/> \ No newline at end of file