diff --git a/.gitignore b/.gitignore index 288436f5c22977bf0acbde4e6d3455f50a0ca91c..576be0e20f94edc09b5af63ff68813123d59ac64 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ .settings/ .project .classpath - +tournament.* .DS_Store diff --git a/pom.xml b/pom.xml index 2b9412c35866a10aa29d27c6cbf60fa2171344f9..7f79730283a47928c7581945c9af6a85ba1ac5a1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,5 +33,41 @@ <version>5.5.2</version> <scope>test</scope> </dependency> + <dependency> + <groupId>jakarta.xml.bind</groupId> + <artifactId>jakarta.xml.bind-api</artifactId> + <version>4.0.1</version> + </dependency> + + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + <version>4.0.4</version> + </dependency> + + <dependency> + + <groupId>org.eclipse.persistence</groupId> + <artifactId>org.eclipse.persistence.moxy</artifactId> + <version>4.0.2</version> + </dependency> + + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-xjc</artifactId> + <version>4.0.4</version> + </dependency> + + <dependency> + <groupId>jakarta.json</groupId> + <artifactId>jakarta.json-api</artifactId> + <version>2.1.3</version> + </dependency> + + <dependency> + <groupId>org.eclipse.parsson</groupId> + <artifactId>parsson</artifactId> + <version>1.1.5</version> + </dependency> </dependencies> </project> diff --git a/src/main/java/cz/jezek/lab11/Match.java b/src/main/java/cz/jezek/lab11/Match.java index 00f2851654a1d6d954cc57bb12c10c81111d72bd..a4ac3a3838d5cf7bd682d1221e31b6a65ba2cfa4 100644 --- a/src/main/java/cz/jezek/lab11/Match.java +++ b/src/main/java/cz/jezek/lab11/Match.java @@ -2,12 +2,24 @@ package cz.jezek.lab11; import java.util.Objects; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; + public class Match { + @XmlElement private Oponents oponents; + + @XmlAttribute private int player1Scorel; + + @XmlAttribute private int player2Scorel; + @SuppressWarnings("unused") + private Match() { + } + public Match(Player player1, int player1Scorel, Player player2, int player2Scorel) { this.oponents = new Oponents(player1, player2); this.player1Scorel = player1Scorel; diff --git a/src/main/java/cz/jezek/lab11/Oponents.java b/src/main/java/cz/jezek/lab11/Oponents.java index 1de0f68f0823e939f4bde09bcc3b2f4ee84697cc..1cb4432c8fb70f60c38069c319bf7e766bf37670 100644 --- a/src/main/java/cz/jezek/lab11/Oponents.java +++ b/src/main/java/cz/jezek/lab11/Oponents.java @@ -2,11 +2,23 @@ package cz.jezek.lab11; import java.util.Objects; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlIDREF; + public class Oponents { + @XmlIDREF + @XmlAttribute private Player player1; + + @XmlIDREF + @XmlAttribute private Player player2; + @SuppressWarnings("unused") + private Oponents() { + } + public Oponents(Player player1, Player player2) { super(); this.player1 = player1; diff --git a/src/main/java/cz/jezek/lab11/Player.java b/src/main/java/cz/jezek/lab11/Player.java index 2a27b1b969e9d93d8144da9ab23f330eb8d3c13b..692e220cf28854fee269ef5a517484a7e919e2c7 100644 --- a/src/main/java/cz/jezek/lab11/Player.java +++ b/src/main/java/cz/jezek/lab11/Player.java @@ -1,5 +1,8 @@ package cz.jezek.lab11; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlID; + public class Player { private String firstName; @@ -10,6 +13,10 @@ public class Player { RandomGenerator.selectRandom(RandomGenerator.SURNAMES)); } + @SuppressWarnings("unused") + private Player() { + } + public Player(String firstName, String lastName) { super(); this.firstName = firstName; @@ -31,6 +38,12 @@ public class Player { public void setLastName(String lastName) { this.lastName = lastName; } + + @XmlID + @XmlAttribute + public String getId() { + return toString(); + } @Override public int hashCode() { diff --git a/src/main/java/cz/jezek/lab11/StreamMain.java b/src/main/java/cz/jezek/lab11/StreamMain.java index ea4babca284042d2a29e402e622abee1e01f3158..836696f7d0f5d0d9277e9bb3a082412dc1713269 100644 --- a/src/main/java/cz/jezek/lab11/StreamMain.java +++ b/src/main/java/cz/jezek/lab11/StreamMain.java @@ -1,5 +1,14 @@ package cz.jezek.lab11; +import java.io.File; + +import org.eclipse.persistence.jaxb.MarshallerProperties; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.Unmarshaller; + public class StreamMain { public static void main(String[] args) { @@ -8,7 +17,19 @@ public class StreamMain { printStatAboutTournament(tournament); saveTournament(tournament); - loadTournament(); + Tournament tournament2 = loadTournament(); + System.out.println(); + System.out.println("First player from first match is between players: " + + tournament2.getPlayers().stream() + .anyMatch(p -> p == tournament2.getMatches().get(0).getOponents().getPlayer1())); + + saveTournamentJSON(tournament); + Tournament tournament3 = loadTournamentJSON(); + System.out.println(tournament3); + System.out.println("First player from first match is between players: " + + tournament3.getPlayers().stream() + .anyMatch(p -> p == tournament3.getMatches().get(0).getOponents().getPlayer1())); + } public static void printStatAboutTournament(Tournament tournament) { @@ -34,11 +55,61 @@ public class StreamMain { //TODO 4.c Show match with the largest total number (sum of both players) scored goals between relevant players (help Streams) } - public static void loadTournament() { + public static Tournament loadTournament() { //TODO 5.b Load a serialized tournament from a file + try { + JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (Tournament) unmarshaller.unmarshal(new File("tournament.xml")); + } catch (JAXBException e) { + e.printStackTrace(); + return null; + } } public static void saveTournament(Tournament tournament) { - //TODO 5.a Save the tournament to a file using object serialization. + try { + JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + System.out.println(); + System.out.println(); + marshaller.marshal(tournament, System.out); + marshaller.marshal(tournament, new File("tournament.xml")); + } catch (JAXBException e) { + e.printStackTrace(); + } + } + + public static void saveTournamentJSON(Tournament tournament) { + try { + System.setProperty("jakarta.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); + JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); + marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true); + System.out.println(); + System.out.println(); + marshaller.marshal(tournament, System.out); + marshaller.marshal(tournament, new File("tournament.json")); + } catch (JAXBException e) { + e.printStackTrace(); + } } + + public static Tournament loadTournamentJSON() { + //TODO 5.b Load a serialized tournament from a file + try { + JAXBContext jaxbContext = JAXBContext.newInstance(Tournament.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); + unmarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true); + + return (Tournament) unmarshaller.unmarshal(new File("tournament.json")); + } catch (JAXBException e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/java/cz/jezek/lab11/Tournament.java b/src/main/java/cz/jezek/lab11/Tournament.java index 708a391ecb85c160d079a6befe62d505b609f2d8..462014cc687bf419924e3d3864e56e25e93fe75a 100644 --- a/src/main/java/cz/jezek/lab11/Tournament.java +++ b/src/main/java/cz/jezek/lab11/Tournament.java @@ -9,13 +9,27 @@ import java.io.Serializable; import java.util.List; import java.util.stream.Stream; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; +import jakarta.xml.bind.annotation.XmlRootElement; + +@XmlRootElement public class Tournament implements Serializable{ private static final long serialVersionUID = 1L; + @XmlElement(name = "player") + @XmlElementWrapper(name = "players") private List<Player> players; + + @XmlElement(name = "match") + @XmlElementWrapper(name = "matches") private List<Match> matches; + @SuppressWarnings("unused") + private Tournament() { + } + public static Tournament generate() { // TO DO 1.a Generate a list of 10 random players using the stream and then filter so that it does not contain players with the same name List<Player> players = Stream.generate(Player::generateRandom) @@ -26,7 +40,7 @@ public class Tournament implements Serializable{ // TODO 1.b Use the stream to generate a list of 50 matches between random players (from the list of players) with a random result. Make sure the player does not play with himself. List<Match> matches = Stream.generate(() -> generateRandomMatch(players)) .filter(m -> m.getOponents().getPlayer1() != m.getOponents().getPlayer2()) - .limit(500) + .limit(50) .toList(); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 35757404f5d12da2642d679d3eb1b4ce681e75da..446615d0de2caa20e09400477a0356ba511cf0cc 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,4 +1,8 @@ module cz.jezek.lab10 { - opens cz.jezek.lab11 to javafx.fxml; + opens cz.jezek.lab11 to jakarta.xml.bind; exports cz.jezek.lab11; + requires jakarta.xml.bind; + requires org.eclipse.persistence.moxy; + requires jakarta.json; + requires com.sun.tools.xjc; } \ No newline at end of file