Compare commits

...

9 commits

Author SHA1 Message Date
e17f2e44dd
NOTICKET: Finishing Javadoc
Some checks failed
Quality Check / Linting Check (push) Failing after 16s
Quality Check / Linting Check (pull_request) Failing after 21s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 32s
2024-05-15 00:19:36 +02:00
af6ad9de15
NOTICKET: Javadoc Cleanup 2024-05-14 23:26:13 +02:00
817447239f
NOTICKET: Javadoc for Dao Implementations
Some checks failed
Quality Check / Linting Check (push) Failing after 16s
Quality Check / Linting Check (pull_request) Failing after 21s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 32s
2024-05-14 23:22:31 +02:00
7145f41be3
NOTICKET: Javadoc Grammar Check
All checks were successful
Quality Check / Linting Check (push) Successful in 17s
Quality Check / Linting Check (pull_request) Successful in 22s
Quality Check / Javadoc Check (push) Successful in 35s
Quality Check / Javadoc Check (pull_request) Successful in 32s
2024-05-14 23:01:42 +02:00
47da77d510
NOTICKET: Add Javadoc for All Model Classes
All checks were successful
Quality Check / Linting Check (push) Successful in 16s
Quality Check / Linting Check (pull_request) Successful in 20s
Quality Check / Javadoc Check (push) Successful in 33s
Quality Check / Javadoc Check (pull_request) Successful in 31s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-14 18:44:47 +02:00
5cbdd1205d
NOTICKET: add de.hitec.nhplus.main and de.hitec.nhplus.fixtures Javadoc
All checks were successful
Quality Check / Linting Check (push) Successful in 17s
Quality Check / Linting Check (pull_request) Successful in 22s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 33s
2024-05-14 12:59:08 +02:00
dd66194223
NOTICKET: Add Javadoc for de.hitec.nhplus.Main
All checks were successful
Quality Check / Linting Check (push) Successful in 15s
Quality Check / Linting Check (pull_request) Successful in 20s
Quality Check / Javadoc Check (push) Successful in 34s
Quality Check / Javadoc Check (pull_request) Successful in 32s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-13 18:50:23 +02:00
e5aaa9afab
NOTICKET: Add Javadoc for de.hitec.nhplus.utils
All checks were successful
Quality Check / Linting Check (push) Successful in 12s
Quality Check / Javadoc Check (push) Successful in 20s
Quality Check / Linting Check (pull_request) Successful in 12s
Quality Check / Javadoc Check (pull_request) Successful in 21s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-13 18:27:57 +02:00
0ea3d92cc0
NOTICKET: Finish Javadoc for de.hitec.nhplus.datastorage
All checks were successful
Quality Check / Linting Check (push) Successful in 12s
Quality Check / Javadoc Check (push) Successful in 20s
Signed-off-by: Dominik Säume <Dominik.Saeume@hmmh.de>
2024-05-12 23:48:53 +02:00
29 changed files with 609 additions and 231 deletions

View file

@ -1,7 +1,6 @@
package de.hitec.nhplus; package de.hitec.nhplus;
import de.hitec.nhplus.datastorage.ConnectionBuilder; import de.hitec.nhplus.datastorage.ConnectionBuilder;
import javafx.application.Application; import javafx.application.Application;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
@ -12,18 +11,35 @@ import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
/** /**
* @author dominik.saeume@hmmh.ag * The application main class, holding the {@link #main} entrypoint.
*
* @author Bernd Heideman
* @author Dominik Säume
*/ */
public class Main extends Application { public class Main extends Application {
private Stage primaryStage; private Stage primaryStage;
/**
* The main entry point.
*/
public static void main(String[] args) {
launch(args);
}
/**
* Implementation of the JavaFX start hook.
*/
@Override @Override
public void start(Stage primaryStage) { public void start(Stage primaryStage) {
this.primaryStage = primaryStage; this.primaryStage = primaryStage;
mainWindow(); executeMainApplication();
} }
public void mainWindow() { /**
* Executes the main application.
*/
private void executeMainApplication() {
try { try {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/main/MainWindowView.fxml")); FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/main/MainWindowView.fxml"));
TabPane pane = loader.load(); TabPane pane = loader.load();
@ -44,7 +60,4 @@ public class Main extends Application {
} }
} }
public static void main(String[] args) {
launch(args);
}
} }

View file

@ -7,7 +7,7 @@ import java.sql.DriverManager;
import java.sql.SQLException; import java.sql.SQLException;
/** /**
* The {@link DaoFactory} allows a safe connection to the Database. * The {@link DaoFactory} allows a safe connection to the database.
* *
* @author Bernd Heidemann * @author Bernd Heidemann
* @author Dominik Säume * @author Dominik Säume
@ -21,7 +21,7 @@ public class ConnectionBuilder {
private static Connection connection; private static Connection connection;
/** /**
* @return A Thread-safe {@link Connection} to the Database. * @return A thread-safe {@link Connection} to the database.
*/ */
synchronized public static Connection getConnection() { synchronized public static Connection getConnection() {
try { try {
@ -38,7 +38,7 @@ public class ConnectionBuilder {
} }
/** /**
* Closes the Connection to the Database. * Closes the connection to the database.
*/ */
synchronized public static void closeConnection() { synchronized public static void closeConnection() {
try { try {

View file

@ -4,47 +4,48 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
/** /**
* {@link Dao} is the Abbreviation of Data-Access-Object. * {@link Dao} is the abbreviation for Data-Access-Object.
* This Interface has the Basic Methods which are needed on any {@link Dao} to work as expected. * This interface has the Basic Methods that are needed on any {@link Dao} to work as expected.
* *
* @param <T> The Model for which that {@link Dao} is implemented. * @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemann * @author Bernd Heidemann
* @author Dominik Säume * @author Dominik Säume
* @version 1.0 * @version 1.0
* @implSpec The Implementations should be added to the {@link DaoFactory}. * @implSpec The implementations should be added to the {@link DaoFactory}.
*/ */
public interface Dao<T> { public interface Dao<T> {
/** /**
* Create a Database Entry from a Model object. * Create a database entry from a model object.
* *
* @param t The Model instance. * @param t The model instance.
*/ */
void create(T t) throws SQLException; void create(T t) throws SQLException;
/** /**
* Read a Database Entry to a Model object. * Read a database entry to a model object.
* *
* @param id The ID of the Element in the Database. * @param id The ID of the element in the database.
* @return a model instance of {@link T}.
*/ */
T read(int id) throws SQLException; T read(int id) throws SQLException;
/** /**
* @return All Database Entries as a {@link List} of Model instances * @return All database entries as a {@link List} of model instances.
*/ */
List<T> readAll() throws SQLException; List<T> readAll() throws SQLException;
/** /**
* Update the Database according to the Values of the Model object. * Update the database according to the values of the model object.
* *
* @param t The Model instance. * @param t The model instance.
*/ */
void update(T t) throws SQLException; void update(T t) throws SQLException;
/** /**
* Delete a Database Entry. * Delete a database entry.
* *
* @param id The ID of the Element in the Database. * @param id The ID of the element in the database.
*/ */
void delete(int id) throws SQLException; void delete(int id) throws SQLException;
} }

View file

@ -6,7 +6,7 @@ import de.hitec.nhplus.patient.database.PatientDao;
import de.hitec.nhplus.treatment.database.TreatmentDao; import de.hitec.nhplus.treatment.database.TreatmentDao;
/** /**
* The {@link DaoFactory} is a Singleton({@link #getInstance}) which should be used to get {@link Dao}s. * The {@link DaoFactory} is a singleton({@link #getInstance}) that should be used to get {@link Dao}s.
* *
* @author Bernd Heidemann * @author Bernd Heidemann
* @author Dominik Säume * @author Dominik Säume
@ -17,13 +17,13 @@ public class DaoFactory {
private static DaoFactory instance; private static DaoFactory instance;
/** /**
* A Private Constructor according to the Singleton Pattern. * A private constructor according to the singleton pattern.
*/ */
private DaoFactory() { private DaoFactory() {
} }
/** /**
* @return The Singleton Instance. * @return The singleton instance of {@link DaoFactory}.
*/ */
public static DaoFactory getInstance() { public static DaoFactory getInstance() {
if (DaoFactory.instance == null) { if (DaoFactory.instance == null) {
@ -33,7 +33,7 @@ public class DaoFactory {
} }
/** /**
* @return A new {@link TreatmentDao} Instance with a Database Connection. * @return A new {@link TreatmentDao} instance with a database connection.
* @see de.hitec.nhplus.treatment.Treatment Treatment * @see de.hitec.nhplus.treatment.Treatment Treatment
*/ */
public TreatmentDao createTreatmentDao() { public TreatmentDao createTreatmentDao() {
@ -41,7 +41,7 @@ public class DaoFactory {
} }
/** /**
* @return A new {@link PatientDao} Instance with a Database Connection. * @return A new {@link PatientDao} instance with a database connection.
* @see de.hitec.nhplus.patient.Patient Patient * @see de.hitec.nhplus.patient.Patient Patient
*/ */
public PatientDao createPatientDAO() { public PatientDao createPatientDAO() {
@ -49,7 +49,7 @@ public class DaoFactory {
} }
/** /**
* @return A new {@link NurseDao} Instance with a Database Connection. * @return A new {@link NurseDao} instance with a database connection.
* @see de.hitec.nhplus.nurse.Nurse Nurse * @see de.hitec.nhplus.nurse.Nurse Nurse
*/ */
public NurseDao createNurseDAO() { public NurseDao createNurseDAO() {
@ -57,7 +57,7 @@ public class DaoFactory {
} }
/** /**
* @return A new {@link MedicationDao} Instance with a Database Connection. * @return A new {@link MedicationDao} instance with a database connection.
* @see de.hitec.nhplus.medication.Medication Medication * @see de.hitec.nhplus.medication.Medication Medication
*/ */
public MedicationDao createMedicationDAO() { public MedicationDao createMedicationDAO() {

View file

@ -7,30 +7,30 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
/** /**
* The {@link DaoImp} is a Generic Base Implementation of the {@link Dao}, * The {@link DaoImp} is a generic base implementation of the {@link Dao},
* which should fit most use cases. * that should fit most use cases.
* *
* @param <T> The Model for which that {@link Dao} is implemented. * @param <T> The model for which that {@link Dao} is implemented.
* @author Bernd Heidemann * @author Bernd Heidemann
* @author Dominik Säume * @author Dominik Säume
* @version 1.0 * @version 1.0
* @implSpec The Implementations should be added to the {@link DaoFactory}. * @implSpec The implementations should be added to the {@link DaoFactory}.
*/ */
public abstract class DaoImp<T> implements Dao<T> { public abstract class DaoImp<T> implements Dao<T> {
protected final Connection connection; protected final Connection connection;
/** /**
* @param connection The Database Connection to use * @param connection The database {@link Connection} to use.
* @implSpec The Connection should be Received from the {@link ConnectionBuilder}. * @implSpec The {@link Connection} should be received from the {@link ConnectionBuilder}.
*/ */
public DaoImp(Connection connection) { public DaoImp(Connection connection) {
this.connection = connection; this.connection = connection;
} }
/** /**
* Creates a new Database Entry from a Model object. * Creates a new database entry from a model object.
* *
* @param t The Model instance. * @param t The model instance.
*/ */
@Override @Override
public void create(T t) throws SQLException { public void create(T t) throws SQLException {
@ -38,9 +38,10 @@ public abstract class DaoImp<T> implements Dao<T> {
} }
/** /**
* Read a Database Entry to a Model object. * Read a database entry to a model object.
* *
* @param id The ID of the Element in the Database. * @param id The ID of the element in the database.
* @return the model instance of type {@link T}, which was read.
*/ */
@Override @Override
public T read(int id) throws SQLException { public T read(int id) throws SQLException {
@ -53,7 +54,9 @@ public abstract class DaoImp<T> implements Dao<T> {
} }
/** /**
* Read all Database Entries to a {@link List} of Model objects. * Read all database entries to a {@link List} of model objects.
*
* @return a {@link List} of type {@link T} holding all database entries as model instances.
*/ */
@Override @Override
public List<T> readAll() throws SQLException { public List<T> readAll() throws SQLException {
@ -61,9 +64,9 @@ public abstract class DaoImp<T> implements Dao<T> {
} }
/** /**
* Update the Database according to the Values of the Model object. * Update the database according to the values of the model object.
* *
* @param t The Model instance. * @param t The model instance.
*/ */
@Override @Override
public void update(T t) throws SQLException { public void update(T t) throws SQLException {
@ -71,26 +74,62 @@ public abstract class DaoImp<T> implements Dao<T> {
} }
/** /**
* Delete a Database Entry. * Delete a database entry.
* *
* @param id The ID of the Element in the Database. * @param id The ID of the element in the database.
*/ */
@Override @Override
public void delete(int id) throws SQLException { public void delete(int id) throws SQLException {
getDeleteStatement(id).executeUpdate(); getDeleteStatement(id).executeUpdate();
} }
/**
* @param result The {@link ResultSet} from execution of the statement received from {@link #getReadByIDStatement}.
* @return The model instance of type {@link T}.
* @implSpec This will be called in {@link #read}.
*/
protected abstract T getInstanceFromResultSet(ResultSet result) throws SQLException; protected abstract T getInstanceFromResultSet(ResultSet result) throws SQLException;
protected abstract List<T> getListFromResultSet(ResultSet result) throws SQLException; /**
* @param id The ID of the database entry to read.
protected abstract PreparedStatement getCreateStatement(T t) throws SQLException; * @return A {@link PreparedStatement} to read a specific entry by its ID.
* @implSpec This will be called in {@link #read}.
* The output of the execution will be used in {@link #getInstanceFromResultSet}.
*/
protected abstract PreparedStatement getReadByIDStatement(int id) throws SQLException; protected abstract PreparedStatement getReadByIDStatement(int id) throws SQLException;
/**
* @param result The {@link ResultSet} from execution of the statement received from {@link #getReadAllStatement}.
* @return A {@link List} of type {@link T} holding all database entries as model instances.
* @implSpec This will be called in {@link #readAll}.
*/
protected abstract List<T> getListFromResultSet(ResultSet result) throws SQLException;
/**
* @return A {@link PreparedStatement} to read all entries of this model.
* @implSpec This will be called in {@link #readAll}.
* The output of the execution will be used in {@link #getListFromResultSet}.
*/
protected abstract PreparedStatement getReadAllStatement() throws SQLException; protected abstract PreparedStatement getReadAllStatement() throws SQLException;
/**
* @param t The model instance of type {@link T} for which an entry should be created.
* @return a {@link PreparedStatement} which can be used to create a new database entry for the model instance.
* @implSpec This will be called in {@link #create}.
*/
protected abstract PreparedStatement getCreateStatement(T t) throws SQLException;
/**
* @param t The model instance of type {@link T} for which the entry should be updated.
* @return a {@link PreparedStatement} which can be used to update the database entry for the model instance.
* @implSpec This will be called in {@link #update}.
*/
protected abstract PreparedStatement getUpdateStatement(T t) throws SQLException; protected abstract PreparedStatement getUpdateStatement(T t) throws SQLException;
/**
* @param id The ID of the database entry which should be deleted.
* @return a {@link PreparedStatement} which can be used to delete the database entry.
* @implSpec This will be called in {@link #delete}.
*/
protected abstract PreparedStatement getDeleteStatement(int id) throws SQLException; protected abstract PreparedStatement getDeleteStatement(int id) throws SQLException;
} }

View file

@ -7,36 +7,36 @@ import java.sql.SQLException;
import java.util.Map; import java.util.Map;
/** /**
* A Fixture is a Class, which can be used to set up a specific set of Data. * A fixture is a class, which can be used to set up a specific set of data.
* *
* @param <T> The Model for which the {@link Fixture} is implemented. * @param <T> The model for which the {@link Fixture} is implemented.
* @author Dominik Säume * @author Dominik Säume
* @version 1.0 * @version 1.0
* @implSpec The Implementations should be added to the {@link Fixtures#main}. * @implSpec The implementations should be added to the {@link Fixtures#main}.
*/ */
public interface Fixture<T> { public interface Fixture<T> {
/** /**
* Drop all Dependent Tables. * Drop all dependent tables.
* *
* @param connection A Database {@link Connection}, which should be received from * @param connection A database {@link Connection}, which should be received from
* the {@link ConnectionBuilder#getConnection} * the {@link ConnectionBuilder#getConnection}
* @implSpec Use {@code IF EXISTS}, to ensure that it doesn't throw an {@link Exception}. * @implSpec Use {@code IF EXISTS}, to ensure that it doesn't throw an {@link Exception}.
*/ */
void dropTable(Connection connection) throws SQLException; void dropTable(Connection connection) throws SQLException;
/** /**
* Set up the Empty Tables with the Schema. * Set up the empty tables with the schema.
* *
* @param connection A Database {@link Connection}, which should be received from * @param connection A database {@link Connection}, which should be received from
* the {@link ConnectionBuilder#getConnection} * the {@link ConnectionBuilder#getConnection}
*/ */
void setupTable(Connection connection) throws SQLException; void setupTable(Connection connection) throws SQLException;
/** /**
* Loads all Model specific Data to the Database. * Loads all model specific data to the database.
* *
* @return A Map of Models with a {@link String} key, to be used by other {@link Fixture} * @return A map of models with a {@link String} key, to be used by other {@link Fixture}
* @implSpec The {@link de.hitec.nhplus.datastorage.Dao Dao} should be received * @implSpec The {@link de.hitec.nhplus.datastorage.Dao Dao} should be received
* from {@link de.hitec.nhplus.datastorage.DaoFactory DaoFactory}. * from {@link de.hitec.nhplus.datastorage.DaoFactory DaoFactory}.
*/ */

View file

@ -7,7 +7,7 @@ import java.sql.Connection;
import java.util.Map; import java.util.Map;
/** /**
* A Class, Implementing an Entrypoint({@link #main}), for loading a Specific set of Data. * A class, implementing an entrypoint({@link #main}), for loading a specific set of data.
* *
* @author Dominik Säume * @author Dominik Säume
* @version 1.0 * @version 1.0
@ -15,7 +15,7 @@ import java.util.Map;
public class Fixtures { public class Fixtures {
/** /**
* An Entrypoint, for loading a Specific set of Data. * An entrypoint, for loading a specific set of data.
* *
* @param args unused. * @param args unused.
*/ */

View file

@ -5,6 +5,7 @@ import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.medication.Ingredient; import de.hitec.nhplus.medication.Ingredient;
import de.hitec.nhplus.medication.Medication; import de.hitec.nhplus.medication.Medication;
import de.hitec.nhplus.medication.database.MedicationDao; import de.hitec.nhplus.medication.database.MedicationDao;
import de.hitec.nhplus.treatment.Treatment;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -12,7 +13,11 @@ import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
/**
* {@link Fixture} for {@link Medication}.
*
* @author Dominik Säume
*/
public class MedicationFixture implements Fixture<Medication> { public class MedicationFixture implements Fixture<Medication> {
private static final String SCHEMA = "/de/hitec/nhplus/medication/database/Medication.sql"; private static final String SCHEMA = "/de/hitec/nhplus/medication/database/Medication.sql";
private static final String INGREDIENT_SCHEMA = "/de/hitec/nhplus/medication/database/Medication_Ingredient.sql"; private static final String INGREDIENT_SCHEMA = "/de/hitec/nhplus/medication/database/Medication_Ingredient.sql";

View file

@ -4,6 +4,7 @@ import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory; import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.nurse.Nurse; import de.hitec.nhplus.nurse.Nurse;
import de.hitec.nhplus.nurse.database.NurseDao; import de.hitec.nhplus.nurse.database.NurseDao;
import de.hitec.nhplus.treatment.Treatment;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -11,6 +12,11 @@ import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
/**
* {@link Fixture} for {@link Nurse}.
*
* @author Dominik Säume
*/
public class NurseFixture implements Fixture<Nurse> { public class NurseFixture implements Fixture<Nurse> {
@Override @Override
public void dropTable(Connection connection) throws SQLException { public void dropTable(Connection connection) throws SQLException {

View file

@ -4,6 +4,7 @@ import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.DaoFactory; import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.patient.Patient; import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.patient.database.PatientDao; import de.hitec.nhplus.patient.database.PatientDao;
import de.hitec.nhplus.treatment.Treatment;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -13,6 +14,11 @@ import java.util.*;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate; import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate;
/**
* {@link Fixture} for {@link Patient}.
*
* @author Dominik Säume
*/
public class PatientFixture implements Fixture<Patient> { public class PatientFixture implements Fixture<Patient> {
@Override @Override
public void dropTable(Connection connection) throws SQLException { public void dropTable(Connection connection) throws SQLException {

View file

@ -15,6 +15,12 @@ import java.util.*;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate; import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalDate;
import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalTime; import static de.hitec.nhplus.utils.DateConverter.convertStringToLocalTime;
/**
* {@link Fixture} for {@link Treatment}.
*
* @author Dominik Säume
*/
public class TreatmentFixture implements Fixture<Treatment> { public class TreatmentFixture implements Fixture<Treatment> {
private final Map<String, Patient> patientsByName; private final Map<String, Patient> patientsByName;

View file

@ -11,6 +11,12 @@ import javafx.scene.layout.BorderPane;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
/**
* Controller for the main window of the application, which holds all tabs.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class MainWindowController { public class MainWindowController {
@FXML @FXML
private TabPane mainTabPane; private TabPane mainTabPane;
@ -42,6 +48,9 @@ public class MainWindowController {
medicationTab.setOnSelectionChanged(event -> loadMedicationPage()); medicationTab.setOnSelectionChanged(event -> loadMedicationPage());
} }
/**
* Loads the patient page into its tab.
*/
private void loadPatientPage() { private void loadPatientPage() {
try { try {
BorderPane patientsPane = FXMLLoader.load( BorderPane patientsPane = FXMLLoader.load(
@ -57,6 +66,9 @@ public class MainWindowController {
} }
} }
/**
* Loads the treatment page into its tab.
*/
private void loadTreatmentsPage() { private void loadTreatmentsPage() {
try { try {
BorderPane treatmentsPane = FXMLLoader.load( BorderPane treatmentsPane = FXMLLoader.load(
@ -72,6 +84,9 @@ public class MainWindowController {
} }
} }
/**
* Loads the nurse page into its tab.
*/
private void loadNursePage() { private void loadNursePage() {
try { try {
BorderPane nursePane = FXMLLoader.load( BorderPane nursePane = FXMLLoader.load(
@ -87,6 +102,9 @@ public class MainWindowController {
} }
} }
/**
* Loads the medication page into its tab.
*/
private void loadMedicationPage() { private void loadMedicationPage() {
try { try {
BorderPane medicationPane = FXMLLoader.load( BorderPane medicationPane = FXMLLoader.load(

View file

@ -2,6 +2,12 @@ package de.hitec.nhplus.main;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
/**
* A simple base model for a {@link Person} that can be extended.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public abstract class Person { public abstract class Person {
private final SimpleStringProperty firstName; private final SimpleStringProperty firstName;
private final SimpleStringProperty surName; private final SimpleStringProperty surName;

View file

@ -13,6 +13,11 @@ import javafx.scene.control.cell.PropertyValueFactory;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* The controller for viewing all {@link Medication}s.
*
* @author Dominik Säume
*/
public class AllMedicationController { public class AllMedicationController {
@FXML @FXML
private TableView<Medication> tableView; private TableView<Medication> tableView;
@ -34,6 +39,10 @@ public class AllMedicationController {
private final ObservableList<Medication> medications = FXCollections.observableArrayList(); private final ObservableList<Medication> medications = FXCollections.observableArrayList();
private MedicationDao dao; private MedicationDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() { public void initialize() {
readAllAndShowInTableView(); readAllAndShowInTableView();
@ -41,16 +50,14 @@ public class AllMedicationController {
this.columnName.setCellValueFactory(new PropertyValueFactory<>("name")); this.columnName.setCellValueFactory(new PropertyValueFactory<>("name"));
this.columnManufacturer.setCellValueFactory(new PropertyValueFactory<>("manufacturer")); this.columnManufacturer.setCellValueFactory(new PropertyValueFactory<>("manufacturer"));
this.columnIngredient.setCellValueFactory( this.columnIngredient.setCellValueFactory(
cellData -> { cellData -> new SimpleStringProperty(
return new SimpleStringProperty(
cellData cellData
.getValue() .getValue()
.getIngredients() .getIngredients()
.stream() .stream()
.map(ingredient -> ingredient.getName()) .map(ingredient -> ingredient.getName())
.collect(Collectors.joining("\n")) .collect(Collectors.joining("\n"))
); ));
});
this.columnPossibleSideEffects.setCellValueFactory(new PropertyValueFactory<>("possibleSideEffects")); this.columnPossibleSideEffects.setCellValueFactory(new PropertyValueFactory<>("possibleSideEffects"));
this.columnAdministrationMethod.setCellValueFactory(new PropertyValueFactory<>("administrationMethod")); this.columnAdministrationMethod.setCellValueFactory(new PropertyValueFactory<>("administrationMethod"));
this.columnCurrentStock.setCellValueFactory(new PropertyValueFactory<>("currentStock")); this.columnCurrentStock.setCellValueFactory(new PropertyValueFactory<>("currentStock"));
@ -58,6 +65,9 @@ public class AllMedicationController {
this.tableView.setItems(this.medications); this.tableView.setItems(this.medications);
} }
/**
* Internal method to read all data and set it to the table view.
*/
public void readAllAndShowInTableView() { public void readAllAndShowInTableView() {
this.dao = DaoFactory.getInstance().createMedicationDAO(); this.dao = DaoFactory.getInstance().createMedicationDAO();
try { try {

View file

@ -2,6 +2,13 @@ package de.hitec.nhplus.medication;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
/**
* The simple model for an {@link Ingredient}.
*
* @author Dominik Säume
* @implSpec This isn't a conventional model, because it isn't directly stored in the database,
* but it can be changed to do that, in the case that its complexity rises in the future.
*/
public class Ingredient { public class Ingredient {
private final SimpleStringProperty name; private final SimpleStringProperty name;

View file

@ -10,6 +10,11 @@ import java.util.List;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* The model for a {@link Medication}.
*
* @author Dominik Säume
*/
public class Medication { public class Medication {
private SimpleIntegerProperty id; private SimpleIntegerProperty id;
private final SimpleStringProperty name; private final SimpleStringProperty name;
@ -19,6 +24,13 @@ public class Medication {
private final SimpleStringProperty administrationMethod; private final SimpleStringProperty administrationMethod;
private final SimpleIntegerProperty currentStock; private final SimpleIntegerProperty currentStock;
/**
* This constructor allows instantiating a {@link Medication} object,
* before it is stored in the database, by omitting the {@link Medication#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.medication.database.MedicationDao#create MedicationDao.create}.
*/
public Medication( public Medication(
String name, String name,
String manufacturer, String manufacturer,
@ -35,6 +47,9 @@ public class Medication {
this.currentStock = new SimpleIntegerProperty(currentStock); this.currentStock = new SimpleIntegerProperty(currentStock);
} }
/**
* This constructor allows instantiating a {@link Medication} object with all existing fields.
*/
public Medication( public Medication(
int id, int id,
String name, String name,

View file

@ -13,6 +13,12 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* The {@link MedicationDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao} for the {@link Medication} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class MedicationDao implements Dao<Medication> { public class MedicationDao implements Dao<Medication> {
protected final Connection connection; protected final Connection connection;
@ -153,6 +159,13 @@ public class MedicationDao implements Dao<Medication> {
preparedStatement.executeUpdate(); preparedStatement.executeUpdate();
} }
/**
* Constructs a {@link Medication} object from the {@link ResultSet} obtained after executing a database query.
* This method is used internally to map the {@link ResultSet} data to a {@link Medication} object.
*
* @param result The {@link ResultSet} containing the data retrieved from the database.
* @return A {@link Medication} object constructed from the {@link ResultSet} data.
*/
private Medication getInstanceFromResultSet(ResultSet result) throws SQLException { private Medication getInstanceFromResultSet(ResultSet result) throws SQLException {
Medication medication = new Medication( Medication medication = new Medication(
result.getInt(1), result.getInt(1),

View file

@ -17,6 +17,12 @@ import javafx.scene.control.cell.TextFieldTableCell;
import java.sql.SQLException; import java.sql.SQLException;
/**
* The controller for viewing all {@link Nurse}s.
*
* @author Dominik Säume
* @author Ole Kück
*/
public class AllNurseController { public class AllNurseController {
@FXML @FXML
public TextField textFieldSurName; public TextField textFieldSurName;
@ -40,6 +46,10 @@ public class AllNurseController {
private final ObservableList<Nurse> nurses = FXCollections.observableArrayList(); private final ObservableList<Nurse> nurses = FXCollections.observableArrayList();
private NurseDao dao; private NurseDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() { public void initialize() {
this.readAllAndShowInTableView(); this.readAllAndShowInTableView();
@ -72,15 +82,28 @@ public class AllNurseController {
this.textFieldPhoneNumber.textProperty().addListener(inputNewNurseValidationListener); this.textFieldPhoneNumber.textProperty().addListener(inputNewNurseValidationListener);
} }
/**
* Internal method to read all data and set it to the table view.
*/
private void readAllAndShowInTableView(){ private void readAllAndShowInTableView(){
this.nurses.clear(); this.nurses.clear();
this.dao = DaoFactory.getInstance().createNurseDAO(); this.dao = DaoFactory.getInstance().createNurseDAO();
try { try {
this.nurses.addAll(this.dao.readAll()); this.nurses.setAll(this.dao.readAll());
}catch (SQLException exception){ }catch (SQLException exception){
exception.printStackTrace(); exception.printStackTrace();
} }
} }
/**
* Internal method that clears the text fields used for creating a new {@link Nurse}.
*/
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldPhoneNumber.clear();
}
@FXML @FXML
public void handleAdd(){ public void handleAdd(){
String surname=this.textFieldSurName.getText(); String surname=this.textFieldSurName.getText();
@ -96,10 +119,5 @@ public class AllNurseController {
clearTextfields(); clearTextfields();
} }
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldPhoneNumber.clear();
}
} }

View file

@ -6,10 +6,22 @@ import javafx.beans.property.SimpleStringProperty;
import java.util.StringJoiner; import java.util.StringJoiner;
/**
* The model for a {@link Nurse}.
*
* @author Dominik Säume
*/
public class Nurse extends Person { public class Nurse extends Person {
private SimpleIntegerProperty id; private SimpleIntegerProperty id;
private final SimpleStringProperty phoneNumber; private final SimpleStringProperty phoneNumber;
/**
* This constructor allows instantiating a {@link Nurse} object,
* before it is stored in the database, by omitting the {@link Nurse#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.nurse.database.NurseDao#create NurseDao.create}.
*/
public Nurse( public Nurse(
String firstName, String firstName,
String surName, String surName,
@ -19,6 +31,9 @@ public class Nurse extends Person {
this.phoneNumber = new SimpleStringProperty(phoneNumber); this.phoneNumber = new SimpleStringProperty(phoneNumber);
} }
/**
* This constructor allows instantiating a {@link Nurse} object with all existing fields.
*/
public Nurse( public Nurse(
int id, int id,
String firstName, String firstName,

View file

@ -10,6 +10,11 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* The {@link NurseDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao} for the {@link Nurse} model.
*
* @author Dominik Säume
*/
public class NurseDao extends DaoImp<Nurse> { public class NurseDao extends DaoImp<Nurse> {
public NurseDao(Connection connection) { public NurseDao(Connection connection) {
super(connection); super(connection);

View file

@ -19,6 +19,13 @@ import java.time.LocalDate;
import static de.hitec.nhplus.utils.Validator.*; import static de.hitec.nhplus.utils.Validator.*;
/**
* The controller for viewing all {@link Patient}s.
*
* @author Bernd Heideman
* @author Dominik Säume
* @author Armin Ribic
*/
public class AllPatientController { public class AllPatientController {
@FXML @FXML
@ -53,6 +60,10 @@ public class AllPatientController {
private final ObservableList<Patient> patients = FXCollections.observableArrayList(); private final ObservableList<Patient> patients = FXCollections.observableArrayList();
private PatientDao dao; private PatientDao dao;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() { public void initialize() {
this.readAllAndShowInTableView(); this.readAllAndShowInTableView();
@ -104,6 +115,41 @@ public class AllPatientController {
this.textFieldRoomNumber.textProperty().addListener(inputNewPatientValidationListener); this.textFieldRoomNumber.textProperty().addListener(inputNewPatientValidationListener);
} }
/**
* Internal method to read all data and set it to the table view.
*/
private void readAllAndShowInTableView() {
this.patients.clear();
this.dao = DaoFactory.getInstance().createPatientDAO();
try {
this.patients.setAll(this.dao.readAll());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Internal method that stores the changes in the database.
*/
private void doUpdate(TableColumn.CellEditEvent<Patient, String> event) {
try {
this.dao.update(event.getRowValue());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Internal method that clears the text fields used for creating a new {@link Patient}.
*/
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldDateOfBirth.clear();
this.textFieldCareLevel.clear();
this.textFieldRoomNumber.clear();
}
@FXML @FXML
public void handleOnEditFirstname(TableColumn.CellEditEvent<Patient, String> event) { public void handleOnEditFirstname(TableColumn.CellEditEvent<Patient, String> event) {
String newFirstName = event.getNewValue(); String newFirstName = event.getNewValue();
@ -164,25 +210,6 @@ public class AllPatientController {
this.doUpdate(event); this.doUpdate(event);
} }
private void doUpdate(TableColumn.CellEditEvent<Patient, String> event) {
try {
this.dao.update(event.getRowValue());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
private void readAllAndShowInTableView() {
this.patients.clear();
this.dao = DaoFactory.getInstance().createPatientDAO();
try {
this.patients.addAll(this.dao.readAll());
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@FXML @FXML
public void handleDelete() { public void handleDelete() {
Patient selectedItem = this.tableView.getSelectionModel().getSelectedItem(); Patient selectedItem = this.tableView.getSelectionModel().getSelectedItem();
@ -212,12 +239,4 @@ public class AllPatientController {
readAllAndShowInTableView(); readAllAndShowInTableView();
clearTextfields(); clearTextfields();
} }
private void clearTextfields() {
this.textFieldFirstName.clear();
this.textFieldSurName.clear();
this.textFieldDateOfBirth.clear();
this.textFieldCareLevel.clear();
this.textFieldRoomNumber.clear();
}
} }

View file

@ -11,6 +11,13 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringJoiner; import java.util.StringJoiner;
/**
* The model for a {@link Patient}.
*
* @author Bernd Heideman
* @author Dominik Säume
* @author Armin Ribic
*/
public class Patient extends Person { public class Patient extends Person {
private SimpleIntegerProperty id; private SimpleIntegerProperty id;
private final SimpleStringProperty dateOfBirth; private final SimpleStringProperty dateOfBirth;
@ -18,6 +25,13 @@ public class Patient extends Person {
private final SimpleStringProperty roomNumber; private final SimpleStringProperty roomNumber;
private final List<Treatment> allTreatments = new ArrayList<>(); private final List<Treatment> allTreatments = new ArrayList<>();
/**
* This constructor allows instantiating a {@link Patient} object,
* before it is stored in the database, by omitting the {@link Patient#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.patient.database.PatientDao#create PatientDao.create}.
*/
public Patient( public Patient(
String firstName, String firstName,
String surName, String surName,
@ -31,6 +45,9 @@ public class Patient extends Person {
this.roomNumber = new SimpleStringProperty(roomNumber); this.roomNumber = new SimpleStringProperty(roomNumber);
} }
/**
* This constructor allows instantiating a {@link Patient} object with all existing fields.
*/
public Patient( public Patient(
int id, int id,
String firstName, String firstName,

View file

@ -11,6 +11,12 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* The {@link PatientDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao} for the {@link Patient} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class PatientDao extends DaoImp<Patient> { public class PatientDao extends DaoImp<Patient> {
public PatientDao(Connection connection) { public PatientDao(Connection connection) {

View file

@ -20,6 +20,12 @@ import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
/**
* The controller for viewing all {@link Treatment}s.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class AllTreatmentController { public class AllTreatmentController {
@FXML @FXML
@ -54,6 +60,10 @@ public class AllTreatmentController {
private final ObservableList<String> patientSelection = FXCollections.observableArrayList(); private final ObservableList<String> patientSelection = FXCollections.observableArrayList();
private ArrayList<Patient> patientList; private ArrayList<Patient> patientList;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize() { public void initialize() {
readAllAndShowInTableView(); readAllAndShowInTableView();
comboBoxPatientSelection.setItems(patientSelection); comboBoxPatientSelection.setItems(patientSelection);
@ -83,6 +93,9 @@ public class AllTreatmentController {
this.createComboBoxData(); this.createComboBoxData();
} }
/**
* Internal method to read all data and set it to the table view.
*/
public void readAllAndShowInTableView() { public void readAllAndShowInTableView() {
comboBoxPatientSelection.getSelectionModel().select(0); comboBoxPatientSelection.getSelectionModel().select(0);
this.dao = DaoFactory.getInstance().createTreatmentDao(); this.dao = DaoFactory.getInstance().createTreatmentDao();
@ -93,6 +106,9 @@ public class AllTreatmentController {
} }
} }
/**
* Internal method to create the data set for the combobox that is used for creating a new {@link Treatment}.
*/
private void createComboBoxData() { private void createComboBoxData() {
PatientDao dao = DaoFactory.getInstance().createPatientDAO(); PatientDao dao = DaoFactory.getInstance().createPatientDAO();
try { try {
@ -106,6 +122,78 @@ public class AllTreatmentController {
} }
} }
/**
* Internal method to get the {@link Patient} object by its surname.
*
* @see AllTreatmentController#handleComboBox
* @see AllTreatmentController#handleNewTreatment
*/
private Patient searchInList(String surname) {
for (Patient patient : this.patientList) {
if (patient.getSurName().equals(surname)) {
return patient;
}
}
return null;
}
/**
* Internal method to create a {@link TreatmentModalController TreatmentModal}.
*
* @param treatment The {@link Treatment} which should be edited. Set null to create a new one.
* @param title The Title of the created modal.
* @param patient The {@link Patient} whose {@link Treatment} this is.
*/
public void treatmentWindow(Treatment treatment, String title, Patient patient) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
controller.initialize(
this,
stage,
treatment,
patient
);
stage.setScene(scene);
stage.setTitle(title);
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException exception) {
exception.printStackTrace();
}
}
/**
* Method to create a new {@link Treatment}.
*/
protected void createTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.create(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
/**
* Method to save the changes to a {@link Treatment}.
*/
protected void updateTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.update(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@FXML @FXML
public void handleComboBox() { public void handleComboBox() {
@ -131,14 +219,6 @@ public class AllTreatmentController {
} }
} }
private Patient searchInList(String surname) {
for (Patient patient : this.patientList) {
if (patient.getSurName().equals(surname)) {
return patient;
}
}
return null;
}
@FXML @FXML
public void handleDelete() { public void handleDelete() {
@ -157,7 +237,7 @@ public class AllTreatmentController {
try { try {
String selectedPatient = this.comboBoxPatientSelection.getSelectionModel().getSelectedItem(); String selectedPatient = this.comboBoxPatientSelection.getSelectionModel().getSelectedItem();
Patient patient = searchInList(selectedPatient); Patient patient = searchInList(selectedPatient);
newTreatmentWindow(patient); treatmentWindow(null, "NHPlus - Neue Behandlung", patient);
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
Alert alert = new Alert(Alert.AlertType.INFORMATION); Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Information"); alert.setTitle("Information");
@ -174,81 +254,18 @@ public class AllTreatmentController {
if (event.getClickCount() == 2 && (tableView.getSelectionModel().getSelectedItem() != null)) { if (event.getClickCount() == 2 && (tableView.getSelectionModel().getSelectedItem() != null)) {
int index = this.tableView.getSelectionModel().getSelectedIndex(); int index = this.tableView.getSelectionModel().getSelectedIndex();
Treatment treatment = this.treatments.get(index); Treatment treatment = this.treatments.get(index);
treatmentWindow(treatment); try {
treatmentWindow(
treatment,
"NHPlus - Behandlung",
DaoFactory.getInstance().createPatientDAO().read(
treatment.getPatient().getId()
)
);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} }
}); });
} }
public void newTreatmentWindow(Patient patient) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
controller.initialize(
this,
stage,
null,
patient
);
stage.setScene(scene);
stage.setTitle("NHPlus - Neue Behandlung");
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException exception) {
exception.printStackTrace();
}
}
public void treatmentWindow(Treatment treatment) {
try {
FXMLLoader loader = new FXMLLoader(
Main.class.getResource("/de/hitec/nhplus/treatment/TreatmentModal.fxml")
);
BorderPane pane = loader.load();
Scene scene = new Scene(pane);
Stage stage = new Stage();
TreatmentModalController controller = loader.getController();
PatientDao pDao = DaoFactory.getInstance().createPatientDAO();
controller.initialize(
this,
stage,
treatment,
pDao.read(treatment.getPatient().getId())
);
stage.setScene(scene);
stage.setTitle("NHPlus - Behandlung");
stage.setResizable(true);
stage.setAlwaysOnTop(true);
stage.showAndWait();
} catch (IOException | SQLException exception) {
exception.printStackTrace();
}
}
public void createTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.create(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
public void updateTreatment(Treatment treatment) {
TreatmentDao dao = DaoFactory.getInstance().createTreatmentDao();
try {
dao.update(treatment);
} catch (SQLException exception) {
exception.printStackTrace();
}
}
} }

View file

@ -10,6 +10,12 @@ import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.StringJoiner; import java.util.StringJoiner;
/**
* The model for a {@link Treatment}.
*
* @author Bernd Heideman
* @author Dominik Säume
*/
public class Treatment { public class Treatment {
private SimpleIntegerProperty id; private SimpleIntegerProperty id;
private final SimpleObjectProperty<Patient> patient; private final SimpleObjectProperty<Patient> patient;
@ -19,8 +25,21 @@ public class Treatment {
private final SimpleStringProperty description; private final SimpleStringProperty description;
private final SimpleStringProperty remarks; private final SimpleStringProperty remarks;
public Treatment(Patient patient, LocalDate date, LocalTime begin, /**
LocalTime end, String description, String remarks) { * This constructor allows instantiating a {@link Treatment} object,
* before it is stored in the database, by omitting the {@link Treatment#id ID} value.
*
* @implSpec Instances created with this constructor can be directly passed to
* {@link de.hitec.nhplus.treatment.database.TreatmentDao#create TreatmentDao.create}.
*/
public Treatment(
Patient patient,
LocalDate date,
LocalTime begin,
LocalTime end,
String description,
String remarks
) {
this.patient = new SimpleObjectProperty<>(patient); this.patient = new SimpleObjectProperty<>(patient);
this.date = new SimpleObjectProperty<>(date); this.date = new SimpleObjectProperty<>(date);
this.begin = new SimpleObjectProperty<>(begin); this.begin = new SimpleObjectProperty<>(begin);
@ -29,8 +48,18 @@ public class Treatment {
this.remarks = new SimpleStringProperty(remarks); this.remarks = new SimpleStringProperty(remarks);
} }
public Treatment(int id, Patient patient, LocalDate date, LocalTime begin, /**
LocalTime end, String description, String remarks) { * This constructor allows instantiating a {@link Treatment} object with all existing fields.
*/
public Treatment(
int id,
Patient patient,
LocalDate date,
LocalTime begin,
LocalTime end,
String description,
String remarks
) {
this.id = new SimpleIntegerProperty(id); this.id = new SimpleIntegerProperty(id);
this.patient = new SimpleObjectProperty<>(patient); this.patient = new SimpleObjectProperty<>(patient);
this.date = new SimpleObjectProperty<>(date); this.date = new SimpleObjectProperty<>(date);

View file

@ -13,6 +13,11 @@ import java.time.LocalTime;
import static de.hitec.nhplus.utils.Validator.*; import static de.hitec.nhplus.utils.Validator.*;
/**
* The controller for creating and editing a specific {@link Treatment}.
*
* @author Dominik Säume
*/
public class TreatmentModalController { public class TreatmentModalController {
@FXML @FXML
private Label labelFirstName; private Label labelFirstName;
@ -36,6 +41,10 @@ public class TreatmentModalController {
private Treatment treatment; private Treatment treatment;
private boolean isNewTreatment = false; private boolean isNewTreatment = false;
/**
* Initialization method that is called after the binding of all the fields.
*/
@FXML
public void initialize(AllTreatmentController controller, Stage stage, Treatment treatment, Patient patient) { public void initialize(AllTreatmentController controller, Stage stage, Treatment treatment, Patient patient) {
this.controller = controller; this.controller = controller;
this.stage = stage; this.stage = stage;
@ -96,7 +105,9 @@ public class TreatmentModalController {
}); });
} }
/**
* Internal method to show the data in the view.
*/
private void showData() { private void showData() {
this.labelFirstName.setText(patient.getFirstName()); this.labelFirstName.setText(patient.getFirstName());
this.labelSurName.setText(patient.getSurName()); this.labelSurName.setText(patient.getSurName());
@ -136,8 +147,4 @@ public class TreatmentModalController {
public void handleCancel() { public void handleCancel() {
stage.close(); stage.close();
} }
public Treatment getTreatment() {
return treatment;
}
} }

View file

@ -2,6 +2,7 @@ package de.hitec.nhplus.treatment.database;
import de.hitec.nhplus.datastorage.DaoFactory; import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.DaoImp; import de.hitec.nhplus.datastorage.DaoImp;
import de.hitec.nhplus.patient.Patient;
import de.hitec.nhplus.treatment.Treatment; import de.hitec.nhplus.treatment.Treatment;
import de.hitec.nhplus.utils.DateConverter; import de.hitec.nhplus.utils.DateConverter;
@ -12,6 +13,12 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* The {@link TreatmentDao} is an implementation of the {@link de.hitec.nhplus.datastorage.Dao Dao} for the {@link Treatment} model.
*
* @author Bernd Heidemann
* @author Dominik Säume
*/
public class TreatmentDao extends DaoImp<Treatment> { public class TreatmentDao extends DaoImp<Treatment> {
public TreatmentDao(Connection connection) { public TreatmentDao(Connection connection) {
@ -71,15 +78,18 @@ public class TreatmentDao extends DaoImp<Treatment> {
return list; return list;
} }
private PreparedStatement getReadAllTreatmentsOfOnePatientByPid(int patientId) throws SQLException { /**
* Retrieves a list of {@link Treatment}s associated with a specific {@link Patient#id patient ID} from the database.
*
* @param patientId The {@link Patient#id ID} of the {@link Patient} whose {@link Treatment}s are to be retrieved.
* @return A {@link List} of {@link Treatment} objects associated with the specified {@link Patient} ID.
*/
public List<Treatment> readTreatmentsByPid(int patientId) throws SQLException {
final String SQL = "SELECT * FROM treatment WHERE patientId = ?"; final String SQL = "SELECT * FROM treatment WHERE patientId = ?";
PreparedStatement statement = this.connection.prepareStatement(SQL); PreparedStatement statement = this.connection.prepareStatement(SQL);
statement.setInt(1, patientId); statement.setInt(1, patientId);
return statement;
}
public List<Treatment> readTreatmentsByPid(int patientId) throws SQLException { ResultSet result = statement.executeQuery();
ResultSet result = getReadAllTreatmentsOfOnePatientByPid(patientId).executeQuery();
return getListFromResultSet(result); return getListFromResultSet(result);
} }

View file

@ -4,23 +4,44 @@ import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
/**
* A utility class that holds utility methods for date conversion.
*
* @author Bernd Heideman
*/
public class DateConverter { public class DateConverter {
private static final String DATE_FORMAT = "yyyy-MM-dd"; private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String TIME_FORMAT = "HH:mm"; private static final String TIME_FORMAT = "HH:mm";
/**
* @param date A date {@link String} in the format: yyyy-MM-dd.
* @return The converted date {@link String} as {@link LocalDate}.
*/
public static LocalDate convertStringToLocalDate(String date) { public static LocalDate convertStringToLocalDate(String date) {
return LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT)); return LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
} }
/**
* @param time A time {@link String} in the format: HH:mm.
* @return The converted time {@link String} as {@link LocalTime}.
*/
public static LocalTime convertStringToLocalTime(String time) { public static LocalTime convertStringToLocalTime(String time) {
return LocalTime.parse(time, DateTimeFormatter.ofPattern(TIME_FORMAT)); return LocalTime.parse(time, DateTimeFormatter.ofPattern(TIME_FORMAT));
} }
/**
* @param date A {@link LocalDate} which should be converted to a {@link String}.
* @return The converted {@link LocalDate} in the format: yyy-MM-dd.
*/
public static String convertLocalDateToString(LocalDate date) { public static String convertLocalDateToString(LocalDate date) {
return date.format(DateTimeFormatter.ofPattern(DATE_FORMAT)); return date.format(DateTimeFormatter.ofPattern(DATE_FORMAT));
} }
/**
* @param time A {@link LocalTime} which should be converted to a {@link String}.
* @return The converted {@link LocalTime} in the format: HH:mm.
*/
public static String convertLocalTimeToString(LocalTime time) { public static String convertLocalTimeToString(LocalTime time) {
return time.format(DateTimeFormatter.ofPattern(TIME_FORMAT)); return time.format(DateTimeFormatter.ofPattern(TIME_FORMAT));
} }

View file

@ -5,17 +5,34 @@ import javafx.scene.control.Alert;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
public class Validator /**
{ * A utility class for validating all kinds of data.
public static void showValidationError(String type){ *
* @author Dominik Säume
* @author Ole Kück
*/
public class Validator {
/**
* Shows a modal with a specific validation error.
*
* @param type The type for which a validation error should be shown as {@link String}.
*/
public static void showValidationError(String type) {
Alert alert = new Alert(Alert.AlertType.ERROR); Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error"); alert.setTitle("Error");
alert.setHeaderText(null); alert.setHeaderText(null);
alert.setContentText("Invalid " + type + " !"); alert.setContentText("Invalid " + type + " !");
alert.showAndWait(); alert.showAndWait();
} }
/**
* Validate that a {@link String} is a valid date.
*
* @param text The date {@link String} to validate.
*/
public static boolean isValidDate(String text) { public static boolean isValidDate(String text) {
if(text.isBlank()){ if (text.isBlank()) {
return false; return false;
} }
try { try {
@ -25,8 +42,14 @@ public class Validator
} }
return true; return true;
} }
/**
* Validate that a {@link LocalDate} is a valid date for storage in the database.
*
* @param date The {@link LocalDate} to validate.
*/
public static boolean isValidDate(LocalDate date) { public static boolean isValidDate(LocalDate date) {
if(date == null){ if (date == null) {
return false; return false;
} }
try { try {
@ -36,21 +59,34 @@ public class Validator
} }
return true; return true;
} }
public static boolean isValidTime(String text){
if(text.isBlank()){ /**
* Validate that a {@link String} is a valid time.
*
* @param text The time {@link String} to validate.
*/
public static boolean isValidTime(String text) {
if (text.isBlank()) {
return false; return false;
} }
try { try {
DateConverter.convertStringToLocalTime(text); DateConverter.convertStringToLocalTime(text);
}catch (Exception exception){ } catch (Exception exception) {
return false; return false;
} }
return true; return true;
} }
public static boolean isValidTimeRange(String start, String end){
if( /**
* Validate that two time {@link String}s are a valid time range.
*
* @param start The starting time {@link String}.
* @param end The ending time {@link String}.
*/
public static boolean isValidTimeRange(String start, String end) {
if (
!isValidTime(start) || !isValidTime(end) !isValidTime(start) || !isValidTime(end)
){ ) {
return false; return false;
} }
LocalTime startTime = DateConverter.convertStringToLocalTime(start); LocalTime startTime = DateConverter.convertStringToLocalTime(start);
@ -59,24 +95,57 @@ public class Validator
} }
/**
* Validate that a {@link String} is a valid description.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidDescription(String text) { public static boolean isValidDescription(String text) {
return !text.isBlank(); return !text.isBlank();
} }
public static boolean isValidFirstName(String text){
return !text.isBlank(); /**
} * Validate that a {@link String} is a valid first name.
public static boolean isValidSurName(String text){ *
return !text.isBlank(); * @param text The {@link String} to validate.
} */
public static boolean isValidPhoneNumber(String text){ public static boolean isValidFirstName(String text) {
return !text.isBlank();
}
public static boolean isValidCareLevel(String text){
return !text.isBlank();
}
public static boolean isValidRoomNumber(String text){
return !text.isBlank(); return !text.isBlank();
} }
/**
* Validate that a {@link String} is a valid surname.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidSurName(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid phone number.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidPhoneNumber(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid care level.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidCareLevel(String text) {
return !text.isBlank();
}
/**
* Validate that a {@link String} is a valid room number.
*
* @param text The {@link String} to validate.
*/
public static boolean isValidRoomNumber(String text) {
return !text.isBlank();
}
} }