diff --git a/src/main/asciidoc/developer_documentation.adoc b/src/main/asciidoc/developer_documentation.adoc index c02ec33..c54d1cf 100644 --- a/src/main/asciidoc/developer_documentation.adoc +++ b/src/main/asciidoc/developer_documentation.adoc @@ -175,7 +175,7 @@ image:models/design/clientServer.svg[] ==== Design Patterns * Spring MVC -* Template Method in `UserForm` (hook method `validatePasswordGeneric`) +* Template Method in `UserFormWithPassword` (hook method `validatePasswordGeneric`) * Template Method in `InventoryMutateForm` (hook method `modifyProductPrimitive`) ==== Persistence @@ -293,7 +293,11 @@ image:models/design/user.svg[class design diagram - User] |UserManagement |A class that manages the UserRepository. |UserRepository |An extension of 'CrudRepository' to store Users. |User |A class that allows a person to associate system data with themselves. -|UserForm |A Form to cache a user input that was made during registration or updating the profile. +|UserForm |A form to cache a user input that was made during registration or updating the profile. +|AdminForm |A form to cache the admin input that was made during updating the profile of a customer. +|UserFormWithPassword |An extension of UserForm with a password attribute. +|RegistrationForm |A form to cache a user input that was made during registration. +|ProfileForm |A form to cache a user input that was made during updating the profile. |FormValidator |A validator that validates the UserForm. |=== diff --git a/src/main/asciidoc/models/design/user.puml b/src/main/asciidoc/models/design/user.puml index 3e774a2..4d1b307 100644 --- a/src/main/asciidoc/models/design/user.puml +++ b/src/main/asciidoc/models/design/user.puml @@ -119,22 +119,18 @@ package catering.users { } UserFormWithPassword --> Errors UserFormWithPassword --> ValidationUtils - UserFormWithPassword ----+ UserForm UserFormWithPassword --|> UserForm class RegistrationForm extends UserFormWithPassword { + RegistrationForm(username:String, address:String, fullName:String, password:String) + {static} empty() : RegistrationForm } - RegistrationForm --+ UserFormWithPassword class ProfileForm { + ProfileForm(username:String, address:String, fullName:String, password:String) } - ProfileForm --+ UserFormWithPassword ProfileForm --|> UserFormWithPassword class AdminForm { + AdminForm(username:String, address:String, fullName:String) } - AdminForm --+ UserForm AdminForm --|> UserForm class FormValidator { supports(c:Class) : boolean diff --git a/src/main/asciidoc/models/design/user.svg b/src/main/asciidoc/models/design/user.svg index 5c91c92..2a560e8 100644 --- a/src/main/asciidoc/models/design/user.svg +++ b/src/main/asciidoc/models/design/user.svg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1234622e25b6a4c91c47e0b372384e1ddeaf3b9d01455413077c8f172548f14d -size 71119 +oid sha256:fcd02b8bd0bc12135da77df81a7f9ac2637569c6178a6a0f92eaf13a6f89ace8 +size 69213 diff --git a/src/main/java/catering/users/AdminForm.java b/src/main/java/catering/users/AdminForm.java new file mode 100644 index 0000000..24da942 --- /dev/null +++ b/src/main/java/catering/users/AdminForm.java @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// SPDX-FileCopyrightText: 2023-2024 swt23w23 +package catering.users; + +/** + * An extension of {@link UserForm} to validate input during customer profile + * editing. + */ +public class AdminForm extends UserForm { + AdminForm(String username, String address, String fullName) { + super(username, address, fullName); + } +} diff --git a/src/main/java/catering/users/FormValidator.java b/src/main/java/catering/users/FormValidator.java index d26ab29..968de70 100644 --- a/src/main/java/catering/users/FormValidator.java +++ b/src/main/java/catering/users/FormValidator.java @@ -7,8 +7,6 @@ import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; -import catering.users.UserForm.UserFormWithPassword; - @Component public class FormValidator implements Validator { diff --git a/src/main/java/catering/users/ProfileForm.java b/src/main/java/catering/users/ProfileForm.java new file mode 100644 index 0000000..5909ffe --- /dev/null +++ b/src/main/java/catering/users/ProfileForm.java @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// SPDX-FileCopyrightText: 2023-2024 swt23w23 +package catering.users; + +import org.springframework.validation.Errors; + +/** + * An extension of {@link UserFormWithPassword} to validate input during profile + * editing. + * + * The password can be empty. + */ +public class ProfileForm extends UserFormWithPassword { + ProfileForm(String username, String address, String fullName, String password) { + super(username, address, fullName, password); + } + + public void validatePasswordGeneric(Errors e) { + if (e.getFieldValue("password") == null) { + e.rejectValue("password", "password must not be null"); + } + } +} diff --git a/src/main/java/catering/users/RegistrationForm.java b/src/main/java/catering/users/RegistrationForm.java new file mode 100644 index 0000000..22c05b7 --- /dev/null +++ b/src/main/java/catering/users/RegistrationForm.java @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// SPDX-FileCopyrightText: 2023-2024 swt23w23 +package catering.users; + +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; + +/** + * An extension of {@link UserFormWithPassword} to validate input during + * registration. + * + * It requires the password to be not empty. + */ +public class RegistrationForm extends UserFormWithPassword { + RegistrationForm(String username, String address, String fullName, String password) { + super(username, address, fullName, password); + } + + public static RegistrationForm empty() { + return new RegistrationForm("", "", "", ""); + } + + public void validatePasswordGeneric(Errors e) { + ValidationUtils.rejectIfEmptyOrWhitespace(e, "password", "password must not be empty"); + } +} diff --git a/src/main/java/catering/users/UserController.java b/src/main/java/catering/users/UserController.java index 65bd24d..83ef844 100644 --- a/src/main/java/catering/users/UserController.java +++ b/src/main/java/catering/users/UserController.java @@ -2,9 +2,6 @@ // SPDX-FileCopyrightText: 2023-2024 swt23w23 package catering.users; -import static catering.users.UserForm.UserFormWithPassword.RegistrationForm; -import static catering.users.UserForm.UserFormWithPassword.ProfileForm; -import static catering.users.UserForm.AdminForm; import org.springframework.ui.Model; import org.salespointframework.useraccount.Role; import org.salespointframework.useraccount.UserAccount; diff --git a/src/main/java/catering/users/UserForm.java b/src/main/java/catering/users/UserForm.java index f4bc756..71065bf 100644 --- a/src/main/java/catering/users/UserForm.java +++ b/src/main/java/catering/users/UserForm.java @@ -1,13 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2023 swt23w23 +// SPDX-FileCopyrightText: 2023-2024 swt23w23 package catering.users; -import org.springframework.validation.ValidationUtils; - -import java.util.Optional; - -import org.springframework.validation.Errors; - /** * An abstract class to hold form input for {@link User} data. * @@ -34,86 +28,4 @@ public abstract class UserForm { public String getFullName() { return fullName; } - - /** - * An extension of {@link UserForm} with a password attribute. - */ - public abstract static class UserFormWithPassword extends UserForm { - private final String password; - - public UserFormWithPassword(String username, String address, String fullName, String password) { - super(username, address, fullName); - this.password = password; - } - - public String getPassword() { - return password; - } - - /** - * Template Method for validating the password. - * - * @param e {@link Errors} from {@link FormValidator} - */ - public void validatePassword(Errors e) { - validatePasswordGeneric(e); - Optional.ofNullable(e.getFieldValue("password")).map(s -> (String) s).ifPresent(s -> { - if (s.chars().anyMatch(Character::isISOControl)) { - e.rejectValue("password", "password must only contain printable characters"); - } - }); - } - - /** - * Primitive Operation for validating the password depending on the subclass. - * - * @param e {@link Errors} from {@link FormValidator} - */ - public abstract void validatePasswordGeneric(Errors e); - - /** - * An extension of {@link UserFormWithPassword} to validate input during registration. - * - * It requires the password to be not empty. - */ - public static class RegistrationForm extends UserFormWithPassword { - RegistrationForm(String username, String address, String fullName, String password) { - super(username, address, fullName, password); - } - - public static RegistrationForm empty() { - return new UserFormWithPassword.RegistrationForm("", "", "", ""); - } - - public void validatePasswordGeneric(Errors e) { - ValidationUtils.rejectIfEmptyOrWhitespace(e, "password", "password must not be empty"); - } - } - - /** - * An extension of {@link UserFormWithPassword} to validate input during profile editing. - * - * The password can be empty. - */ - public static class ProfileForm extends UserFormWithPassword { - ProfileForm(String username, String address, String fullName, String password) { - super(username, address, fullName, password); - } - - public void validatePasswordGeneric(Errors e) { - if (e.getFieldValue("password") == null) { - e.rejectValue("password", "password must not be null"); - } - } - } - } - - /** - * An extension of {@link UserForm} to validate input during customer profile editing. - */ - public static class AdminForm extends UserForm { - AdminForm(String username, String address, String fullName) { - super(username, address, fullName); - } - } } diff --git a/src/main/java/catering/users/UserFormWithPassword.java b/src/main/java/catering/users/UserFormWithPassword.java new file mode 100644 index 0000000..9f1a76c --- /dev/null +++ b/src/main/java/catering/users/UserFormWithPassword.java @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// SPDX-FileCopyrightText: 2023-2024 swt23w23 +package catering.users; + +import java.util.Optional; + +import org.springframework.validation.Errors; + +/** + * An extension of {@link UserForm} with a password attribute. + */ +public abstract class UserFormWithPassword extends UserForm { + private final String password; + + public UserFormWithPassword(String username, String address, String fullName, String password) { + super(username, address, fullName); + this.password = password; + } + + public String getPassword() { + return password; + } + + /** + * Template Method for validating the password. + * + * @param e {@link Errors} from {@link FormValidator} + */ + public void validatePassword(Errors e) { + validatePasswordGeneric(e); + Optional.ofNullable(e.getFieldValue("password")).map(s -> (String) s).ifPresent(s -> { + if (s.chars().anyMatch(Character::isISOControl)) { + e.rejectValue("password", "password must only contain printable characters"); + } + }); + } + + /** + * Primitive Operation for validating the password depending on the subclass. + * + * @param e {@link Errors} from {@link FormValidator} + */ + public abstract void validatePasswordGeneric(Errors e); + +}