From 3f890f06d803c842d3d6448e49ac9e5f6b17f0ce Mon Sep 17 00:00:00 2001 From: Anton Micke Date: Thu, 6 Feb 2025 00:54:59 +0100 Subject: [PATCH] Add input checks for player names and duplicates. --- .../org/kickerelo/kickerelo/MainView.java | 1 + .../exception/DuplicatePlayerException.java | 7 ++++++ .../NoSuchPlayerException.java | 2 +- .../exception/PlayerNameNotSetException.java | 7 ++++++ .../kickerelo/service/KickerEloService.java | 25 ++++++++++++++++++- .../kickerelo/views/Enter1vs1View.java | 10 ++++++-- .../kickerelo/views/Enter2vs2View.java | 10 ++++++-- 7 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/kickerelo/kickerelo/exception/DuplicatePlayerException.java rename src/main/java/org/kickerelo/kickerelo/{ => exception}/NoSuchPlayerException.java (77%) create mode 100644 src/main/java/org/kickerelo/kickerelo/exception/PlayerNameNotSetException.java diff --git a/src/main/java/org/kickerelo/kickerelo/MainView.java b/src/main/java/org/kickerelo/kickerelo/MainView.java index 14fffc9..0e030f1 100644 --- a/src/main/java/org/kickerelo/kickerelo/MainView.java +++ b/src/main/java/org/kickerelo/kickerelo/MainView.java @@ -9,6 +9,7 @@ import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.IntegerField; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.router.Route; +import org.kickerelo.kickerelo.exception.NoSuchPlayerException; import org.kickerelo.kickerelo.service.KickerEloService; /** diff --git a/src/main/java/org/kickerelo/kickerelo/exception/DuplicatePlayerException.java b/src/main/java/org/kickerelo/kickerelo/exception/DuplicatePlayerException.java new file mode 100644 index 0000000..5a15e17 --- /dev/null +++ b/src/main/java/org/kickerelo/kickerelo/exception/DuplicatePlayerException.java @@ -0,0 +1,7 @@ +package org.kickerelo.kickerelo.exception; + +public class DuplicatePlayerException extends RuntimeException { + public DuplicatePlayerException(String message) { + super(message); + } +} diff --git a/src/main/java/org/kickerelo/kickerelo/NoSuchPlayerException.java b/src/main/java/org/kickerelo/kickerelo/exception/NoSuchPlayerException.java similarity index 77% rename from src/main/java/org/kickerelo/kickerelo/NoSuchPlayerException.java rename to src/main/java/org/kickerelo/kickerelo/exception/NoSuchPlayerException.java index 2fbbe3f..b2d08cd 100644 --- a/src/main/java/org/kickerelo/kickerelo/NoSuchPlayerException.java +++ b/src/main/java/org/kickerelo/kickerelo/exception/NoSuchPlayerException.java @@ -1,4 +1,4 @@ -package org.kickerelo.kickerelo; +package org.kickerelo.kickerelo.exception; public class NoSuchPlayerException extends RuntimeException { public NoSuchPlayerException(String message) { diff --git a/src/main/java/org/kickerelo/kickerelo/exception/PlayerNameNotSetException.java b/src/main/java/org/kickerelo/kickerelo/exception/PlayerNameNotSetException.java new file mode 100644 index 0000000..eda8b0b --- /dev/null +++ b/src/main/java/org/kickerelo/kickerelo/exception/PlayerNameNotSetException.java @@ -0,0 +1,7 @@ +package org.kickerelo.kickerelo.exception; + +public class PlayerNameNotSetException extends RuntimeException { + public PlayerNameNotSetException(String message) { + super(message); + } +} diff --git a/src/main/java/org/kickerelo/kickerelo/service/KickerEloService.java b/src/main/java/org/kickerelo/kickerelo/service/KickerEloService.java index 7356ff2..73931af 100644 --- a/src/main/java/org/kickerelo/kickerelo/service/KickerEloService.java +++ b/src/main/java/org/kickerelo/kickerelo/service/KickerEloService.java @@ -1,9 +1,11 @@ package org.kickerelo.kickerelo.service; -import org.kickerelo.kickerelo.NoSuchPlayerException; +import org.kickerelo.kickerelo.exception.DuplicatePlayerException; +import org.kickerelo.kickerelo.exception.NoSuchPlayerException; import org.kickerelo.kickerelo.data.Ergebnis1vs1; import org.kickerelo.kickerelo.data.Ergebnis2vs2; import org.kickerelo.kickerelo.data.Spieler; +import org.kickerelo.kickerelo.exception.PlayerNameNotSetException; import org.kickerelo.kickerelo.model.ResultInfo1vs1; import org.kickerelo.kickerelo.model.ResultInfo2vs2; import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository; @@ -31,6 +33,13 @@ public class KickerEloService { public void enterResult1vs1(String gewinnerName, String verliererName, short toreVerlierer) { + if (gewinnerName == null || verliererName == null) { + throw new PlayerNameNotSetException("Alle Namen müssen gesetzt sein"); + } + + if (gewinnerName.equals(verliererName)) { + throw new DuplicatePlayerException("winner and loser identical"); + } Spieler gewinner = spielerRepository.findByName(gewinnerName) .orElseThrow(() -> new NoSuchPlayerException(gewinnerName)); @@ -56,6 +65,20 @@ public class KickerEloService { String verliererNameVorn, String verliererNameHinten, short toreVerlierer) { + if (gewinnerNameVorn == null || gewinnerNameHinten == null + || verliererNameVorn == null || verliererNameHinten == null) { + throw new PlayerNameNotSetException("Alle Namen müssen gesetzt sein"); + } + + if (gewinnerNameVorn.equals(gewinnerNameHinten) || + gewinnerNameVorn.equals(verliererNameVorn) || + gewinnerNameVorn.equals(verliererNameHinten) || + gewinnerNameHinten.equals(verliererNameVorn) || + gewinnerNameHinten.equals(verliererNameHinten) || + verliererNameVorn.equals(verliererNameHinten)) { + throw new DuplicatePlayerException("players must not be identical"); + } + Spieler gewinnerVorn = spielerRepository.findByName(gewinnerNameVorn) .orElseThrow(() -> new NoSuchPlayerException(gewinnerNameVorn)); diff --git a/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java b/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java index cd0c690..1ecd23b 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java @@ -8,7 +8,9 @@ import com.vaadin.flow.component.notification.NotificationVariant; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.IntegerField; import com.vaadin.flow.router.Route; -import org.kickerelo.kickerelo.NoSuchPlayerException; +import org.kickerelo.kickerelo.exception.DuplicatePlayerException; +import org.kickerelo.kickerelo.exception.NoSuchPlayerException; +import org.kickerelo.kickerelo.exception.PlayerNameNotSetException; import org.kickerelo.kickerelo.service.KickerEloService; @Route(value = "enter1vs1") @@ -36,7 +38,11 @@ public class Enter1vs1View extends VerticalLayout { eloService.enterResult1vs1(winnerSelect.getValue(), loserSelect.getValue(), loserGoals.getValue().shortValue()); Notification.show("Gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS); } catch (NoSuchPlayerException err) { - Notification.show("Konnte nicht gespeichert werden").addThemeVariants(NotificationVariant.LUMO_ERROR); + Notification.show("Unbekannter Spieler").addThemeVariants(NotificationVariant.LUMO_ERROR); + } catch (DuplicatePlayerException err) { + Notification.show("Alle Spieler müssen paarweise verschieden sein").addThemeVariants(NotificationVariant.LUMO_ERROR); + } catch (PlayerNameNotSetException err) { + Notification.show("Alle Spieler müssen gesetzt sein").addThemeVariants(NotificationVariant.LUMO_ERROR); } }); diff --git a/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java index ed46440..d0521cd 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java @@ -8,7 +8,9 @@ import com.vaadin.flow.component.notification.NotificationVariant; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.IntegerField; import com.vaadin.flow.router.Route; -import org.kickerelo.kickerelo.NoSuchPlayerException; +import org.kickerelo.kickerelo.exception.DuplicatePlayerException; +import org.kickerelo.kickerelo.exception.NoSuchPlayerException; +import org.kickerelo.kickerelo.exception.PlayerNameNotSetException; import org.kickerelo.kickerelo.service.KickerEloService; @Route(value = "enter2vs2") @@ -43,7 +45,11 @@ public class Enter2vs2View extends VerticalLayout { eloService.enterResult2vs2(winnerFrontSelect.getValue(), winnerBackSelect.getValue(), loserFrontSelect.getValue(), loserBackSelect.getValue(), loserGoals.getValue().shortValue()); Notification.show("Gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS); } catch (NoSuchPlayerException err) { - Notification.show("Konnte nicht gespeichert werden").addThemeVariants(NotificationVariant.LUMO_ERROR); + Notification.show("Unbekannter Spieler").addThemeVariants(NotificationVariant.LUMO_ERROR); + } catch (DuplicatePlayerException err) { + Notification.show("Alle Spieler müssen paarweise verschieden sein").addThemeVariants(NotificationVariant.LUMO_ERROR); + } catch (PlayerNameNotSetException err) { + Notification.show("Alle Spieler müssen gesetzt sein").addThemeVariants(NotificationVariant.LUMO_ERROR); } });