diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index b9d67da..6402156 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -35,6 +35,7 @@ public class App extends Application { NavigationController nav; private Logger logger; + static int MAX_ReTRIES = 3; @Override public void init() { @@ -44,8 +45,14 @@ public void init() { this.dbWrapper = new DbWrapper(false); OrgApiWrapper orgApiWrapper = new OrgApiWrapper("https://app.innsamlingskontrollen.no/api/public/v1/all"); - while (!dbWrapper.connect()) { + int retries = 0; + while (!dbWrapper.connect() && retries < MAX_ReTRIES) { this.logger.warning("Failed to connect to database"); + retries++; + } + if (retries == MAX_ReTRIES) { + this.logger.severe("Failed to connect to database after " + MAX_ReTRIES + " attempts"); + throw new RuntimeException("Failed to connect to database"); } // Load data from database diff --git a/src/main/java/edu/group5/app/control/AuthController.java b/src/main/java/edu/group5/app/control/AuthController.java index 249a436..4911a3b 100644 --- a/src/main/java/edu/group5/app/control/AuthController.java +++ b/src/main/java/edu/group5/app/control/AuthController.java @@ -3,6 +3,7 @@ import edu.group5.app.model.AppState; import edu.group5.app.model.user.User; import edu.group5.app.model.user.UserService; +import edu.group5.app.utils.ParameterValidator; import edu.group5.app.view.loginpage.LoginPageView; import edu.group5.app.view.loginpage.SignUpPageView; import javafx.scene.control.Alert; @@ -31,6 +32,9 @@ public class AuthController { private final UserService userService; public AuthController(AppState appState, NavigationController nav, UserService userService) { + ParameterValidator.objectChecker(appState, "AppState"); + ParameterValidator.objectChecker(nav, "NavigationController"); + ParameterValidator.objectChecker(userService, "UserService"); this.appState = appState; this.nav = nav; this.userService = userService; @@ -69,7 +73,7 @@ public void handleSignUp(SignUpPageView view, String firstName, String lastName, // Clears password char array after creating a hash. String hashedPassword = encoder.encode(new String(passwordChars)); for (int i = 0; i < passwordChars.length; i++) { - passwordChars[0] = '0'; + passwordChars[i] = '\u0000'; } Alert privacyPolicy = new Alert(Alert.AlertType.CONFIRMATION); @@ -86,9 +90,8 @@ public void handleSignUp(SignUpPageView view, String firstName, String lastName, if (success) { User user = userService.getUserByEmail(email); - - appState.setCurrentUser(user); - nav.showHomePage(); + appState.setCurrentUser(user); + nav.showHomePage(); } else { view.showError("Registration failed. Email may already be in use."); } diff --git a/src/main/java/edu/group5/app/control/DonationController.java b/src/main/java/edu/group5/app/control/DonationController.java index 8a8ec79..61ab172 100644 --- a/src/main/java/edu/group5/app/control/DonationController.java +++ b/src/main/java/edu/group5/app/control/DonationController.java @@ -6,6 +6,7 @@ import edu.group5.app.model.organization.Organization; import edu.group5.app.model.user.Customer; import edu.group5.app.model.user.User; +import edu.group5.app.utils.ParameterValidator; import java.math.BigDecimal; import java.util.HashSet; @@ -34,6 +35,9 @@ public class DonationController { private final DonationService service; public DonationController(AppState appState, NavigationController nav, DonationService service) { + ParameterValidator.objectChecker(appState, "AppState"); + ParameterValidator.objectChecker(nav, "NavigationController"); + ParameterValidator.objectChecker(service, "DonationService"); this.appState = appState; this.nav = nav; this.service = service; @@ -46,6 +50,7 @@ public DonationController(AppState appState, NavigationController nav, DonationS * @return a map of donations. */ public Map getUserDonations(int userId) { + ParameterValidator.intChecker(userId, "User ID"); return service.getDonationRepository().filterByUser(userId); } @@ -56,7 +61,11 @@ public Map getUserDonations(int userId) { * @return a set of organization IDs */ public Set getUniqueOrganizationIDs() { - Map userDonations = getUserDonations(appState.getCurrentUser().getUserId()); + User currentUser = appState.getCurrentUser(); + if (currentUser == null) { + throw new IllegalStateException("No user logged in"); + } + Map userDonations = getUserDonations(currentUser.getUserId()); Set uniqueOrganizations = new HashSet<>(); for (Donation donation : userDonations.values()) { @@ -146,19 +155,26 @@ private void handleDonate() { ); if (success) { - System.out.println("Donation created: " + amount + " kr to " + currentOrg.name() + ", with payment method: " + paymentMethod); + System.out.println("Donation created: " + + amount + " kr to " + currentOrg.name() + + ", with payment method: " + paymentMethod); } else { System.err.println("Failed to create donation"); } // Clear donation session state appState.setCurrentDonationAmount(null); + // Clear org + appState.setCurrentOrganization(null); + // Clear payment method + appState.setCurrentPaymentMethod(null); // Navigate to payment complete nav.showPaymentCompletePage(); } private void showError(String message) { + ParameterValidator.stringChecker(message, "message"); Alert errorAlert = new Alert(Alert.AlertType.WARNING); errorAlert.setTitle("Donation Error"); errorAlert.setHeaderText("Cannot Process Donation"); diff --git a/src/main/java/edu/group5/app/control/NavigationController.java b/src/main/java/edu/group5/app/control/NavigationController.java index 7bfbc8c..326389b 100644 --- a/src/main/java/edu/group5/app/control/NavigationController.java +++ b/src/main/java/edu/group5/app/control/NavigationController.java @@ -4,6 +4,7 @@ import edu.group5.app.model.donation.DonationService; import edu.group5.app.model.organization.OrganizationService; import edu.group5.app.model.user.UserService; +import edu.group5.app.utils.ParameterValidator; import edu.group5.app.view.Header; import edu.group5.app.view.causespage.CausesPageView; import edu.group5.app.view.donationpage.DonationPageView; @@ -30,7 +31,14 @@ public class NavigationController { private final DonationController donationController; private final OrganizationController organizationController; - public NavigationController(BorderPane root, AppState appState, UserService userService, DonationService donationService, OrganizationService organizationService) { + public NavigationController(BorderPane root, AppState appState, UserService userService, + DonationService donationService, OrganizationService organizationService) { + ParameterValidator.objectChecker(root, "Root BorderPane"); + ParameterValidator.objectChecker(appState, "AppState"); + ParameterValidator.objectChecker(userService, "UserService"); + ParameterValidator.objectChecker(donationService, "DonationService"); + ParameterValidator.objectChecker(organizationService, "OrganizationService"); + this.root = root; this.header = new Header(this); this.loginHeader = new LoginHeader(); diff --git a/src/main/java/edu/group5/app/control/OrganizationController.java b/src/main/java/edu/group5/app/control/OrganizationController.java index fb65127..fc1252f 100644 --- a/src/main/java/edu/group5/app/control/OrganizationController.java +++ b/src/main/java/edu/group5/app/control/OrganizationController.java @@ -2,6 +2,8 @@ import edu.group5.app.model.organization.Organization; import edu.group5.app.model.organization.OrganizationService; +import edu.group5.app.utils.ParameterValidator; +import tools.jackson.databind.deser.bean.CreatorCandidate.Param; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -13,10 +15,12 @@ public class OrganizationController { private final OrganizationService service; public OrganizationController(OrganizationService service) { + ParameterValidator.objectChecker(service, "OrganizationService"); this.service = service; } public Organization getOrganizationById(int orgId) { + ParameterValidator.intChecker(orgId, "Organization ID"); return service.findByOrgNumber(orgId); } diff --git a/src/main/java/edu/group5/app/model/DBRepository.java b/src/main/java/edu/group5/app/model/DBRepository.java index 3cd1fa9..88ac3d9 100644 --- a/src/main/java/edu/group5/app/model/DBRepository.java +++ b/src/main/java/edu/group5/app/model/DBRepository.java @@ -2,6 +2,9 @@ import java.util.HashMap; import java.util.Map; + +import edu.group5.app.utils.ParameterValidator; + import java.util.List; /** @@ -22,6 +25,7 @@ public abstract class DBRepository extends Repository { * @param content the HashMap used to store repository entities */ protected DBRepository(Map content) { + ParameterValidator.objectChecker(content, "Content"); super(content); this.contentLock = new HashMap<>(); } diff --git a/src/main/java/edu/group5/app/model/Repository.java b/src/main/java/edu/group5/app/model/Repository.java index 032f307..64d4b90 100644 --- a/src/main/java/edu/group5/app/model/Repository.java +++ b/src/main/java/edu/group5/app/model/Repository.java @@ -2,6 +2,8 @@ import java.util.Map; +import edu.group5.app.utils.ParameterValidator; + /** * Represents a repository. */ @@ -13,6 +15,7 @@ public abstract class Repository { * @param content the underlying data structure used to store entities */ protected Repository(Map content) { + ParameterValidator.objectChecker(content, "content"); this.content = content; } diff --git a/src/main/java/edu/group5/app/model/donation/DonationRepository.java b/src/main/java/edu/group5/app/model/donation/DonationRepository.java index a55ea74..f1102ba 100644 --- a/src/main/java/edu/group5/app/model/donation/DonationRepository.java +++ b/src/main/java/edu/group5/app/model/donation/DonationRepository.java @@ -1,6 +1,7 @@ package edu.group5.app.model.donation; import edu.group5.app.model.DBRepository; +import edu.group5.app.utils.ParameterValidator; import java.util.Comparator; import java.util.HashMap; @@ -32,9 +33,7 @@ public class DonationRepository extends DBRepository { */ public DonationRepository(List rows) { super(new HashMap<>()); - if (rows == null) { - throw new IllegalArgumentException("The list of rows cannot be null"); - } + ParameterValidator.objectChecker(rows, "List of donation rows"); this.content = new HashMap<>(); for (Object[] row : rows) { if (row == null || row.length != 6) { @@ -88,9 +87,7 @@ public List export() { * @throws IllegalArgumentException if the donationId is not positive */ public Donation getDonationById(int donationId) { - if (donationId <= 0) { - throw new IllegalArgumentException("Donation ID must be positive"); - } + ParameterValidator.intChecker(donationId, "Donation ID"); return content.get(donationId); } @@ -102,7 +99,7 @@ public Donation getDonationById(int donationId) { */ public int getNextDonationId() { return content.keySet().stream().max(Integer::compareTo).orElse(0) + 1; - } /* TODO change this when data database is introduced */ + } public Map getAllDonations() { return new HashMap<>(content); @@ -122,9 +119,7 @@ public Map getAllDonations() { */ @Override public boolean addContent(Donation donation) { - if (donation == null) { - throw new IllegalArgumentException("Donation cannot be null"); - } + ParameterValidator.objectChecker(donation, "Donation"); if (content.containsKey(donation.donationId())) { return false; } @@ -180,9 +175,7 @@ public HashMap sortByAmount() { * @throws IllegalArgumentException if the orgNumber is not positive */ public HashMap filterByOrganization(int orgNumber) { - if (orgNumber <= 0) { - throw new IllegalArgumentException("Organization number must be positive"); - } + ParameterValidator.intChecker(orgNumber, "Organization number"); return content.entrySet() .stream() .filter(entry -> entry.getValue().organizationId() == orgNumber) @@ -201,9 +194,7 @@ public HashMap filterByOrganization(int orgNumber) { * @throws IllegalArgumentException if the userId is not positive */ public HashMap filterByUser(int userId) { - if (userId <= 0) { - throw new IllegalArgumentException("User ID must be positive"); - } + ParameterValidator.intChecker(userId, "User ID"); return content.entrySet().stream() .filter(entry -> entry.getValue().userId() == userId) .collect(Collectors.toMap( diff --git a/src/main/java/edu/group5/app/model/donation/DonationService.java b/src/main/java/edu/group5/app/model/donation/DonationService.java index 690a632..6f978b1 100644 --- a/src/main/java/edu/group5/app/model/donation/DonationService.java +++ b/src/main/java/edu/group5/app/model/donation/DonationService.java @@ -1,11 +1,11 @@ package edu.group5.app.model.donation; import java.time.Instant; - import java.math.BigDecimal; import java.sql.Timestamp; import edu.group5.app.model.organization.Organization; import edu.group5.app.model.organization.OrganizationRepository; import edu.group5.app.model.user.Customer; +import edu.group5.app.utils.ParameterValidator; /** * DonationService class provides functionality for handling donations in the system. @@ -27,12 +27,8 @@ public class DonationService { */ public DonationService(DonationRepository donationRepository, OrganizationRepository organizationRepository) { - if (donationRepository == null) { - throw new IllegalArgumentException("DonationRepository cannot be null"); - } - if (organizationRepository == null) { - throw new IllegalArgumentException("OrganizationRepository cannot be null"); - } + ParameterValidator.objectChecker(donationRepository, "DonationRepository"); + ParameterValidator.objectChecker(organizationRepository, "OrganizationRepository"); this.donationRepository = donationRepository; this.organizationRepository = organizationRepository; } diff --git a/src/main/java/edu/group5/app/model/organization/Organization.java b/src/main/java/edu/group5/app/model/organization/Organization.java index 7016567..4c66be0 100644 --- a/src/main/java/edu/group5/app/model/organization/Organization.java +++ b/src/main/java/edu/group5/app/model/organization/Organization.java @@ -2,6 +2,8 @@ import java.util.Objects; +import edu.group5.app.utils.ParameterValidator; + /** * Represents an organization. * @@ -45,9 +47,7 @@ public record Organization( */ public Organization(int orgNumber, String name, boolean trusted, String websiteUrl, boolean isPreApproved, String description, String logoUrl) { - if (orgNumber < 0) { - throw new IllegalArgumentException("orgNumber cannot be negative"); - } + ParameterValidator.intChecker(orgNumber, "Organization number"); this.orgNumber = orgNumber; this.name = Objects.requireNonNull(name, "name cannot be null"); this.trusted = trusted; diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java b/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java index 61155b7..5da9a97 100644 --- a/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java +++ b/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java @@ -1,6 +1,7 @@ package edu.group5.app.model.organization; import edu.group5.app.model.Repository; +import edu.group5.app.utils.ParameterValidator; import tools.jackson.core.type.TypeReference; import tools.jackson.databind.ObjectMapper; @@ -30,12 +31,8 @@ public class OrganizationRepository extends Repository { public OrganizationRepository(Object[] input, OrganizationScraper scraper) { super(new HashMap<>()); this.grandMap = new HashMap<>(); - if (input == null) { - throw new IllegalArgumentException("The input cannot be null"); - } - if (scraper == null) { - throw new IllegalArgumentException("The scraper cannot be null"); - } + ParameterValidator.objectChecker(input, "Input data"); + ParameterValidator.objectChecker(scraper, "Scraper"); this.scraper = scraper; ObjectMapper mapper = new ObjectMapper(); @@ -44,6 +41,11 @@ public OrganizationRepository(Object[] input, OrganizationScraper scraper) { HashMap contentMap = mapper.convertValue(obj, new TypeReference>() {}); + Object orgNumberObj = contentMap.get("org_number"); + if (orgNumberObj == null) { + System.err.println("Skipping organization: missing org_number"); + continue; + } String orgNumberStr = ((String) contentMap.get("org_number")).replaceAll("\\s", ""); int orgNumber = Integer.parseInt(orgNumberStr); String name = (String) contentMap.get("name"); @@ -101,9 +103,7 @@ public Map getTrustedOrganizations() { * @throws IllegalArgumentException if the organization number is not a positive integer */ public Organization findByOrgNumber(int orgNumber) { - if (orgNumber <= 0) { - throw new IllegalArgumentException("The Organization number must be a positive integer"); - } + ParameterValidator.intChecker(orgNumber, "Organization number"); return grandMap.get(orgNumber); } @@ -114,9 +114,7 @@ public Organization findByOrgNumber(int orgNumber) { * @throws IllegalArgumentException if the name is null or empty */ public Organization findByOrgName(String name) { - if (name == null || name.isEmpty()) { - throw new IllegalArgumentException("The name cannot be null"); - } + ParameterValidator.stringChecker(name, "Organization name"); return grandMap.values().stream() .filter(org -> org.name().equalsIgnoreCase(name)) .findFirst() diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java b/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java index 6a8c230..fdeec82 100644 --- a/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java +++ b/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java @@ -3,13 +3,9 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; -import org.jsoup.nodes.TextNode; -import org.jsoup.select.Elements; - import java.util.stream.Collectors; - -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * Handles web scraping of organization information from Innsamlingskontrollen. @@ -17,8 +13,8 @@ * All results are cached to avoid redundant network requests. */ public class OrganizationScraper { - private final Map logoCache = new HashMap<>(); - private final Map descriptionCache = new HashMap<>(); + private final Map logoCache = new ConcurrentHashMap<>(); + private final Map descriptionCache = new ConcurrentHashMap<>(); /** * Fetches the description for the given URL by scraping all text content @@ -35,10 +31,6 @@ public class OrganizationScraper { * @return the description text, or null if not found or pageUrl is invalid */ public String fetchDescription(String pageUrl) { - if (pageUrl == null || pageUrl.isBlank()) { - return null; - } - if (descriptionCache.containsKey(pageUrl)) { return descriptionCache.get(pageUrl); } @@ -88,10 +80,6 @@ public String fetchDescription(String pageUrl) { * @return the absolute logo URL, or null if not found or pageUrl is invalid */ public String fetchLogoUrl(String pageUrl) { - if (pageUrl == null || pageUrl.isBlank()) { - return null; - } - if (logoCache.containsKey(pageUrl)) { return logoCache.get(pageUrl); } diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationService.java b/src/main/java/edu/group5/app/model/organization/OrganizationService.java index e19c273..acb1110 100644 --- a/src/main/java/edu/group5/app/model/organization/OrganizationService.java +++ b/src/main/java/edu/group5/app/model/organization/OrganizationService.java @@ -2,6 +2,9 @@ import java.util.stream.Collectors; +import edu.group5.app.utils.ParameterValidator; +import tools.jackson.databind.deser.bean.CreatorCandidate.Param; + import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; @@ -27,12 +30,8 @@ public class OrganizationService { * @throws IllegalArgumentException if organizationRepository or scraper is null */ public OrganizationService(OrganizationRepository organizationRepository, OrganizationScraper scraper) { - if (organizationRepository == null) { - throw new IllegalArgumentException("OrganizationRepository cannot be null"); - } - if (scraper == null) { - throw new IllegalArgumentException("OrganizationScraper cannot be null"); - } + ParameterValidator.objectChecker(organizationRepository, "OrganizationRepository"); + ParameterValidator.objectChecker(scraper, "Scraper"); this.organizationRepository = organizationRepository; this.scraper = scraper; } @@ -71,6 +70,7 @@ public Organization findByOrgNumber(int orgNumber) { * @return the Organization if found, null otherwise */ public Organization findByOrgName(String name) { + ParameterValidator.stringChecker(name, "name"); return organizationRepository.findByOrgName(name); } diff --git a/src/main/java/edu/group5/app/model/user/Customer.java b/src/main/java/edu/group5/app/model/user/Customer.java index 93f03ac..d04139d 100644 --- a/src/main/java/edu/group5/app/model/user/Customer.java +++ b/src/main/java/edu/group5/app/model/user/Customer.java @@ -1,6 +1,9 @@ package edu.group5.app.model.user; import java.util.List; + +import edu.group5.app.utils.ParameterValidator; + import java.util.ArrayList; /** @@ -38,9 +41,7 @@ public String getRole() { } public void addPreference(int orgNumber) { - if (orgNumber <= 0) { - throw new IllegalArgumentException("Organization number must be a positive integer"); - } + ParameterValidator.intChecker(orgNumber,"Organization number"); if (preferences.contains(orgNumber)) { throw new IllegalArgumentException("Organization number already in preferences"); } @@ -48,9 +49,7 @@ public void addPreference(int orgNumber) { } public void removePreference(int orgNumber) { - if (orgNumber <= 0) { - throw new IllegalArgumentException("Organization number must be a positive integer"); - } + ParameterValidator.intChecker(orgNumber, "Organization number"); if (!preferences.contains(orgNumber)) { throw new IllegalArgumentException("Organization number not found in preferences"); } diff --git a/src/main/java/edu/group5/app/model/user/User.java b/src/main/java/edu/group5/app/model/user/User.java index 411538d..54c9e16 100644 --- a/src/main/java/edu/group5/app/model/user/User.java +++ b/src/main/java/edu/group5/app/model/user/User.java @@ -1,5 +1,9 @@ package edu.group5.app.model.user; +import java.lang.reflect.Parameter; + import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import edu.group5.app.utils.ParameterValidator; /** * User class represents a user in the system. It is an abstract class that will be extended by specific user types such as Donor, Recipient, and Admin. * Each user has a unique userId, a role that defines their permissions in the system, and personal information such as first name, last name, email, and password hash. @@ -27,21 +31,12 @@ public abstract class User { */ public User(int userId, String firstName, String lastName, String email, String passwordHash) { - if (userId <= 0) { - throw new IllegalArgumentException("User ID must be positive"); - } - if (firstName == null || firstName.trim().isEmpty()) { - throw new IllegalArgumentException("First name cannot be null or empty"); - } - if (lastName == null || lastName.trim().isEmpty()) { - throw new IllegalArgumentException("Last name cannot be null or empty"); - } - if (email == null || email.trim().isEmpty()) { - throw new IllegalArgumentException("Email cannot be null or empty"); - } - if (passwordHash == null || passwordHash.trim().isEmpty()) { - throw new IllegalArgumentException("Password hash cannot be null or empty"); - } + ParameterValidator.intChecker(userId, "User ID"); + ParameterValidator.stringChecker(firstName, "First name"); + ParameterValidator.stringChecker(lastName, "Last name"); + ParameterValidator.stringChecker(email, "Email"); + ParameterValidator.stringChecker(passwordHash, "Password hash"); + this.userId = userId; this.firstName = firstName.trim(); this.lastName = lastName.trim(); diff --git a/src/main/java/edu/group5/app/model/user/UserRepository.java b/src/main/java/edu/group5/app/model/user/UserRepository.java index 193f433..07f9ca8 100644 --- a/src/main/java/edu/group5/app/model/user/UserRepository.java +++ b/src/main/java/edu/group5/app/model/user/UserRepository.java @@ -5,6 +5,7 @@ import java.util.Map; import edu.group5.app.model.DBRepository; +import edu.group5.app.utils.ParameterValidator; public class UserRepository extends DBRepository { public final static String ROLE_CUSTOMER = "Customer"; @@ -18,9 +19,7 @@ public class UserRepository extends DBRepository { */ public UserRepository(List rows) { super(new HashMap<>()); - if (rows == null) { - throw new IllegalArgumentException("The list of rows cannot be null"); - } + ParameterValidator.objectChecker(rows, "List of User rows"); for (Object[] row : rows) { if (row == null || row.length != 6) { throw new IllegalArgumentException("Each row must contain exactly 6 elements"); @@ -83,9 +82,7 @@ public HashMap getUsers() { * @throws IllegalArgumentException if the userId is not positive */ public User getUserById(int userId) { - if (userId <= 0) { - throw new IllegalArgumentException("User ID must be positive"); - } + ParameterValidator.intChecker(userId, "User ID"); return content.get(userId); } @@ -104,7 +101,7 @@ public int getNextUserId() { () -> new IllegalStateException("No keys found")); int nextId = maxKey + 1; return nextId; - } /* TODO change this when data database is introduced */ + } /** * Adds a new user to the repository @@ -120,9 +117,7 @@ public int getNextUserId() { */ @Override public boolean addContent(User user) { - if (user == null) { - throw new IllegalArgumentException("User cannot be null"); - } + ParameterValidator.objectChecker(user, "User"); if (content.containsKey(user.getUserId())) { return false; } @@ -138,9 +133,7 @@ public boolean addContent(User user) { * user exists */ public User findUserByEmail(String email) { - if (email == null || email.trim().isEmpty()) { - throw new IllegalArgumentException("Email cannot be null or empty"); - } + ParameterValidator.stringChecker(email, "Email"); return content.values().stream() .filter(user -> user.getEmail().equals(email)) .findFirst() diff --git a/src/main/java/edu/group5/app/model/user/UserService.java b/src/main/java/edu/group5/app/model/user/UserService.java index b237eae..a6d316e 100644 --- a/src/main/java/edu/group5/app/model/user/UserService.java +++ b/src/main/java/edu/group5/app/model/user/UserService.java @@ -1,5 +1,7 @@ package edu.group5.app.model.user; +import edu.group5.app.utils.ParameterValidator; + /** * Service class for managing user-related operations, such as registration and * login. @@ -19,9 +21,7 @@ public class UserService { * @throws IllegalArgumentException if userRepository is null */ public UserService(UserRepository userRepository) { - if (userRepository == null) { - throw new IllegalArgumentException("UserRepository cannot be null"); - } + ParameterValidator.objectChecker(userRepository, "UserRepository"); this.userRepository = userRepository; } @@ -106,9 +106,7 @@ public User login(String email, char[] password) { * @return the User object if found, null otherwise */ public User getUserByEmail(String email) { - if (email == null || email.trim().isEmpty()) { - return null; - } + ParameterValidator.stringChecker(email, "email"); return this.userRepository.findUserByEmail(email); } } diff --git a/src/main/java/edu/group5/app/utils/ParameterValidator.java b/src/main/java/edu/group5/app/utils/ParameterValidator.java index 3bc3e5a..28a8dc0 100644 --- a/src/main/java/edu/group5/app/utils/ParameterValidator.java +++ b/src/main/java/edu/group5/app/utils/ParameterValidator.java @@ -24,7 +24,7 @@ public final class ParameterValidator { public static final void stringChecker(String stringArg, String variableName) throws IllegalArgumentException { nullCheck(stringArg, variableName); - if (stringArg.isBlank()) { + if (stringArg.trim().isBlank()) { throw new IllegalArgumentException(String.format("%s can't be blank", variableName)); } } @@ -104,7 +104,7 @@ public static final void exportChecker( if (!data.isEmpty()) { if (data.stream().anyMatch(i -> i.length != rowLength)) { throw new IllegalArgumentException( - String.format("%s's arrays must have a length of 6", dataName) + String.format("%s's arrays must have a length of %d", dataName, rowLength) ); } if (data.stream().anyMatch(i -> Arrays.asList(i).contains(null))) { diff --git a/src/main/java/edu/group5/app/view/causespage/CausesPageView.java b/src/main/java/edu/group5/app/view/causespage/CausesPageView.java index 7db3ee9..346df19 100644 --- a/src/main/java/edu/group5/app/view/causespage/CausesPageView.java +++ b/src/main/java/edu/group5/app/view/causespage/CausesPageView.java @@ -1,6 +1,7 @@ package edu.group5.app.view.causespage; import edu.group5.app.model.organization.Organization; +import edu.group5.app.utils.ParameterValidator; import edu.group5.app.control.NavigationController; import edu.group5.app.control.OrganizationController; import edu.group5.app.model.AppState; @@ -41,6 +42,10 @@ public class CausesPageView extends BorderPane { private Map allOrganizations; public CausesPageView(AppState appState, NavigationController nav, OrganizationController orgController) { + ParameterValidator.objectChecker(appState, "AppState"); + ParameterValidator.objectChecker(nav, "NavigationController"); + ParameterValidator.objectChecker(orgController, "OrganizationController"); + this.appState = appState; this.nav = nav; this.orgController = orgController; diff --git a/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java b/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java index 2ca30bb..c24b32a 100644 --- a/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java +++ b/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java @@ -3,6 +3,7 @@ import edu.group5.app.control.NavigationController; import edu.group5.app.model.AppState; import edu.group5.app.model.organization.Organization; +import edu.group5.app.utils.ParameterValidator; import javafx.geometry.Pos; import javafx.scene.image.Image; import javafx.scene.image.ImageView; diff --git a/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java b/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java index 9444421..61ca29c 100644 --- a/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java +++ b/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java @@ -3,6 +3,7 @@ import edu.group5.app.control.DonationController; import edu.group5.app.control.NavigationController; import edu.group5.app.model.AppState; +import edu.group5.app.utils.ParameterValidator; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.TextField; @@ -37,6 +38,10 @@ public class DonationPageView extends BorderPane { private Button donateBtn; public DonationPageView(AppState appState, NavigationController nav, DonationController donationController) { + ParameterValidator.objectChecker(appState, "AppState"); + ParameterValidator.objectChecker(nav, "NavigationController"); + ParameterValidator.objectChecker(donationController, "DonationController"); + this.appState = appState; this.nav = nav; this.donationController = donationController;