From 44b5ecf261300d15aa854b0d0bc813bd1a0c64ef Mon Sep 17 00:00:00 2001 From: Eirik Steira <eirsteir@stud.ntnu.no> Date: Fri, 13 Mar 2020 09:24:53 +0100 Subject: [PATCH] Add docstrings to Dao interface and UserDao, add relevant null checks Add *.properties to .gitignore --- .gitignore | 1 + ImageApplication.iml | 32 ------ src/main/java/NTNU/IDATT1002/App.java | 2 +- src/main/java/NTNU/IDATT1002/LoggedIn.java | 4 - .../NTNU/IDATT1002/SecondaryController.java | 12 --- .../controllers/LoggedInController.java | 4 + .../LoginController.java} | 7 +- .../controllers/SignUpController.java | 14 +++ .../java/NTNU/IDATT1002/models/Login.java | 41 ++++++++ src/main/java/NTNU/IDATT1002/models/User.java | 90 +++++++++++++++++ .../NTNU/IDATT1002/repository/Repository.java | 72 ++++++++++++++ .../IDATT1002/repository/UserRepository.java | 99 +++++++++++++++++++ .../resources/NTNU/IDATT1002/logged-in.fxml | 2 +- src/main/resources/NTNU/IDATT1002/login.fxml | 2 +- src/main/resources/NTNU/IDATT1002/signup.fxml | 2 +- 15 files changed, 329 insertions(+), 55 deletions(-) delete mode 100644 ImageApplication.iml delete mode 100644 src/main/java/NTNU/IDATT1002/LoggedIn.java delete mode 100644 src/main/java/NTNU/IDATT1002/SecondaryController.java create mode 100644 src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java rename src/main/java/NTNU/IDATT1002/{PrimaryController.java => controllers/LoginController.java} (63%) create mode 100644 src/main/java/NTNU/IDATT1002/controllers/SignUpController.java create mode 100644 src/main/java/NTNU/IDATT1002/models/Login.java create mode 100644 src/main/java/NTNU/IDATT1002/models/User.java create mode 100644 src/main/java/NTNU/IDATT1002/repository/Repository.java create mode 100644 src/main/java/NTNU/IDATT1002/repository/UserRepository.java diff --git a/.gitignore b/.gitignore index e48e2dfd..4ca28355 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ target/ .idea/ *.properties +*.iml # User-specific stuff .idea/**/workspace.xml diff --git a/ImageApplication.iml b/ImageApplication.iml deleted file mode 100644 index e89efabf..00000000 --- a/ImageApplication.iml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="ExternalSystem" externalSystem="Maven" /> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11"> - <output url="file://$MODULE_DIR$/target/classes" /> - <output-test url="file://$MODULE_DIR$/target/test-classes" /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> - <excludeFolder url="file://$MODULE_DIR$/target" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-simple:1.7.30" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:win:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:win:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:win:13" level="project" /> - <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" /> - <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:win:13" level="project" /> - <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" /> - </component> -</module> \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/App.java b/src/main/java/NTNU/IDATT1002/App.java index 0e62956a..5072c677 100644 --- a/src/main/java/NTNU/IDATT1002/App.java +++ b/src/main/java/NTNU/IDATT1002/App.java @@ -20,7 +20,7 @@ public class App extends Application { stage.show(); } - static void setRoot(String fxml) throws IOException { + public static void setRoot(String fxml) throws IOException { scene.setRoot(loadFXML(fxml)); } diff --git a/src/main/java/NTNU/IDATT1002/LoggedIn.java b/src/main/java/NTNU/IDATT1002/LoggedIn.java deleted file mode 100644 index a5dfa507..00000000 --- a/src/main/java/NTNU/IDATT1002/LoggedIn.java +++ /dev/null @@ -1,4 +0,0 @@ -package NTNU.IDATT1002; - -public class LoggedIn { -} diff --git a/src/main/java/NTNU/IDATT1002/SecondaryController.java b/src/main/java/NTNU/IDATT1002/SecondaryController.java deleted file mode 100644 index b8a2a3eb..00000000 --- a/src/main/java/NTNU/IDATT1002/SecondaryController.java +++ /dev/null @@ -1,12 +0,0 @@ -package NTNU.IDATT1002; - -import java.io.IOException; -import javafx.fxml.FXML; - -public class SecondaryController { - - @FXML - private void switchToPrimary() throws IOException { - App.setRoot("login"); - } -} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java b/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java new file mode 100644 index 00000000..847a6cf7 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java @@ -0,0 +1,4 @@ +package NTNU.IDATT1002.controllers; + +public class LoggedInController { +} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/PrimaryController.java b/src/main/java/NTNU/IDATT1002/controllers/LoginController.java similarity index 63% rename from src/main/java/NTNU/IDATT1002/PrimaryController.java rename to src/main/java/NTNU/IDATT1002/controllers/LoginController.java index 07804a59..1fd4db9e 100644 --- a/src/main/java/NTNU/IDATT1002/PrimaryController.java +++ b/src/main/java/NTNU/IDATT1002/controllers/LoginController.java @@ -1,14 +1,15 @@ -package NTNU.IDATT1002; +package NTNU.IDATT1002.controllers; import java.io.IOException; +import NTNU.IDATT1002.App; import javafx.event.ActionEvent; import javafx.fxml.FXML; -public class PrimaryController { +public class LoginController { @FXML - private void switchToSecondary() throws IOException { + public void switchToSecondary() throws IOException { App.setRoot("signup"); } diff --git a/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java b/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java new file mode 100644 index 00000000..29be8fee --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java @@ -0,0 +1,14 @@ +package NTNU.IDATT1002.controllers; + +import java.io.IOException; + +import NTNU.IDATT1002.App; +import javafx.fxml.FXML; + +public class SignUpController { + + @FXML + public void switchToPrimary() throws IOException { + App.setRoot("login"); + } +} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/models/Login.java b/src/main/java/NTNU/IDATT1002/models/Login.java new file mode 100644 index 00000000..02f9a9aa --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/models/Login.java @@ -0,0 +1,41 @@ +package NTNU.IDATT1002.models; + +public class Login { + + private Integer id; + private User user; + private String password; + private String passwordHash; + private String passwordSalt; + + public Login() { + } + + public Login(int id, User user, String password, String passwordHash, String passwordSalt) { + this.id = id; + this.user = user; + this.password = password; + this.passwordHash = passwordHash; + this.passwordSalt = passwordSalt; + } + + public int getId() { + return id; + } + + public User getUser() { + return user; + } + + public String getPassword() { + return password; + } + + public String getPasswordHash() { + return passwordHash; + } + + public String getPasswordSalt() { + return passwordSalt; + } +} diff --git a/src/main/java/NTNU/IDATT1002/models/User.java b/src/main/java/NTNU/IDATT1002/models/User.java new file mode 100644 index 00000000..eb2eea20 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/models/User.java @@ -0,0 +1,90 @@ +package NTNU.IDATT1002.models; + +import java.util.Date; + +public class User { + + private Integer id; + private String email; + private String username; + private String firstName; + private String lastName; + private String callingCode; + private String phoneNumber; + private Date birthDate; + private boolean isAdmin; + private boolean isActive; + + public User(int id, String email, String username, String firstName, String lastName, String callingCode, String phoneNumber, Date birthDate, boolean isAdmin) { + this.id = id; + this.email = email; + this.username = username; + this.firstName = firstName; + this.lastName = lastName; + this.callingCode = callingCode; + this.phoneNumber = phoneNumber; + this.birthDate = birthDate; + this.isAdmin = isAdmin; + this.isActive = true; + } + + public User(User user) { + this(user.getId(), + user.getEmail(), + user.getUsername(), + user.getFirstName(), + user.getLastName(), + user.getCallingCode(), + user.getPhoneNumber(), + user.getBirthDate(), + user.isAdmin()); + } + + public Integer getId() { + return id; + } + + public String getEmail() { + return email; + } + + public String getUsername() { + return username; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getCallingCode() { + return callingCode; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public Date getBirthDate() { + return birthDate; + } + + public boolean isAdmin() { + return isAdmin; + } + + public boolean isActive() { + return isActive; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return id.equals(user.id); + } +} diff --git a/src/main/java/NTNU/IDATT1002/repository/Repository.java b/src/main/java/NTNU/IDATT1002/repository/Repository.java new file mode 100644 index 00000000..326d682e --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/repository/Repository.java @@ -0,0 +1,72 @@ +package NTNU.IDATT1002.repository; + +import java.util.Optional; + + +/** + * Entity Repository Interface Dummy. Supports regular Create, Read, Update and Delete operations. + * @param <T> type of entity + * @param <ID> type of entity id + */ +public interface Repository<T, ID> { + + /** + * Saves a given entity and returns the saved instance. + * + * @param entity not null + * @return the saved entity + */ + T save(T entity) throws IllegalArgumentException; + + /** + * Updates the given entity. This will completely override the given instance. + * + * @param entity not null + * @return the updated entity + */ + Optional<T> update(T entity); + + /** + * Retrieves all instances of the type. + * + * @return all entities + */ + Iterable<T> findAll(); + + /** + * Retrieves an entity with the given id. + * + * @param id not null + * @return the entity with the given id if found, else Optional.empty() + */ + Optional<T> findById(ID id); + + /** + * Deletes an entity with the given id. + * + * @param id not null + */ + void deleteById(ID id); + + /** + * Deletes the given entity. + * + * @param entity not null + */ + void delete(T entity); + + /** + * Return the number of entities. + * + * @return the number of entities. + */ + long count(); + + /** + * Return whether the given entity exists. + * + * @param entity not null + * @return true if the entity exist, else false + */ + boolean exists(T entity); +} diff --git a/src/main/java/NTNU/IDATT1002/repository/UserRepository.java b/src/main/java/NTNU/IDATT1002/repository/UserRepository.java new file mode 100644 index 00000000..e6cb49d8 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/repository/UserRepository.java @@ -0,0 +1,99 @@ +package NTNU.IDATT1002.repository; + +import NTNU.IDATT1002.models.User; + +import java.util.*; + + +/** + * User repository to support interacting with a simulated database. + */ +public class UserRepository implements Repository<User, Integer> { + + /** + * The "database". + */ + private static List<User> users = new ArrayList<>(); + + /** + * Supply repository with initial test data. + */ + static { + users.add(new User(1, "test@mail.com", "test", "Test", "Testesen", "+47", "00000000", new Date(), false)); + users.add(new User(2, "test2@mail.com", "test2", "Test2", "Testesen2", "+47", "00000001", new Date(), false)); + users.add(new User(3, "test3@mail.com", "test3", "Test3", "Testesen3", "+47", "00000002", new Date(), false)); + } + + @Override + public User save(User user) throws IllegalArgumentException { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + User savedUser = new User(user); + users.add(savedUser); + return savedUser; + } + + @Override + public Optional<User> update(User user) { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + Optional<User> foundUser = users.stream() + .filter(user::equals) + .findFirst(); + + if (foundUser.isPresent()) { + delete(foundUser.get()); + User updatedUser = save(user); + return Optional.of(updatedUser); + } + + return Optional.empty(); + } + + @Override + public List<User> findAll() { + return users; + } + + @Override + public Optional<User> findById(Integer id) { + return users.stream() + .filter(user -> user.getId() == id) + .findFirst(); + } + + public User findByUsername(String username) { + return users.stream() + .filter(user -> user.getUsername().equals(username)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public void deleteById(Integer id) { + Optional<User> foundUser = findById(id); + foundUser.ifPresent(this::delete); + } + + @Override + public void delete(User user) { + users.remove(user); + } + + + @Override + public long count() { + return users.size(); + } + + @Override + public boolean exists(User user) { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + return users.stream() + .anyMatch(user::equals); + } +} diff --git a/src/main/resources/NTNU/IDATT1002/logged-in.fxml b/src/main/resources/NTNU/IDATT1002/logged-in.fxml index 0e4f9652..750d3ec4 100644 --- a/src/main/resources/NTNU/IDATT1002/logged-in.fxml +++ b/src/main/resources/NTNU/IDATT1002/logged-in.fxml @@ -4,7 +4,7 @@ <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> -<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.LoggedIn"> +<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.controllers.LoggedInController"> <children> <ImageView fitHeight="150.0" fitWidth="200.0" layoutX="200.0" layoutY="125.0" pickOnBounds="true" preserveRatio="true"> <image> diff --git a/src/main/resources/NTNU/IDATT1002/login.fxml b/src/main/resources/NTNU/IDATT1002/login.fxml index 815e50ff..4bee4cd8 100644 --- a/src/main/resources/NTNU/IDATT1002/login.fxml +++ b/src/main/resources/NTNU/IDATT1002/login.fxml @@ -11,7 +11,7 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Text?> -<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.PrimaryController"> +<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.controllers.LoginController"> <children> <Label text="Login Page" /> <GridPane hgap="10.0" maxWidth="300.0" prefHeight="90.0" prefWidth="200.0" vgap="10.0"> diff --git a/src/main/resources/NTNU/IDATT1002/signup.fxml b/src/main/resources/NTNU/IDATT1002/signup.fxml index 59ddd040..7ec82d8e 100644 --- a/src/main/resources/NTNU/IDATT1002/signup.fxml +++ b/src/main/resources/NTNU/IDATT1002/signup.fxml @@ -11,7 +11,7 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Text?> -<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/" fx:controller="NTNU.IDATT1002.SecondaryController"> +<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/" fx:controller="NTNU.IDATT1002.controllers.SignUpController"> <children> <Label text="Sign Up page" /> <GridPane hgap="10.0" maxWidth="-Infinity" prefHeight="110.0" prefWidth="300.0" vgap="10.0"> -- GitLab