From 03c110dd9c8e6ce830d9cd00a3a591e05a99e0a3 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 06:50:53 +0000 Subject: [PATCH 1/7] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d20aaf9..7071577 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/339Lr3BJ) ### How the tests work (and Docker requirement) This project ships with an end‑to‑end CLI integration test suite that uses Testcontainers to spin up a temporary MySQL database. From 3b8f2ed2379df36b2b0fb38eb1d764a32ca8a0e2 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Wed, 3 Dec 2025 14:30:30 +0100 Subject: [PATCH 2/7] First commit, created branch database_lab3, repositories for account and Moon Missions with implementation classes. First 4 tests are green. --- .../java/com/example/AccountRepository.java | 8 +++ .../com/example/AccountRepositoryImpl.java | 49 +++++++++++++++++++ src/main/java/com/example/Main.java | 34 +++++++++++++ .../com/example/MoonMissionRepository.java | 7 +++ .../example/MoonMissionRepositoryImpl.java | 34 +++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 src/main/java/com/example/AccountRepository.java create mode 100644 src/main/java/com/example/AccountRepositoryImpl.java create mode 100644 src/main/java/com/example/MoonMissionRepository.java create mode 100644 src/main/java/com/example/MoonMissionRepositoryImpl.java diff --git a/src/main/java/com/example/AccountRepository.java b/src/main/java/com/example/AccountRepository.java new file mode 100644 index 0000000..6f725c2 --- /dev/null +++ b/src/main/java/com/example/AccountRepository.java @@ -0,0 +1,8 @@ +package com.example; + +import java.util.List; + +public interface AccountRepository { + List findUsernames(); + List findPasswords(); +} diff --git a/src/main/java/com/example/AccountRepositoryImpl.java b/src/main/java/com/example/AccountRepositoryImpl.java new file mode 100644 index 0000000..50a7191 --- /dev/null +++ b/src/main/java/com/example/AccountRepositoryImpl.java @@ -0,0 +1,49 @@ +package com.example; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class AccountRepositoryImpl implements AccountRepository { + Connection connection; + PreparedStatement findUsernamesStatement; + PreparedStatement findPasswordsStatement; + + public AccountRepositoryImpl(String jdbc, String username, String password) { + try { + connection = DriverManager.getConnection(jdbc, username, password); + findUsernamesStatement = connection.prepareStatement("select * from account"); + findPasswordsStatement = connection.prepareStatement("select * from account"); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public List findUsernames() { + List usernames = new ArrayList<>(); + try { + ResultSet rs = findUsernamesStatement.executeQuery(); + while (rs.next()) { + usernames.add(rs.getString("name")); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return usernames; + } + + @Override + public List findPasswords() { + List passwords = new ArrayList<>(); + try { + ResultSet rs = findPasswordsStatement.executeQuery(); + while (rs.next()) { + passwords.add(rs.getString("password")); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return passwords; + } +} diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 6dc6fbd..376c442 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -4,6 +4,7 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.Arrays; +import java.util.Scanner; public class Main { @@ -31,8 +32,41 @@ public void run() { throw new RuntimeException(e); } //Todo: Starting point for your code + + AccountRepository accountRepo = new AccountRepositoryImpl(jdbcUrl, dbUser, dbPass); + MoonMissionRepository moonMissionRepo = new MoonMissionRepositoryImpl(jdbcUrl, dbUser, dbPass); + + + Scanner scanner = new Scanner(System.in); + System.out.println("Username: "); + String user = scanner.nextLine(); + System.out.println("Password: "); + String pass = scanner.nextLine(); + if( user.isEmpty() || pass.isEmpty() ) { + System.out.println("Username or password cannot be empty."); + } + + if (!accountRepo.findUsernames().contains(user) || !accountRepo.findPasswords().contains(pass)) { + System.out.println("Invalid username or password."); + } + String choice; + String menu = """ + 1) List moon missions (prints spacecraft names from `moon_mission`). + 2) Get a moon mission by mission_id (prints details for that mission). + 3) Count missions for a given year (prompts: year; prints the number of missions launched that year). + 4) Create an account (prompts: first name, last name, ssn, password; prints confirmation). + 5) Update an account password (prompts: user_id, new password; prints confirmation). + 6) Delete an account (prompts: user_id; prints confirmation). + 0) Exit. + """; + System.out.println(menu); + choice = scanner.next(); + if (choice.equalsIgnoreCase("1")) { + System.out.println(moonMissionRepo.listMoonMissions()); + } } + /** * Determines if the application is running in development mode based on system properties, * environment variables, or command-line arguments. diff --git a/src/main/java/com/example/MoonMissionRepository.java b/src/main/java/com/example/MoonMissionRepository.java new file mode 100644 index 0000000..84da15c --- /dev/null +++ b/src/main/java/com/example/MoonMissionRepository.java @@ -0,0 +1,7 @@ +package com.example; + +import java.util.List; + +public interface MoonMissionRepository { + List listMoonMissions(); +} diff --git a/src/main/java/com/example/MoonMissionRepositoryImpl.java b/src/main/java/com/example/MoonMissionRepositoryImpl.java new file mode 100644 index 0000000..5253f4d --- /dev/null +++ b/src/main/java/com/example/MoonMissionRepositoryImpl.java @@ -0,0 +1,34 @@ +package com.example; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MoonMissionRepositoryImpl implements MoonMissionRepository { + Connection connection; + PreparedStatement listMoonMissionsStatement; + + public MoonMissionRepositoryImpl(String jdbc, String username, String password) { + try { + connection = DriverManager.getConnection(jdbc, username, password); + listMoonMissionsStatement = connection.prepareStatement("select * from moon_mission"); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + } + + @Override + public List listMoonMissions() { + List moonMissions = new ArrayList<>(); + try { + ResultSet rs = listMoonMissionsStatement.executeQuery(); + while (rs.next()) { + moonMissions.add(rs.getString("spacecraft")); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return moonMissions; + } +} From cc9efbf934f46590dee92469e37235b9de0cc37c Mon Sep 17 00:00:00 2001 From: mattknatt Date: Wed, 3 Dec 2025 17:03:22 +0100 Subject: [PATCH 3/7] Added classes MoonMission and Account to create objects from database info. 7 out of 9 tests passed. --- src/main/java/com/example/Account.java | 83 +++++++++++++++++ .../java/com/example/AccountRepository.java | 3 + .../com/example/AccountRepositoryImpl.java | 68 ++++++++++++-- src/main/java/com/example/Main.java | 38 +++++++- src/main/java/com/example/MoonMission.java | 88 +++++++++++++++++++ .../com/example/MoonMissionRepository.java | 2 + .../example/MoonMissionRepositoryImpl.java | 48 +++++++++- 7 files changed, 318 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/example/Account.java create mode 100644 src/main/java/com/example/MoonMission.java diff --git a/src/main/java/com/example/Account.java b/src/main/java/com/example/Account.java new file mode 100644 index 0000000..573b461 --- /dev/null +++ b/src/main/java/com/example/Account.java @@ -0,0 +1,83 @@ +package com.example; + +public class Account { + private int user_id; + private String name, password, first_name, last_name, ssn; + + public Account(int user_id, String name, String password, String first_name, String last_name, String ssn) { + this.user_id = user_id; + this.name = name; + this.password = password; + this.first_name = first_name; + this.last_name = last_name; + this.ssn = ssn; + } + + public Account(String name, String password, String first_name, String last_name, String ssn) { + this.name = name; + this.password = password; + this.first_name = first_name; + this.last_name = last_name; + this.ssn = ssn; + } + + public int getUser_id() { + return user_id; + } + + public void setUser_id(int user_id) { + this.user_id = user_id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirst_name() { + return first_name; + } + + public void setFirst_name(String first_name) { + this.first_name = first_name; + } + + public String getLast_name() { + return last_name; + } + + public void setLast_name(String last_name) { + this.last_name = last_name; + } + + public String getSsn() { + return ssn; + } + + public void setSsn(String ssn) { + this.ssn = ssn; + } + + @Override + public String toString() { + return "Account{" + + "user_id=" + user_id + + ", name='" + name + '\'' + + ", password='" + password + '\'' + + ", first_name='" + first_name + '\'' + + ", last_name='" + last_name + '\'' + + ", ssn='" + ssn + '\'' + + '}'; + } +} diff --git a/src/main/java/com/example/AccountRepository.java b/src/main/java/com/example/AccountRepository.java index 6f725c2..d999cc4 100644 --- a/src/main/java/com/example/AccountRepository.java +++ b/src/main/java/com/example/AccountRepository.java @@ -5,4 +5,7 @@ public interface AccountRepository { List findUsernames(); List findPasswords(); + List findAccounts(); + boolean createAccount(Account account); + int countAccounts(); } diff --git a/src/main/java/com/example/AccountRepositoryImpl.java b/src/main/java/com/example/AccountRepositoryImpl.java index 50a7191..6a466f7 100644 --- a/src/main/java/com/example/AccountRepositoryImpl.java +++ b/src/main/java/com/example/AccountRepositoryImpl.java @@ -6,14 +6,15 @@ public class AccountRepositoryImpl implements AccountRepository { Connection connection; - PreparedStatement findUsernamesStatement; - PreparedStatement findPasswordsStatement; + PreparedStatement findAccountsStmt, createAccountStmt, countAccountsStmt; + public AccountRepositoryImpl(String jdbc, String username, String password) { try { connection = DriverManager.getConnection(jdbc, username, password); - findUsernamesStatement = connection.prepareStatement("select * from account"); - findPasswordsStatement = connection.prepareStatement("select * from account"); + findAccountsStmt = connection.prepareStatement("select * from account"); + createAccountStmt = connection.prepareStatement("insert into account(name, password, first_name, last_name, ssn) values (?, ?, ?, ?, ?)"); + countAccountsStmt = connection.prepareStatement("select count(*) from account"); } catch (SQLException e) { throw new RuntimeException(e); } @@ -23,7 +24,7 @@ public AccountRepositoryImpl(String jdbc, String username, String password) { public List findUsernames() { List usernames = new ArrayList<>(); try { - ResultSet rs = findUsernamesStatement.executeQuery(); + ResultSet rs = findAccountsStmt.executeQuery(); while (rs.next()) { usernames.add(rs.getString("name")); } @@ -37,7 +38,7 @@ public List findUsernames() { public List findPasswords() { List passwords = new ArrayList<>(); try { - ResultSet rs = findPasswordsStatement.executeQuery(); + ResultSet rs = findAccountsStmt.executeQuery(); while (rs.next()) { passwords.add(rs.getString("password")); } @@ -46,4 +47,59 @@ public List findPasswords() { } return passwords; } + + @Override + public List findAccounts() { + List accounts = new ArrayList<>(); + try { + ResultSet rs = findAccountsStmt.executeQuery(); + while (rs.next()) { + Account a = new Account( + rs.getInt("user_id"), + rs.getString("name"), + rs.getString("password"), + rs.getString("first_name"), + rs.getString("last_name"), + rs.getString("ssn") + ); + accounts.add(a); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return accounts; + } + + @Override + public boolean createAccount(Account account) { + try { + createAccountStmt.setString(1, account.getName()); + createAccountStmt.setString(2, account.getPassword()); + createAccountStmt.setString(3, account.getFirst_name()); + createAccountStmt.setString(4, account.getLast_name()); + createAccountStmt.setString(5, account.getSsn()); + if (createAccountStmt.executeUpdate() == 1) { + return true; + } + + + } catch (SQLException e) { + return false; + } + return false; + } + + @Override + public int countAccounts() { + int count = 0; + try { + ResultSet rs = countAccountsStmt.executeQuery(); + while (rs.next()) { + count = rs.getInt(1); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return count; + } } diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 376c442..b93e613 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -42,12 +42,13 @@ public void run() { String user = scanner.nextLine(); System.out.println("Password: "); String pass = scanner.nextLine(); - if( user.isEmpty() || pass.isEmpty() ) { + if (user.isEmpty() || pass.isEmpty()) { System.out.println("Username or password cannot be empty."); } if (!accountRepo.findUsernames().contains(user) || !accountRepo.findPasswords().contains(pass)) { System.out.println("Invalid username or password."); + return; } String choice; String menu = """ @@ -61,8 +62,39 @@ public void run() { """; System.out.println(menu); choice = scanner.next(); - if (choice.equalsIgnoreCase("1")) { - System.out.println(moonMissionRepo.listMoonMissions()); + + switch (choice) { + case "1" -> System.out.println(moonMissionRepo.listMoonMissions()); + case "2" -> { + System.out.println("Provide a mission_id to get information: "); + String id = scanner.next(); + System.out.println(moonMissionRepo.getMoonMissionById(id).toString()); + } + case "3" -> { + System.out.println("Enter a year for which you want number of missions listed: "); + int year = scanner.nextInt(); + System.out.println("In " + year + "there were " + moonMissionRepo.missionsCountByYear(year) + "missions."); + } + case "4" -> { + String name, firstName, lastName, password, ssn; + System.out.println("Type in you username: "); + name = scanner.next(); + System.out.println("Type in your first name: "); + firstName = scanner.next(); + System.out.println("Type in your last name: "); + lastName = scanner.next(); + System.out.println("Type in your password: "); + password = scanner.next(); + System.out.println("Type in your ssn: "); + ssn = scanner.next(); + Account newAccount = new Account(name, password, firstName, lastName, ssn); + if (accountRepo.createAccount(newAccount)) { + System.out.println("Account successfully created."); + System.out.println(accountRepo.countAccounts()); + } else { + System.out.println("Account could not be created."); + } + } } } diff --git a/src/main/java/com/example/MoonMission.java b/src/main/java/com/example/MoonMission.java new file mode 100644 index 0000000..1fec033 --- /dev/null +++ b/src/main/java/com/example/MoonMission.java @@ -0,0 +1,88 @@ +package com.example; + +import java.sql.Date; + +public class MoonMission { + private int mission_id; + private String spacecraft, carrier_rocket, operator, mission_type, outcome; + private Date launch_date; + + public MoonMission(int mission_id, String spacecraft, Date launch_date, String carrier_rocket, String operator, String mission_type, String outcome) { + this.mission_id = mission_id; + this.spacecraft = spacecraft; + this.carrier_rocket = carrier_rocket; + this.operator = operator; + this.mission_type = mission_type; + this.outcome = outcome; + this.launch_date = launch_date; + } + + public int getMission_id() { + return mission_id; + } + + public void setMission_id(int mission_id) { + this.mission_id = mission_id; + } + + public String getSpacecraft() { + return spacecraft; + } + + public void setSpacecraft(String spacecraft) { + this.spacecraft = spacecraft; + } + + public String getCarrier_rocket() { + return carrier_rocket; + } + + public void setCarrier_rocket(String carrier_rocket) { + this.carrier_rocket = carrier_rocket; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getMission_type() { + return mission_type; + } + + public void setMission_type(String mission_type) { + this.mission_type = mission_type; + } + + public String getOutcome() { + return outcome; + } + + public void setOutcome(String outcome) { + this.outcome = outcome; + } + + public Date getLaunch_date() { + return launch_date; + } + + public void setLaunch_date(Date launch_date) { + this.launch_date = launch_date; + } + + @Override + public String toString() { + return "MoonMission{" + + "mission_id='" + mission_id + '\'' + + ", spacecraft='" + spacecraft + '\'' + + ", carrier_rocket='" + carrier_rocket + '\'' + + ", operator='" + operator + '\'' + + ", mission_type='" + mission_type + '\'' + + ", outcome='" + outcome + '\'' + + ", launch_date=" + launch_date + + '}'; + } +} diff --git a/src/main/java/com/example/MoonMissionRepository.java b/src/main/java/com/example/MoonMissionRepository.java index 84da15c..49b90cd 100644 --- a/src/main/java/com/example/MoonMissionRepository.java +++ b/src/main/java/com/example/MoonMissionRepository.java @@ -4,4 +4,6 @@ public interface MoonMissionRepository { List listMoonMissions(); + List getMoonMissionById(String id); + int missionsCountByYear(int year); } diff --git a/src/main/java/com/example/MoonMissionRepositoryImpl.java b/src/main/java/com/example/MoonMissionRepositoryImpl.java index 5253f4d..4d2e264 100644 --- a/src/main/java/com/example/MoonMissionRepositoryImpl.java +++ b/src/main/java/com/example/MoonMissionRepositoryImpl.java @@ -6,12 +6,16 @@ public class MoonMissionRepositoryImpl implements MoonMissionRepository { Connection connection; - PreparedStatement listMoonMissionsStatement; + PreparedStatement listMoonMissionsStmt, + getMoonMissionByIdStmt, + missionCountByYearStmt; public MoonMissionRepositoryImpl(String jdbc, String username, String password) { try { connection = DriverManager.getConnection(jdbc, username, password); - listMoonMissionsStatement = connection.prepareStatement("select * from moon_mission"); + listMoonMissionsStmt = connection.prepareStatement("select * from moon_mission"); + getMoonMissionByIdStmt = connection.prepareStatement("select * from moon_mission where mission_id = ?"); + missionCountByYearStmt = connection.prepareStatement("select count(*) as mission_count from moon_mission where year(launch_date) = ?"); } catch (SQLException e) { throw new RuntimeException(e); } @@ -22,7 +26,7 @@ public MoonMissionRepositoryImpl(String jdbc, String username, String password) public List listMoonMissions() { List moonMissions = new ArrayList<>(); try { - ResultSet rs = listMoonMissionsStatement.executeQuery(); + ResultSet rs = listMoonMissionsStmt.executeQuery(); while (rs.next()) { moonMissions.add(rs.getString("spacecraft")); } @@ -31,4 +35,42 @@ public List listMoonMissions() { } return moonMissions; } + @Override + public List getMoonMissionById(String id) { + List moonMissions = new ArrayList<>(); + try { + getMoonMissionByIdStmt.setString(1,id); + ResultSet rs = getMoonMissionByIdStmt.executeQuery(); + while (rs.next()) { + MoonMission m = new MoonMission( + rs.getInt("mission_id"), + rs.getString("spacecraft"), + rs.getDate("launch_date"), + rs.getString("carrier_rocket"), + rs.getString("operator"), + rs.getString("mission_type"), + rs.getString("outcome")); + moonMissions.add(m); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return moonMissions; + + } + + @Override + public int missionsCountByYear(int year) { + int count= 0; + try { + missionCountByYearStmt.setInt(1, year); + ResultSet rs = missionCountByYearStmt.executeQuery(); + while (rs.next()) { + count = rs.getInt("mission_count"); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return count; + } } From fe40d47ec2a2bef3b0176952c72a3400475c4f69 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Thu, 4 Dec 2025 08:55:08 +0100 Subject: [PATCH 4/7] Added methods needed to pass all tests. CRUD-operations now work. All tests pass. --- .../java/com/example/AccountRepository.java | 2 + .../com/example/AccountRepositoryImpl.java | 39 ++++++++++++++++++- src/main/java/com/example/Main.java | 24 ++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/AccountRepository.java b/src/main/java/com/example/AccountRepository.java index d999cc4..7712780 100644 --- a/src/main/java/com/example/AccountRepository.java +++ b/src/main/java/com/example/AccountRepository.java @@ -8,4 +8,6 @@ public interface AccountRepository { List findAccounts(); boolean createAccount(Account account); int countAccounts(); + boolean updatePassword(int id, String password); + boolean deleteAccount(int id); } diff --git a/src/main/java/com/example/AccountRepositoryImpl.java b/src/main/java/com/example/AccountRepositoryImpl.java index 6a466f7..4fd29b8 100644 --- a/src/main/java/com/example/AccountRepositoryImpl.java +++ b/src/main/java/com/example/AccountRepositoryImpl.java @@ -6,7 +6,11 @@ public class AccountRepositoryImpl implements AccountRepository { Connection connection; - PreparedStatement findAccountsStmt, createAccountStmt, countAccountsStmt; + PreparedStatement findAccountsStmt, + createAccountStmt, + countAccountsStmt, + updatePasswordStmt, + deleteAccountStmt; public AccountRepositoryImpl(String jdbc, String username, String password) { @@ -15,6 +19,8 @@ public AccountRepositoryImpl(String jdbc, String username, String password) { findAccountsStmt = connection.prepareStatement("select * from account"); createAccountStmt = connection.prepareStatement("insert into account(name, password, first_name, last_name, ssn) values (?, ?, ?, ?, ?)"); countAccountsStmt = connection.prepareStatement("select count(*) from account"); + updatePasswordStmt= connection.prepareStatement("update account set password=? where user_id=?"); + deleteAccountStmt = connection.prepareStatement("delete from account where user_id=?"); } catch (SQLException e) { throw new RuntimeException(e); } @@ -102,4 +108,35 @@ public int countAccounts() { } return count; } + @Override + public boolean updatePassword(int id, String password) { + try { + updatePasswordStmt.setString(1, password); + updatePasswordStmt.setInt(2, id); + int rowsAffected = updatePasswordStmt.executeUpdate(); + + if (rowsAffected > 0) { + return true; + } + + } catch (SQLException e) { + return false; + } + return false; + } + + @Override + public boolean deleteAccount(int id) { + try { + deleteAccountStmt.setInt(1, id); + int rowsAffected = deleteAccountStmt.executeUpdate(); + if (rowsAffected > 0) { + return true; + } + } catch (SQLException e) { + return false; + } + return false; + } + } diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index b93e613..073b2a1 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -95,6 +95,30 @@ public void run() { System.out.println("Account could not be created."); } } + case "5" -> { + System.out.println("Enter a user_id to update the password for: "); + int userId = scanner.nextInt(); + System.out.println("Enter new password:"); + String newPassword = scanner.next(); + while (newPassword.isEmpty()) { + System.out.println("Password cannot be empty."); + System.out.println("Enter new password:"); + newPassword = scanner.next(); + } + if(accountRepo.updatePassword(userId, newPassword)) + System.out.println("Password successfully updated."); + else + System.out.println("Password could not be updated."); + } + case "6" -> { + System.out.println("Enter the user_id for the account you want to delete: "); + int userId = scanner.nextInt(); + if(accountRepo.deleteAccount(userId)) + System.out.println("Account successfully deleted."); + else + System.out.println("Account could not be deleted."); + + } } } From ce4cd4b61740d156b23e33a2af866f8c32327ae1 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Thu, 4 Dec 2025 15:58:06 +0100 Subject: [PATCH 5/7] Created local database testdb with docker-compose.yml tu run application through. Added SimpleDriverManagerDataSource to inject datasource into Repositories. All tests pass but throws exception related to Scanner when running CliAppIT. --- docker-compose.yml | 15 ++ pom.xml | 5 + .../java/com/example/AccountRepository.java | 2 + .../com/example/AccountRepositoryImpl.java | 98 ++++++--- src/main/java/com/example/Main.java | 196 +++++++++++------- .../example/MoonMissionRepositoryImpl.java | 38 ++-- .../SimpleDriverManagerDataSource.java | 76 +++++++ 7 files changed, 306 insertions(+), 124 deletions(-) create mode 100644 docker-compose.yml create mode 100644 src/main/java/com/example/SimpleDriverManagerDataSource.java diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c1e2c6f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + mysql: + image: mysql:9.5.0 + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_ROOT_HOST: "%" + MYSQL_DATABASE: testdb + MYSQL_USER: user + MYSQL_PASSWORD: pass + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql +volumes: + mysql_data: \ No newline at end of file diff --git a/pom.xml b/pom.xml index 002ff66..640a103 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,11 @@ 9.5.0 runtime + + org.slf4j + slf4j-api + 2.0.17 + org.junit.jupiter junit-jupiter diff --git a/src/main/java/com/example/AccountRepository.java b/src/main/java/com/example/AccountRepository.java index 7712780..73023d3 100644 --- a/src/main/java/com/example/AccountRepository.java +++ b/src/main/java/com/example/AccountRepository.java @@ -1,10 +1,12 @@ package com.example; import java.util.List; +import java.util.Optional; public interface AccountRepository { List findUsernames(); List findPasswords(); + Optional findByUsername(String username); List findAccounts(); boolean createAccount(Account account); int countAccounts(); diff --git a/src/main/java/com/example/AccountRepositoryImpl.java b/src/main/java/com/example/AccountRepositoryImpl.java index 4fd29b8..5bd9137 100644 --- a/src/main/java/com/example/AccountRepositoryImpl.java +++ b/src/main/java/com/example/AccountRepositoryImpl.java @@ -1,36 +1,28 @@ package com.example; +import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class AccountRepositoryImpl implements AccountRepository { + private final DataSource dataSource; Connection connection; - PreparedStatement findAccountsStmt, - createAccountStmt, - countAccountsStmt, - updatePasswordStmt, - deleteAccountStmt; - - public AccountRepositoryImpl(String jdbc, String username, String password) { - try { - connection = DriverManager.getConnection(jdbc, username, password); - findAccountsStmt = connection.prepareStatement("select * from account"); - createAccountStmt = connection.prepareStatement("insert into account(name, password, first_name, last_name, ssn) values (?, ?, ?, ?, ?)"); - countAccountsStmt = connection.prepareStatement("select count(*) from account"); - updatePasswordStmt= connection.prepareStatement("update account set password=? where user_id=?"); - deleteAccountStmt = connection.prepareStatement("delete from account where user_id=?"); - } catch (SQLException e) { - throw new RuntimeException(e); - } + public AccountRepositoryImpl(DataSource dataSource) { + this.dataSource = dataSource; } + @Override public List findUsernames() { List usernames = new ArrayList<>(); + String sql = "select * from account"; try { - ResultSet rs = findAccountsStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); while (rs.next()) { usernames.add(rs.getString("name")); } @@ -43,8 +35,11 @@ public List findUsernames() { @Override public List findPasswords() { List passwords = new ArrayList<>(); + String sql = "select * from account"; try { - ResultSet rs = findAccountsStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); while (rs.next()) { passwords.add(rs.getString("password")); } @@ -54,11 +49,39 @@ public List findPasswords() { return passwords; } + @Override + public Optional findByUsername(String username) { + String sql = "select * from account where name = ?"; + try { + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1, username); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + Account account = new Account( + rs.getInt("user_id"), + rs.getString("name"), + rs.getString("password"), + rs.getString("first_name"), + rs.getString("last_name"), + rs.getString("ssn") + ); + return Optional.of(account); + } + else return Optional.empty(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + @Override public List findAccounts() { List accounts = new ArrayList<>(); + String sql = "select * from account"; try { - ResultSet rs = findAccountsStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); while (rs.next()) { Account a = new Account( rs.getInt("user_id"), @@ -78,13 +101,16 @@ public List findAccounts() { @Override public boolean createAccount(Account account) { + String sql = "insert into account(name, password, first_name, last_name, ssn) values (?, ?, ?, ?, ?)"; try { - createAccountStmt.setString(1, account.getName()); - createAccountStmt.setString(2, account.getPassword()); - createAccountStmt.setString(3, account.getFirst_name()); - createAccountStmt.setString(4, account.getLast_name()); - createAccountStmt.setString(5, account.getSsn()); - if (createAccountStmt.executeUpdate() == 1) { + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1, account.getName()); + ps.setString(2, account.getPassword()); + ps.setString(3, account.getFirst_name()); + ps.setString(4, account.getLast_name()); + ps.setString(5, account.getSsn()); + if (ps.executeUpdate() == 1) { return true; } @@ -99,7 +125,9 @@ public boolean createAccount(Account account) { public int countAccounts() { int count = 0; try { - ResultSet rs = countAccountsStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement("select count(*) from account"); + ResultSet rs = ps.executeQuery(); while (rs.next()) { count = rs.getInt(1); } @@ -110,10 +138,13 @@ public int countAccounts() { } @Override public boolean updatePassword(int id, String password) { + String sql = "update account set password=? where user_id=?"; try { - updatePasswordStmt.setString(1, password); - updatePasswordStmt.setInt(2, id); - int rowsAffected = updatePasswordStmt.executeUpdate(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1, password); + ps.setInt(2, id); + int rowsAffected = ps.executeUpdate(); if (rowsAffected > 0) { return true; @@ -127,9 +158,12 @@ public boolean updatePassword(int id, String password) { @Override public boolean deleteAccount(int id) { + String sql = "delete from account where user_id=?"; try { - deleteAccountStmt.setInt(1, id); - int rowsAffected = deleteAccountStmt.executeUpdate(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setInt(1, id); + int rowsAffected = ps.executeUpdate(); if (rowsAffected > 0) { return true; } diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 073b2a1..bf2ea64 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -1,9 +1,8 @@ package com.example; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import javax.sql.DataSource; import java.util.Arrays; +import java.util.Optional; import java.util.Scanner; public class Main { @@ -27,30 +26,137 @@ public void run() { "as system properties (-Dkey=value) or environment variables."); } - try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { - } catch (SQLException e) { - throw new RuntimeException(e); - } //Todo: Starting point for your code - AccountRepository accountRepo = new AccountRepositoryImpl(jdbcUrl, dbUser, dbPass); - MoonMissionRepository moonMissionRepo = new MoonMissionRepositoryImpl(jdbcUrl, dbUser, dbPass); - + DataSource dataSource = new SimpleDriverManagerDataSource(jdbcUrl, dbUser, dbPass); + AccountRepository accountRepo = new AccountRepositoryImpl(dataSource); + MoonMissionRepository moonMissionRepo = new MoonMissionRepositoryImpl(dataSource); Scanner scanner = new Scanner(System.in); + + Optional currentUser = login(accountRepo, scanner); + + while (currentUser.isEmpty()) { + currentUser = login(accountRepo, scanner); + } + + boolean running = true; + + while (running) { + showMenu(); + String choice = scanner.nextLine(); + if (!choice.isEmpty()) { + switch (choice) { + case "1" -> showMissions(moonMissionRepo); + case "2" -> getMissionById(scanner, moonMissionRepo); + case "3" -> countMissionsForYear(scanner, moonMissionRepo); + case "4" -> createAccount(scanner, accountRepo); + case "5" -> updatePasswordById(scanner, accountRepo); + case "6" -> deleteAccountById(scanner, accountRepo); + case "0" -> { + System.out.println("Exiting..."); + running = false; + } + default -> System.out.println("Invalid choice."); + } + } else { + System.out.println("Choice cannot be empty."); + } + + } + + scanner.close(); + } + + private Optional login(AccountRepository accountRepo, Scanner sc) { System.out.println("Username: "); - String user = scanner.nextLine(); + String user = sc.nextLine().trim(); System.out.println("Password: "); - String pass = scanner.nextLine(); + String pass = sc.nextLine().trim(); if (user.isEmpty() || pass.isEmpty()) { System.out.println("Username or password cannot be empty."); + return Optional.empty(); } - if (!accountRepo.findUsernames().contains(user) || !accountRepo.findPasswords().contains(pass)) { + Optional maybeAccount = accountRepo.findByUsername(user); + if (maybeAccount.isPresent()) { + Account account = maybeAccount.get(); + if (account.getPassword().equals(pass)) { + return Optional.of(account); + } else { + System.out.println("Invalid username or password."); + return Optional.empty(); + } + } else { System.out.println("Invalid username or password."); - return; + return Optional.empty(); + } + + } + + private static void deleteAccountById(Scanner sc, AccountRepository accountRepo) { + System.out.println("Enter the user_id for the account you want to delete: "); + int userId = Integer.parseInt(sc.nextLine().trim()); + if(accountRepo.deleteAccount(userId)) + System.out.println("Account successfully deleted."); + else + System.out.println("Account could not be deleted."); + } + + private static void updatePasswordById(Scanner sc, AccountRepository accountRepo) { + System.out.println("Enter a user_id to update the password for: "); + int userId = Integer.parseInt(sc.nextLine().trim()); + System.out.println("Enter new password:"); + String newPassword = sc.nextLine().trim(); + while (newPassword.isEmpty()) { + System.out.println("Password cannot be empty."); + System.out.println("Enter new password:"); + newPassword = sc.nextLine().trim(); } - String choice; + if(accountRepo.updatePassword(userId, newPassword)) + System.out.println("Password successfully updated."); + else + System.out.println("Password could not be updated."); + } + + private static void createAccount(Scanner sc, AccountRepository accountRepo) { + String name, firstName, lastName, password, ssn; + System.out.println("Type in you username: "); + name = sc.nextLine().trim(); + System.out.println("Type in your first name: "); + firstName = sc.nextLine().trim(); + System.out.println("Type in your last name: "); + lastName = sc.nextLine().trim(); + System.out.println("Type in your password: "); + password = sc.nextLine().trim(); + System.out.println("Type in your ssn: "); + ssn = sc.nextLine().trim(); + Account newAccount = new Account(name, password, firstName, lastName, ssn); + if (accountRepo.createAccount(newAccount)) { + System.out.println("Account successfully created."); + } else { + System.out.println("Account could not be created."); + } + } + + private static void countMissionsForYear(Scanner sc, MoonMissionRepository moonMissionRepo) { + System.out.println("Enter a year for which you want number of missions listed: "); + int year = Integer.parseInt(sc.nextLine().trim()); + System.out.println("In " + year + "there were " + moonMissionRepo.missionsCountByYear(year) + "missions."); + } + + private static void getMissionById(Scanner sc, MoonMissionRepository moonMissionRepo) { + System.out.println("Provide a mission_id to get information: "); + String id = sc.nextLine().trim(); + System.out.println(moonMissionRepo.getMoonMissionById(id).toString()); + } + + private static void showMissions(MoonMissionRepository moonMissionRepo) { + System.out.println(moonMissionRepo.listMoonMissions()); + } + + private static void showMenu() { + System.out.println("Options: "); String menu = """ 1) List moon missions (prints spacecraft names from `moon_mission`). 2) Get a moon mission by mission_id (prints details for that mission). @@ -61,65 +167,7 @@ public void run() { 0) Exit. """; System.out.println(menu); - choice = scanner.next(); - - switch (choice) { - case "1" -> System.out.println(moonMissionRepo.listMoonMissions()); - case "2" -> { - System.out.println("Provide a mission_id to get information: "); - String id = scanner.next(); - System.out.println(moonMissionRepo.getMoonMissionById(id).toString()); - } - case "3" -> { - System.out.println("Enter a year for which you want number of missions listed: "); - int year = scanner.nextInt(); - System.out.println("In " + year + "there were " + moonMissionRepo.missionsCountByYear(year) + "missions."); - } - case "4" -> { - String name, firstName, lastName, password, ssn; - System.out.println("Type in you username: "); - name = scanner.next(); - System.out.println("Type in your first name: "); - firstName = scanner.next(); - System.out.println("Type in your last name: "); - lastName = scanner.next(); - System.out.println("Type in your password: "); - password = scanner.next(); - System.out.println("Type in your ssn: "); - ssn = scanner.next(); - Account newAccount = new Account(name, password, firstName, lastName, ssn); - if (accountRepo.createAccount(newAccount)) { - System.out.println("Account successfully created."); - System.out.println(accountRepo.countAccounts()); - } else { - System.out.println("Account could not be created."); - } - } - case "5" -> { - System.out.println("Enter a user_id to update the password for: "); - int userId = scanner.nextInt(); - System.out.println("Enter new password:"); - String newPassword = scanner.next(); - while (newPassword.isEmpty()) { - System.out.println("Password cannot be empty."); - System.out.println("Enter new password:"); - newPassword = scanner.next(); - } - if(accountRepo.updatePassword(userId, newPassword)) - System.out.println("Password successfully updated."); - else - System.out.println("Password could not be updated."); - } - case "6" -> { - System.out.println("Enter the user_id for the account you want to delete: "); - int userId = scanner.nextInt(); - if(accountRepo.deleteAccount(userId)) - System.out.println("Account successfully deleted."); - else - System.out.println("Account could not be deleted."); - - } - } + System.out.println("Enter your option (0-6): "); } diff --git a/src/main/java/com/example/MoonMissionRepositoryImpl.java b/src/main/java/com/example/MoonMissionRepositoryImpl.java index 4d2e264..0545799 100644 --- a/src/main/java/com/example/MoonMissionRepositoryImpl.java +++ b/src/main/java/com/example/MoonMissionRepositoryImpl.java @@ -1,32 +1,28 @@ package com.example; +import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; public class MoonMissionRepositoryImpl implements MoonMissionRepository { + private final DataSource dataSource; Connection connection; - PreparedStatement listMoonMissionsStmt, - getMoonMissionByIdStmt, - missionCountByYearStmt; - - public MoonMissionRepositoryImpl(String jdbc, String username, String password) { - try { - connection = DriverManager.getConnection(jdbc, username, password); - listMoonMissionsStmt = connection.prepareStatement("select * from moon_mission"); - getMoonMissionByIdStmt = connection.prepareStatement("select * from moon_mission where mission_id = ?"); - missionCountByYearStmt = connection.prepareStatement("select count(*) as mission_count from moon_mission where year(launch_date) = ?"); - } catch (SQLException e) { - throw new RuntimeException(e); - } + public MoonMissionRepositoryImpl(DataSource dataSource) { + this.dataSource = dataSource; } + @Override public List listMoonMissions() { + String sql = "select * from moon_mission"; List moonMissions = new ArrayList<>(); try { - ResultSet rs = listMoonMissionsStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + + ResultSet rs = ps.executeQuery(); while (rs.next()) { moonMissions.add(rs.getString("spacecraft")); } @@ -38,9 +34,12 @@ public List listMoonMissions() { @Override public List getMoonMissionById(String id) { List moonMissions = new ArrayList<>(); + String sql = "select * from moon_mission where mission_id = ?"; try { - getMoonMissionByIdStmt.setString(1,id); - ResultSet rs = getMoonMissionByIdStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1,id); + ResultSet rs = ps.executeQuery(); while (rs.next()) { MoonMission m = new MoonMission( rs.getInt("mission_id"), @@ -62,9 +61,12 @@ public List getMoonMissionById(String id) { @Override public int missionsCountByYear(int year) { int count= 0; + String sql = "select count(*) as mission_count from moon_mission where year(launch_date) = ?"; try { - missionCountByYearStmt.setInt(1, year); - ResultSet rs = missionCountByYearStmt.executeQuery(); + connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ps.setInt(1, year); + ResultSet rs = ps.executeQuery(); while (rs.next()) { count = rs.getInt("mission_count"); } diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java new file mode 100644 index 0000000..0eab497 --- /dev/null +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -0,0 +1,76 @@ +package com.example; + +import javax.sql.DataSource; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +public class SimpleDriverManagerDataSource implements DataSource { + + private final String url; + private final String username; + private final String password; + + + public SimpleDriverManagerDataSource(String url, String username, String password) { + this.url = url; + this.username = username; + this.password = password; + } + + @Override + public Connection getConnection() { + try { + return DriverManager.getConnection(url, username, password); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public Connection getConnection(String username, String password) { + try { + return DriverManager.getConnection(url, username, password); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + @Override + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + + } + + @Override + public int getLoginTimeout() throws SQLException { + return 0; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } +} From c448954c65507658258852435b574d373f4be706 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Fri, 5 Dec 2025 10:57:41 +0100 Subject: [PATCH 6/7] Removed while-loop for login-validation and menu choice. Now all tests pass without the previous exception caused by scanner problems. --- mvnw | 0 src/main/java/com/example/Main.java | 58 +++++++++++----------- src/main/java/com/example/MoonMission.java | 13 ++--- 3 files changed, 34 insertions(+), 37 deletions(-) mode change 100644 => 100755 mvnw diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index bf2ea64..fdb8d19 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -2,6 +2,7 @@ import javax.sql.DataSource; import java.util.Arrays; +import java.util.List; import java.util.Optional; import java.util.Scanner; @@ -34,16 +35,9 @@ public void run() { Scanner scanner = new Scanner(System.in); - Optional currentUser = login(accountRepo, scanner); - - while (currentUser.isEmpty()) { - currentUser = login(accountRepo, scanner); - } - - boolean running = true; + if (validateLogin(accountRepo, scanner)) return; - while (running) { - showMenu(); + showMenu(); String choice = scanner.nextLine(); if (!choice.isEmpty()) { switch (choice) { @@ -53,21 +47,33 @@ public void run() { case "4" -> createAccount(scanner, accountRepo); case "5" -> updatePasswordById(scanner, accountRepo); case "6" -> deleteAccountById(scanner, accountRepo); - case "0" -> { - System.out.println("Exiting..."); - running = false; - } + case "0" -> System.out.println("Exiting..."); default -> System.out.println("Invalid choice."); } } else { System.out.println("Choice cannot be empty."); } - } - scanner.close(); } + private boolean validateLogin(AccountRepository accountRepo, Scanner scanner) { + Optional currentUser = login(accountRepo, scanner); + + while (currentUser.isEmpty()) { + System.out.println("Enter 0 to exit or 1 to try again."); + String answer = scanner.nextLine().trim(); + if (answer.equals("0")) { + System.out.println("Exiting..."); + return true; + } else if (answer.equals("1")) { + currentUser = login(accountRepo, scanner); + }else + System.out.println("Invalid choice."); + } + return false; + } + private Optional login(AccountRepository accountRepo, Scanner sc) { System.out.println("Username: "); String user = sc.nextLine().trim(); @@ -79,19 +85,11 @@ private Optional login(AccountRepository accountRepo, Scanner sc) { } Optional maybeAccount = accountRepo.findByUsername(user); - if (maybeAccount.isPresent()) { - Account account = maybeAccount.get(); - if (account.getPassword().equals(pass)) { - return Optional.of(account); - } else { - System.out.println("Invalid username or password."); - return Optional.empty(); - } - } else { + if(maybeAccount.isEmpty() || !pass.equals(maybeAccount.get().getPassword())) { System.out.println("Invalid username or password."); return Optional.empty(); } - + return maybeAccount; } private static void deleteAccountById(Scanner sc, AccountRepository accountRepo) { @@ -121,7 +119,7 @@ private static void updatePasswordById(Scanner sc, AccountRepository accountRepo private static void createAccount(Scanner sc, AccountRepository accountRepo) { String name, firstName, lastName, password, ssn; - System.out.println("Type in you username: "); + System.out.println("Type in your username: "); name = sc.nextLine().trim(); System.out.println("Type in your first name: "); firstName = sc.nextLine().trim(); @@ -142,13 +140,17 @@ private static void createAccount(Scanner sc, AccountRepository accountRepo) { private static void countMissionsForYear(Scanner sc, MoonMissionRepository moonMissionRepo) { System.out.println("Enter a year for which you want number of missions listed: "); int year = Integer.parseInt(sc.nextLine().trim()); - System.out.println("In " + year + "there were " + moonMissionRepo.missionsCountByYear(year) + "missions."); + System.out.println("In " + year + " there were " + moonMissionRepo.missionsCountByYear(year) + " missions."); } private static void getMissionById(Scanner sc, MoonMissionRepository moonMissionRepo) { System.out.println("Provide a mission_id to get information: "); String id = sc.nextLine().trim(); - System.out.println(moonMissionRepo.getMoonMissionById(id).toString()); + List missions = moonMissionRepo.getMoonMissionById(id); + if(missions.isEmpty()) + System.out.println("Mission not found."); + else + System.out.println(missions); } private static void showMissions(MoonMissionRepository moonMissionRepo) { diff --git a/src/main/java/com/example/MoonMission.java b/src/main/java/com/example/MoonMission.java index 1fec033..6e6596f 100644 --- a/src/main/java/com/example/MoonMission.java +++ b/src/main/java/com/example/MoonMission.java @@ -75,14 +75,9 @@ public void setLaunch_date(Date launch_date) { @Override public String toString() { - return "MoonMission{" + - "mission_id='" + mission_id + '\'' + - ", spacecraft='" + spacecraft + '\'' + - ", carrier_rocket='" + carrier_rocket + '\'' + - ", operator='" + operator + '\'' + - ", mission_type='" + mission_type + '\'' + - ", outcome='" + outcome + '\'' + - ", launch_date=" + launch_date + - '}'; + return String.format( + "ID: %s | Spacecraft: %s | Rocket: %s | Operator: %s | Type: %s | Outcome: %s | Launch date: %s", + mission_id, spacecraft, carrier_rocket, operator, mission_type, outcome, launch_date + ); } } From 93c293701e44ef9a7a29a0d29572ecb9def10bd0 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Fri, 5 Dec 2025 11:04:34 +0100 Subject: [PATCH 7/7] Added SLF4J dependency in pom.xml --- pom.xml | 5 +++++ src/main/java/com/example/Main.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 640a103..5a38a0f 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,11 @@ ${mockito.version} test + + org.slf4j + slf4j-nop + 2.0.17 + org.testcontainers junit-jupiter diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index fdb8d19..4b12a6f 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -54,7 +54,7 @@ public void run() { System.out.println("Choice cannot be empty."); } - scanner.close(); +// scanner.close(); } private boolean validateLogin(AccountRepository accountRepo, Scanner scanner) {