diff --git a/pom.xml b/pom.xml
index 6bd5f9946ef2b3a7ffee8f8f073582471b9caa25..ee98fe986c3af6b5747e9a6936adcadf6aa36f99 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,5 +43,10 @@
<version>5.5.2</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.derby</groupId>
+ <artifactId>derby</artifactId>
+ <version>10.16.1.1</version>
+ </dependency>
</dependencies>
</project>
diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java
index 1b2763c1b5575cc672e6ac3c3b91f471f4121c94..87339a8d59ec65315c69765d22669dcca7aad7dc 100644
--- a/src/main/java/lab/GameController.java
+++ b/src/main/java/lab/GameController.java
@@ -1,10 +1,6 @@
package lab;
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.FileWriter;
import java.io.IOException;
-import java.io.PrintWriter;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
@@ -51,10 +47,13 @@ public class GameController {
private AnimationTimer animationTimer;
+ private ScoreDAO scoreDAO;
+
public GameController() {
}
public void startGame() {
+ scoreDAO = new ScoreDAO();
initScoreList();
this.world = new World(canvas.getWidth(), canvas.getHeight());
@@ -95,9 +94,14 @@ public class GameController {
private void gameOverPressed() {
Score score = new Score(new Random().nextInt(11), nameTextField.getText());
scoreList.getItems().add(score);
- Collections.sort(scoreList.getItems(), new ScoreComparator().reversed());
+ sortScores();
}
+ private void sortScores() {
+ Collections.sort(scoreList.getItems(), new ScoreComparator().reversed());
+
+ }
+
@FXML
private void highScoresPressed() {
Set<Score> tempScores = new HashSet<>();
@@ -110,24 +114,15 @@ public class GameController {
@FXML
private void savePressed() throws IOException {
- try(PrintWriter pw = new PrintWriter(new FileWriter("high_score.csv"))){
- for(Score score: highScores) {
- pw.printf("%s;%d\n", score.getName(), score.getScore());
- }
- }
+ scoreDAO.save(highScores);
}
@FXML
private void loadPressed() throws IOException{
highScores.clear();
- try(BufferedReader br = new BufferedReader(new FileReader("high_score.csv"))){
- String line;
- while(null != (line = br.readLine())) {
- String [] tokens = line.split(";");
- highScores.add(new Score(Integer.parseInt(tokens[1]), tokens[0]));
- }
- }
+ highScores.addAll(scoreDAO.load());
+ sortScores();
initScoreList();
}
diff --git a/src/main/java/lab/Score.java b/src/main/java/lab/Score.java
index e7f8bc7683790e1a4d8fef80971c33024c0dd778..0f0260d810e0d341eef46d6997477cd4f85bbfd0 100644
--- a/src/main/java/lab/Score.java
+++ b/src/main/java/lab/Score.java
@@ -5,15 +5,23 @@ import java.io.Serializable;
public class Score implements Serializable{
private static final long serialVersionUID = 712213568495641939L;
+ private Integer id;
private final int score;
+
private final String name;
- public Score(int score, String name) {
- super();
+
+ public Score(Integer id, int score, String name) {
+ this.id = id;
this.score = score;
this.name = name;
}
+ public Score(int score, String name) {
+ this(null, score, name) ;
+ }
+
+
public String getName() {
return name;
@@ -22,6 +30,14 @@ public class Score implements Serializable{
public int getScore() {
return score;
}
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
@Override
public String toString() {
diff --git a/src/main/java/lab/ScoreDAO.java b/src/main/java/lab/ScoreDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..09ddfea8629bebd0d00e37f139cde7644265da8c
--- /dev/null
+++ b/src/main/java/lab/ScoreDAO.java
@@ -0,0 +1,139 @@
+package lab;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+public class ScoreDAO {
+
+ public ScoreDAO() {
+ /*Connection conn = null;
+ try {
+ conn = getConnection();
+ } finally {
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }*/
+ try (Connection conn = getConnection()) {
+ initTable(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public List<Score> load() {
+ List<Score> result = new LinkedList<>();
+ try(Connection connection = getConnection();
+ Statement stmt = connection.createStatement()) {
+
+ try(ResultSet rs = stmt.executeQuery("SELECT id,value,name FROM score")) {
+ while (rs.next()) {
+ result.add(new Score(rs.getInt(1), rs.getInt(2), rs.getString(3)));
+ }
+
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return result ;
+ }
+
+ public void save(List<Score> scores) {
+
+ List<Score> existingRecors = load();
+
+ Set<Integer> inMemory = new HashSet<>();
+ for (Score score: scores) {
+ if (score.getId() == null) {
+ continue;
+ }
+ inMemory.add(score.getId());
+ }
+
+ Set<Integer> inDb = new HashSet<>();
+ for (Score score: existingRecors) {
+ if (score.getId() == null) {
+ continue;
+ }
+ inDb.add(score.getId());
+ }
+
+ inDb.removeAll(inMemory);
+
+ Set<Integer> idsForDelete = inDb;
+
+ delete(idsForDelete);
+
+ try(Connection conn = getConnection()){
+
+
+ try(PreparedStatement pstms = conn.prepareStatement("INSERT INTO score (value, name) VALUES (?,?)", Statement.RETURN_GENERATED_KEYS)){
+ for (Score score: scores) {
+ if (score.getId() == null) {
+ pstms.setInt(1, score.getScore());
+ pstms.setString(2, score.getName());
+ pstms.execute();
+ ResultSet rs = pstms.getGeneratedKeys();
+ if (rs.next()) {
+ score.setId(rs.getInt(1));
+ }
+ }
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void delete(Set<Integer> idsForDelete) {
+ try(Connection conn = getConnection();
+ PreparedStatement pstms = conn.prepareStatement("DELETE FROM score WHERE id = ?")){
+ for (Integer id: idsForDelete) {
+ pstms.setInt(1, id);
+ pstms.executeUpdate();
+ }
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private void initTable(Connection conn) {
+ try(Statement stmt = conn.createStatement()) {
+ stmt.execute("CREATE TABLE score ("
+ + "id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
+ + "value INT NOT NULL,"
+ + "name VARCHAR(255),"
+ + "PRIMARY KEY (id)"
+ + ")");
+ } catch (SQLException e) {
+ if (e.getSQLState().equals("X0Y32")) {
+ //ignore because table already exists
+ return;
+ }
+ e.printStackTrace();
+ }
+
+ }
+
+ private Connection getConnection() {
+ try {
+ return DriverManager.getConnection("jdbc:derby:scoreDB;create=true");
+ } catch (SQLException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 7006c78362486c4b03983ff6ea1321d95ca1ed40..94ff2e3c1f5017f07edc93063d29acfbfad56630 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,6 +1,7 @@
module lab01 {
requires transitive javafx.controls;
requires javafx.fxml;
+ requires java.sql;
opens lab to javafx.fxml;
exports lab;
}
\ No newline at end of file