diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java index c05347b..c89ff8a 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java @@ -21,7 +21,7 @@ public class Factory { } public void setTournament(Tournament tournament) { - this.tournamentDecorator = tournamentDecorator; + this.tournamentDecorator.setTournament(tournament); } public BorderPane loadMainWindow(){ @@ -36,6 +36,7 @@ public class Factory { } public void loadTournamentList(BorderPane pane, FactoryDecorator factoryDecorator){ + tournamentDecorator.setTournament(null); TournamentListController controller = (TournamentListController) setCenterOfBorderPane(pane, getClass().getResource("tournamentList/tournamentList.fxml"), factoryDecorator); } @@ -45,6 +46,14 @@ public class Factory { setCenterOfBorderPane(pane, getClass().getResource("participantAddFormular/participantFormular.fxml"), factoryDecorator); } + public void loadPlacesFormular(BorderPane pane, FactoryDecorator factoryDecorator) { + setCenterOfBorderPane(pane, getClass().getResource("placesAddFormular/PlacesFormular.fxml"), factoryDecorator); + } + + public void loadGameScheduler(BorderPane pane, FactoryDecorator factoryDecorator) { + setCenterOfBorderPane(pane, getClass().getResource("gameScheduleView/GameSchedule.fxml"), factoryDecorator); + } + private FXController setCenterOfBorderPane(BorderPane pane, URL location, FactoryDecorator factoryDecorator) { FXController controller = null; try { diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java index 6278f10..9364f64 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java @@ -44,7 +44,7 @@ public class FactoryDecorator implements IsObservable{ public void openTournament(FileIO.TournamentFile tournamentFile){ try { factory.setTournament(fileIO.loadTournament(tournamentFile)); - factory.loadParticipantFormular((BorderPane) pane, this); //TODO load TournamentView instead of ParticipantFormular? + factory.loadGameScheduler((BorderPane) pane, this); informListener(); } catch (IOException e) { e.printStackTrace(); @@ -53,6 +53,13 @@ public class FactoryDecorator implements IsObservable{ } //TODO handle and logging } + public void openParticipantFormular() { + factory.loadParticipantFormular((BorderPane) pane, this); + } + + public void openPlacesFormular() { + factory.loadPlacesFormular((BorderPane) pane, this); + } public void informListener() { for(IsObserver observer : listener) { diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java index 98b6d8b..f708a77 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FileIO.java @@ -107,7 +107,7 @@ public class FileIO { ObjectOutputStream out = null; try { - newSave.createNewFile(); + boolean newFile = newSave.createNewFile(); out = new ObjectOutputStream(new FileOutputStream(newSave)); out.writeObject(tournament); System.out.println("Save File" + tournament.getName() + ".txt being saved to " + saves.getAbsolutePath()); diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java index bab3390..3df9735 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Game.java @@ -1,6 +1,8 @@ package ch.zhaw.projekt2.turnierverwaltung; -public class Game { +import java.io.Serializable; + +public class Game implements Serializable { private Participant participant1, Participant2; private int points1, points2; private Location location; diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java new file mode 100644 index 0000000..d3be2ec --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/InvalidNameException.java @@ -0,0 +1,12 @@ +package ch.zhaw.projekt2.turnierverwaltung; + +public class InvalidNameException extends Exception { + public InvalidNameException() { + super(); + } + + public InvalidNameException(String errorMessage) { + super(errorMessage); + } + +} \ No newline at end of file diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java index e48f3a1..6f85290 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Participant.java @@ -1,6 +1,9 @@ package ch.zhaw.projekt2.turnierverwaltung; -public interface Participant { +import java.io.Serializable; + +public interface Participant extends Serializable { String getName(); void setName(String name); + boolean equals(Participant participant); } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java index 1165e7d..9cf624f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Person.java @@ -1,11 +1,23 @@ package ch.zhaw.projekt2.turnierverwaltung; -public class Person { +import java.io.Serializable; + +public class Person implements Serializable { + private final String NAME_MATCHING_REGEX = "[a-zA-Z]{1,20}"; + private final String PHONE_MATCHING_REGEX = "[\\+0-9]+"; + private String name; private String firstName; private String phoneNumber; - public Person(String firstName, String name, String phoneNumber){ + public Person(String firstName, String name, String phoneNumber) throws InvalidNameException, InvalidPhoneNumberException { + if(!firstName.matches(NAME_MATCHING_REGEX)){ + throw new InvalidNameException("The First name is Invalid."); + } else if(!name.matches(NAME_MATCHING_REGEX)){ + throw new InvalidNameException("The Last name is Invalid"); + } else if(!phoneNumber.matches(PHONE_MATCHING_REGEX)){ + throw new InvalidPhoneNumberException("The entered Phone Number is invalid."); + } setFirstName(firstName); setName(name); setPhoneNumber(phoneNumber); @@ -34,4 +46,21 @@ public class Person { public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } + + public class InvalidPhoneNumberException extends Exception { + public InvalidPhoneNumberException() { + super(); + } + + public InvalidPhoneNumberException(String errorMessage) { + super(errorMessage); + } + + } + + @Override + public String toString(){ + return firstName + " " + name; + } + } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java index 4273fd1..e1573a9 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Player.java @@ -1,21 +1,27 @@ package ch.zhaw.projekt2.turnierverwaltung; -import java.util.Date; +import java.util.GregorianCalendar; public class Player extends Person implements Participant{ - private Date dateOfBirth; + private GregorianCalendar dateOfBirth; - public Player(String firstName, String name, String phoneNumber, Date dateOfBirth){ + public Player(String firstName, String name, String phoneNumber, String dateOfBirth) throws InvalidNameException, InvalidPhoneNumberException { super(firstName, name, phoneNumber); setDateOfBirth(dateOfBirth); } - public Date getDateOfBirth() { + public GregorianCalendar getDateOfBirth() { return dateOfBirth; } - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; + public void setDateOfBirth(String dateOfBirth) { + String[] date = dateOfBirth.split("\\."); + this.dateOfBirth = new GregorianCalendar(Integer.valueOf(date[2]), Integer.valueOf(date[1]), Integer.valueOf(date[0])); + } + + @Override + public boolean equals(Participant participant) { + return getClass().equals(participant.getClass()) && toString().toLowerCase().equals(participant.toString().toLowerCase()); } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java index 880cc13..e815a16 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Team.java @@ -27,6 +27,11 @@ public class Team implements Participant { this.name = name; } + @Override + public boolean equals(Participant participant) { + return getClass().equals(participant.getClass()) && toString().toLowerCase().equals(participant.toString().toLowerCase()); + } + public Person getContactPerson() { return contactPerson; } @@ -34,4 +39,9 @@ public class Team implements Participant { public void setContactPerson(Person contactPerson) { this.contactPerson = contactPerson; } + + @Override + public String toString(){ + return name; + } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java index e46f505..d684b1f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Tournament.java @@ -3,24 +3,50 @@ package ch.zhaw.projekt2.turnierverwaltung; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import java.io.File; import java.io.Serializable; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class Tournament implements Serializable { private String name; private Type type; + private List participants; public Tournament(String name, Type type) throws InvalidNameException, InvalidTypeException { if(!name.matches("[\\w]{1,20}")){ - throw new Tournament.InvalidNameException("Invalid Name entered"); //TODO handle en logging. + throw new InvalidNameException("Invalid Name entered"); //TODO handle en logging. } else if(!Arrays.asList(Type.values()).contains(type)){ throw new InvalidTypeException("Invalid Type selected"); //TODO handle en logging. } setName(name); setType(type); + participants = new ArrayList<>(); + } + + public void addParticipant(Participant newParticipant) throws ParticipantExistsException { + for(Participant participant : participants){ + if(participant.equals(newParticipant)){ + throw new ParticipantExistsException("A Participant with the same Name exists already."); + } + } + participants.add(newParticipant); + } + + public void removeParticipant(Participant participant) throws ParticipantNotExistsException { + if(!participants.contains(participant)){ + throw new ParticipantNotExistsException("The given Participant is not part of this Tournament"); + } + } + + public ObservableList getParticipants() { + ObservableList participantsObservable = FXCollections.observableArrayList(); + participantsObservable.addAll(participants); + return participantsObservable; } public String getName() { @@ -60,17 +86,6 @@ public class Tournament implements Serializable { } } - public class InvalidNameException extends Exception { - public InvalidNameException() { - super(); - } - - public InvalidNameException(String errorMessage) { - super(errorMessage); - } - - } - public class InvalidTypeException extends Exception { public InvalidTypeException() { super(); @@ -82,5 +97,27 @@ public class Tournament implements Serializable { } + public class ParticipantExistsException extends Exception { + public ParticipantExistsException() { + super(); + } + + public ParticipantExistsException(String errorMessage) { + super(errorMessage); + } + + } + + public class ParticipantNotExistsException extends Exception { + public ParticipantNotExistsException() { + super(); + } + + public ParticipantNotExistsException(String errorMessage) { + super(errorMessage); + } + + } + } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java index a848a4a..47708ca 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/TournamentDecorator.java @@ -2,6 +2,7 @@ package ch.zhaw.projekt2.turnierverwaltung; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class TournamentDecorator implements IsObservable{ @@ -9,9 +10,16 @@ public class TournamentDecorator implements IsObservable{ private FileIO fileIO; private List listener = new ArrayList<>(); - public TournamentDecorator(FileIO fileIO, Tournament tournament){ - setTournament(tournament); + public TournamentDecorator(FileIO fileIO){ setFileIO(fileIO); + addListener(new IsObserver() { + @Override + public void update() { + if(tournament != null){ + saveTournament(); + } + } + }); } public void setFileIO(FileIO fileIO) { @@ -22,6 +30,10 @@ public class TournamentDecorator implements IsObservable{ this.tournament = tournament; } + public Tournament getTournament() { + return tournament; + } + @Override public void addListener(IsObserver observer) { listener.add(observer); @@ -32,6 +44,14 @@ public class TournamentDecorator implements IsObservable{ listener.remove(observer); } + public void saveTournament(){ + try { + fileIO.saveTournament(tournament); + } catch (IOException e) { + e.printStackTrace(); //TODO handle and logging + } + } + public void createTournament(String name, Tournament.Type type){ if(fileIO.tournamentExists(name)){ System.out.println("Tournament with same name exists already."); @@ -41,7 +61,7 @@ public class TournamentDecorator implements IsObservable{ Tournament tournament = new Tournament(name, type); fileIO.saveTournament(tournament); informListener(); - } catch (Tournament.InvalidNameException e) { + } catch (InvalidNameException e) { e.printStackTrace(); //TODO handle and logging } catch (Tournament.InvalidTypeException e) { e.printStackTrace(); //TODO handle and logging @@ -59,6 +79,18 @@ public class TournamentDecorator implements IsObservable{ } } + public void addPlayer(String firstName, String name, String phoneNumber, String dateOfBirth){ + try { + tournament.addParticipant(new Player(firstName, name, phoneNumber, dateOfBirth)); + informListener(); + } catch (Tournament.ParticipantExistsException e) { + e.printStackTrace(); //TODO handle and logging + } catch (InvalidNameException e) { + e.printStackTrace(); //TODO handle and logging + } catch (Person.InvalidPhoneNumberException e) { + e.printStackTrace(); //TODO handle and logging + } + } public void informListener() { for(IsObserver observer : listener) { diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java index 14348bd..290b1e6 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java @@ -16,7 +16,7 @@ import java.io.IOException; public class MainWindow extends Application { private FileIO fileIO = new FileIO(System.getProperty("user.dir") + "/tournierverwaltung_angrynerds"); - private TournamentDecorator tournamentDecorator = new TournamentDecorator(fileIO, null); + private TournamentDecorator tournamentDecorator = new TournamentDecorator(fileIO); private Factory factory = new Factory(fileIO, tournamentDecorator); //TODO make it private! private FactoryDecorator factoryDecorator; diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java new file mode 100644 index 0000000..836c784 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java @@ -0,0 +1,16 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.fxml.FXML; +import javafx.scene.control.ChoiceBox; + +public class GameController extends FXController { + + @FXML + private ChoiceBox placesChoiceBox; + + @Override + public void loadContent() { + + } +} diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java new file mode 100644 index 0000000..ab82179 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameScheduleController.java @@ -0,0 +1,24 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.gameScheduleView; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; + +public class GameScheduleController extends FXController { + + @FXML + void openPlacesFormular(ActionEvent event) { + getFactoryDecorator().openPlacesFormular(); + } + + @FXML + void openParticipantFormular(ActionEvent event) { + getFactoryDecorator().openParticipantFormular(); + } + + @Override + public void loadContent() { + + } +} + diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java index 08877c1..a6e2c4f 100644 --- a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/participantAddFormular/ParticipantFormularController.java @@ -1,6 +1,7 @@ package ch.zhaw.projekt2.turnierverwaltung.main.participantAddFormular; import ch.zhaw.projekt2.turnierverwaltung.FXController; +import ch.zhaw.projekt2.turnierverwaltung.Participant; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -44,7 +45,7 @@ public class ParticipantFormularController extends FXController { private Label participantListTitle; @FXML - private ListView participantListView; + private ListView participantListView; @FXML private Label participantNameLabel; @@ -63,7 +64,7 @@ public class ParticipantFormularController extends FXController { @FXML void addParticipant(ActionEvent event) { - + getTournamentDecorator().addPlayer(firstNameTextField.getText(), participantNameTextField.getText(), phoneNumberTextField.getText(), birthDateTextField.getText()); } @FXML @@ -78,6 +79,6 @@ public class ParticipantFormularController extends FXController { @Override public void loadContent() { - + participantListView.setItems(getTournamentDecorator().getTournament().getParticipants()); } } diff --git a/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java new file mode 100644 index 0000000..5edac10 --- /dev/null +++ b/app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/placesAddFormular/PlacesFormularController.java @@ -0,0 +1,66 @@ +package ch.zhaw.projekt2.turnierverwaltung.main.placesAddFormular; + +import ch.zhaw.projekt2.turnierverwaltung.FXController; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ListView; +import javafx.scene.control.TextField; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.GridPane; + +public class PlacesFormularController extends FXController { + + @FXML + private Label AddListTitle; + + @FXML + private Button closeBtn; + + @FXML + private Button deleteBtn; + + @FXML + private GridPane grid; + + @FXML + private ListView locationListView; + + @FXML + private Label locationNameLabel; + + @FXML + private TextField locationNameTextField; + + @FXML + private Label newLocationFormularTitle; + + @FXML + private Button saveBtn; + + @FXML + void changedSelection(MouseEvent event) { + + } + + @FXML + void closeFormular(ActionEvent event) { + + } + + @FXML + void deleteSelectedPlace(ActionEvent event) { + + } + + @FXML + void saveLocation(ActionEvent event) { + + } + + @Override + public void loadContent() { + + } +} diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml new file mode 100644 index 0000000..83fcb91 --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/Game.fxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml new file mode 100644 index 0000000..cd88c6a --- /dev/null +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/gameScheduleView/GameSchedule.fxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml index caa919e..0de5bb7 100644 --- a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/participantAddFormular/participantFormular.fxml @@ -4,12 +4,8 @@ - - - - @@ -17,7 +13,7 @@ - + @@ -36,7 +32,7 @@ - + + + + + diff --git a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml index 24c2e89..40bffeb 100644 --- a/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml +++ b/app/src/main/resources/ch/zhaw/projekt2/turnierverwaltung/tournamentList/tournamentList.fxml @@ -22,13 +22,19 @@ - + - + diff --git a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java b/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java index c8b8060..09eeef6 100644 --- a/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java +++ b/app/src/test/java/ch/zhaw/projekt2/turnierverwaltung/FileIOTest.java @@ -108,7 +108,7 @@ class FileIOTest { } @Test - void saveTournament() throws IOException, Tournament.InvalidNameException, Tournament.InvalidTypeException { + void saveTournament() throws IOException, InvalidNameException, Tournament.InvalidTypeException { Tournament tournament = null; tournament = new Tournament("test1", Tournament.Type.KO); io.saveTournament(tournament);