From d41dc764c4b6938a380a2a254af6bd29258616dc Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 10:43:15 +0300 Subject: [PATCH 1/9] Change FSG converter util interaction --- FSG_FILE.fsg | Bin 0 -> 86390 bytes FSG_FILE.xml | 0 XML_FILE.xml | 0 .../sf/freecol/common/io/FreeColXMLWriter.java | 1 + src/net/sf/freecol/tools/FSGConverter.java | 15 ++++++++------- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 FSG_FILE.fsg create mode 100644 FSG_FILE.xml create mode 100644 XML_FILE.xml diff --git a/FSG_FILE.fsg b/FSG_FILE.fsg new file mode 100644 index 0000000000000000000000000000000000000000..6402376973df03d1ab4490f13387512673a8b024 GIT binary patch literal 86390 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 value) */ public void writeAttribute(String attributeName, Object value) throws XMLStreamException { + logger.log(Level.WARNING, "Writing attribute:" + attributeName + ", with value of: " + String.valueOf(value)); xmlStreamWriter.writeAttribute(attributeName, String.valueOf(value)); } diff --git a/src/net/sf/freecol/tools/FSGConverter.java b/src/net/sf/freecol/tools/FSGConverter.java index 874beb264e..2a935799e5 100644 --- a/src/net/sf/freecol/tools/FSGConverter.java +++ b/src/net/sf/freecol/tools/FSGConverter.java @@ -118,9 +118,9 @@ private void convertToXML(InputStream ins, OutputStream outs) return; } in.reset(); - if (!"= 2 && args[0].endsWith("output:xml")) { - File in = new File(args[1]); + String[] actual_args = {"FSG_FILE:xml", "5c812fa4_Голландцы_1494.fsg"}; + if (actual_args.length >= 2 && actual_args[0].endsWith("output:xml")) { + File in = new File(actual_args[1]); if (!in.exists()) { printUsage(); System.exit(1); } File out; - if (args.length >= 3) { - out = new File(args[2]); + if (actual_args.length >= 3) { + out = new File(actual_args[2]); } else { String name = in.getName(); String filename = name.replaceAll("." + FreeCol.FREECOL_SAVE_EXTENSION, ".xml"); From 8a39b61533e267380542a632f3e3c7a8a7bb9609 Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 10:56:56 +0300 Subject: [PATCH 2/9] Add functionality to read from SQL source --- .../freecol/common/io/FreeColSQLReader.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/net/sf/freecol/common/io/FreeColSQLReader.java diff --git a/src/net/sf/freecol/common/io/FreeColSQLReader.java b/src/net/sf/freecol/common/io/FreeColSQLReader.java new file mode 100644 index 0000000000..a7c6370097 --- /dev/null +++ b/src/net/sf/freecol/common/io/FreeColSQLReader.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2002-2022 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see . + */ + +package net.sf.freecol.common.io; +import java.io.Closeable; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * This code creates a `FreeColSQLReader` class that connects to an + * SQLite database and is capable of executing queries. + * It maintains a connection to the SQLite file and a statement object used to + * execute the queries. The `ReadScopeType` is also included in the implementation, + * similar to the XML implementation. + */ +public class FreeColSQLReader implements Closeable { + + private static final Logger logger = Logger.getLogger(FreeColSQLReader.class.getName()); + + /** + * Enum representing the scope of the data reading. + */ + public enum ReadScopeType { + CLIENT, // Only the client-visible information + SERVER, // Full server-visible information + LOAD // Absolutely everything needed to load the game state + } + + private Connection connection; + private Statement statement; + private final ReadScopeType readScope; + + public FreeColSQLReader(String dbPath, ReadScopeType scope) throws SQLException { + this.connection = DriverManager.getConnection("jdbc:sqlite:" + dbPath); + this.statement = connection.createStatement(); + this.readScope = (scope == null) ? ReadScopeType.LOAD : scope; + } + + /** + * Executes a query and returns the result set. + * + * @param query SQL query to execute. + * @return ResultSet containing the result of the query. + * @throws SQLException If the query execution fails. + */ + public ResultSet executeQuery(String query) throws SQLException { + return statement.executeQuery(query); + } + + @Override + public void close() { + try { + if (statement != null) statement.close(); + if (connection != null) connection.close(); + } catch (SQLException e) { + logger.log(Level.WARNING, "Failed to close resources", e); + } + } +} \ No newline at end of file From 8e6625bc44cb20c889b86766b0be50faf5a86acc Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 11:01:32 +0300 Subject: [PATCH 3/9] Add functionality to write to SQL source --- .../freecol/common/io/FreeColSQLWriter.java | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/net/sf/freecol/common/io/FreeColSQLWriter.java diff --git a/src/net/sf/freecol/common/io/FreeColSQLWriter.java b/src/net/sf/freecol/common/io/FreeColSQLWriter.java new file mode 100644 index 0000000000..6918c3e19d --- /dev/null +++ b/src/net/sf/freecol/common/io/FreeColSQLWriter.java @@ -0,0 +1,133 @@ +/** + * Copyright (C) 2002-2022 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see . + */ + +package net.sf.freecol.common.io; + +import java.io.Closeable; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.Logger; + + +/** + * `FreeColSQLWriter` class to save game data into an SQLite database. + * It consists of the `saveGameData` method that saves general game data, + * player data, turn data, and tile data. Additional game components can be saved + * in a similar manner using prepared statements. The `close()` + * method ensures that the database connection is closed when done. + */ +public class FreeColSQLWriter implements Closeable { + + private static final Logger logger = Logger.getLogger(FreeColSQLWriter.class.getName()); + + /** + * Enum representing the scope of the data writing. + */ + public enum WriteScopeType { + CLIENT, // Only the client-visible information + SERVER, // Full server-visible information + SAVE // Absolutely everything needed to save the game state + }; + + private Connection connection; + private WriteScopeType writeScope; + + public FreeColSQLWriter(String dbPath, WriteScopeType scope) throws SQLException { + this.connection = DriverManager.getConnection("jdbc:sqlite:" + dbPath); + this.writeScope = (scope == null) ? WriteScopeType.SAVE : scope; + } + + /** + * Executes an SQL update statement. + * + * @param update SQL update statement to execute. + * @throws SQLException If the statement execution fails. + */ + public void executeUpdate(String update) throws SQLException { + try (PreparedStatement pstmt = connection.prepareStatement(update)) { + pstmt.executeUpdate(); + } + } + + /** + * Save game data to the SQLite database. + * + * @param game The Game object to save. + * @throws SQLException If any error occurs during saving. + */ + public void saveGameData(Game game) throws SQLException { + // Save general game data + String sqlGame = "INSERT OR REPLACE INTO game (id, options) VALUES(?, ?)"; + try (PreparedStatement pstmt = connection.prepareStatement(sqlGame)) { + pstmt.setInt(1, game.getId()); + pstmt.setString(2, game.getGameOptions().toString()); + pstmt.executeUpdate(); + } + + // Save player data + String sqlPlayer = "INSERT OR REPLACE INTO player (id, name, nation) VALUES(?, ?, ?)"; + for (Player player : game.getPlayers()) { + try (PreparedStatement pstmt = connection.prepareStatement(sqlPlayer)) { + pstmt.setInt(1, player.getId()); + pstmt.setString(2, player.getName()); + pstmt.setString(3, player.getNation().getName()); + pstmt.executeUpdate(); + } + } + + // Save turn data + String sqlTurn = "UPDATE game SET turn = ? WHERE id + // Save turn data + String sqlTurn = "UPDATE game SET turn = ? WHERE id = ?"; + try (PreparedStatement pstmt = connection.prepareStatement(sqlTurn)) { + pstmt.setInt(1, game.getTurn()); + pstmt.setInt(2, game.getId()); + pstmt.executeUpdate(); + } + + // Save tile data + String sqlTile = "INSERT OR REPLACE INTO tile (x, y, terrain_type, owner, game_id) VALUES(?, ?, ?, ?, ?)"; + for (Tile tile : game.getMap().getAllTiles()) { + try (PreparedStatement pstmt = connection.prepareStatement(sqlTile)) { + pstmt.setInt(1, tile.getX()); + pstmt.setInt(2, tile.getY()); + pstmt.setString(3, tile.getTerrainType().getName()); + pstmt.setString(4, tile.getOwner().getName()); + pstmt.setInt(5, game.getId()); + pstmt.executeUpdate(); + } + } + + // Additional game components can be saved similarly with prepared statements + } + + @Override + public void close() { + try { + if (connection != null) { + connection.close(); + } + } catch (SQLException e) { + logger.log(Level.WARNING, "Failed to close resources", e); + } + } +} \ No newline at end of file From 606b2a18b7c882261b7f5c042d3c7994fbda8112 Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 11:11:19 +0300 Subject: [PATCH 4/9] Add tests for added functionality --- .../common/io/SQLInteractionsTests.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 test/src/net/sf/freecol/common/io/SQLInteractionsTests.java diff --git a/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java b/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java new file mode 100644 index 0000000000..da15387ed5 --- /dev/null +++ b/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java @@ -0,0 +1,162 @@ +package net.sf.freecol.common.io; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SQLInteractionsTests { + + private static final String DB_PATH = "test_db.sqlite"; + + private FreeColSQLWriter writer; + private FreeColSQLReader reader; + private Connection connection; + + @BeforeEach + public void setUp() throws SQLException { + writer = new FreeColSQLWriter(DB_PATH, FreeColSQLWriter.WriteScopeType.SAVE); + reader = new FreeColSQLReader(DB_PATH, FreeColSQLReader.ReadScopeType.CLIENT); + connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); + + // Create the necessary tables for testing + connection.createStatement().execute( + "CREATE TABLE IF NOT EXISTS game (id INTEGER, options TEXT, turn INTEGER);" + ); + } + + @AfterEach + public void tearDown() throws IOException, SQLException { + writer.close(); + reader.close(); + connection.close(); + + // Remove the test database file + File dbFile = new File(DB_PATH); + if (dbFile.exists()) { + dbFile.delete(); + } + } + + @Test + public void testSaveGame() throws SQLException { + Game game = new Game(1, "options"); + game.setTurn(5); + + writer.saveGameData(game); + + ResultSet resultSet = reader.executeQuery("SELECT * FROM game WHERE id = 1"); + resultSet.next(); + + int turn = resultSet.getInt("turn"); + String options = resultSet.getString("options"); + + assertEquals(5, turn, "Turn value should be 5"); + assertEquals("options", options, "Game options should be 'options'"); + } + + @Test + public void testSavePlayer() throws SQLException { + Game game = new Game(1, "options"); + game.addPlayer(new Player(game, "player1", "nation1")); + game.addPlayer(new Player(game, "player2", "nation2")); + + writer.saveGameData(game); + + ResultSet resultSet = reader.executeQuery("SELECT * FROM player"); + int playerCount = 0; + while (resultSet.next()) { + String playerName = resultSet.getString("name"); + String nation = resultSet.getString("nation"); + + assertEquals("player" + (playerCount + 1), playerName, "Check saved player name"); + assertEquals("nation" + (playerCount + 1), nation, "Check saved player nation"); + + playerCount++; + } + + assertEquals(2, playerCount, "There should be exactly 2 players saved in the database"); + } + + @Test + public void testSaveTile() throws SQLException { + Game game = new Game(1, "options"); + + // Add some tiles to the game map + game.getMap().addTile(new Tile(1, 1, "grass", "player1")); + game.getMap().addTile(new Tile(1, 2, "forest", "player2")); + + writer.saveGameData(game); + + ResultSet resultSet = reader.executeQuery("SELECT * FROM tile"); + int tileCount = 0; + while (resultSet.next()) { + int x = resultSet.getInt("x"); + int y = resultSet.getInt("y"); + String terrainType = resultSet.getString("terrain_type"); + String owner = resultSet.getString("owner"); + + assertEquals(1, x, "Check saved tile x-coordinate"); + assertEquals(tileCount + 1, y, "Check saved tile y-coordinate"); + assertEquals("player" + (tileCount + 1), owner, "Check saved tile owner"); + + if (tileCount == 0) { + assertEquals("grass", terrainType, "First tile should be grass"); + } else { + assertEquals("forest", terrainType, "Second tile should be forest"); + } + + tileCount++; + } + + assertEquals(2, tileCount, "There should be exactly 2 tiles saved in the database"); + } + + @Test + public void testLoadGame() throws SQLException { + // Save test game data first + Game game = new Game(1, "options"); + game.setTurn(5); + writer.saveGameData(game); + + // Now load it using reader + Game loadedGame = reader.readGame(); + + assertEquals(1, loadedGame.getId(), "Loaded game ID should be 1"); + assertEquals("options", loadedGame.getGameOptions().toString(), "Loaded game options should be 'options'"); + assertEquals(5, loadedGame.getTurn(), "Loaded game turn should be 5"); + } + + @Test + public void testLoadPlayers() throws SQLException { + // Save test game data first + Game game = new Game(1, "options"); + game.addPlayer(new Player(game, "player1", "nation1")); + game.addPlayer(new Player(game, "player2", "nation2")); + writer.saveGameData(game); + + // Now load the saved game using the reader + Game loadedGame = reader.readGame(); + + assertEquals(game.getPlayers().size(), loadedGame.getPlayers().size(), "Both saved and loaded games have the same number of players"); + + for (int i = 0; i < game.getPlayers().size(); i++) { + Player originalPlayer = game.getPlayers().get(i); + Player loadedPlayer = loadedGame.getPlayers().get(i); + + assertEquals(originalPlayer.getId(), loadedPlayer.getId(), "Both saved and loaded player IDs should match"); + assertEquals(originalPlayer.getName(), loadedPlayer.getName(), "Both saved and loaded player names should match"); + assertEquals(originalPlayer.getNation().getName(), loadedPlayer.getNation().getName(), "Both saved and loaded player nations should match"); + } + } + + // You can add more tests for loading tiles and other game components similarly +} \ No newline at end of file From 9328b2296f7a2db303c3bf08db6e7836a00e646b Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 11:13:20 +0300 Subject: [PATCH 5/9] Add comments to tests --- .../src/net/sf/freecol/common/io/SQLInteractionsTests.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java b/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java index da15387ed5..75d973f778 100644 --- a/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java +++ b/test/src/net/sf/freecol/common/io/SQLInteractionsTests.java @@ -13,6 +13,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * These tests save and load various game objects like the game itself, + * players, and tiles, and then compare the saved and loaded values to + * ensure they match. Use these tests as a guide to extend + * them for any additional game components. + */ public class SQLInteractionsTests { private static final String DB_PATH = "test_db.sqlite"; From 735328a6efc7fcb916f23097ec40d47a49820017 Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 11:33:44 +0300 Subject: [PATCH 6/9] Add file in which sql table request should be --- src/net/sf/freecol/common/model/sql/generate_sql_tables.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/net/sf/freecol/common/model/sql/generate_sql_tables.sql diff --git a/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql b/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql new file mode 100644 index 0000000000..e69de29bb2 From e2800fe47bf25a1ce4a1f22c0c256969900737b3 Mon Sep 17 00:00:00 2001 From: Kocheshkov Dmitrii Date: Sat, 29 Apr 2023 11:35:34 +0300 Subject: [PATCH 7/9] Add todo for sql --- src/net/sf/freecol/common/model/sql/generate_sql_tables.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql b/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql index e69de29bb2..5e06d91324 100644 --- a/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql +++ b/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql @@ -0,0 +1 @@ +-- TODO: add sql \ No newline at end of file From 002ca77000216ea9a56ea6809f359b26b68813fe Mon Sep 17 00:00:00 2001 From: Maksim Romanov <67387151+matttax@users.noreply.github.com> Date: Sat, 29 Apr 2023 12:02:31 +0300 Subject: [PATCH 8/9] sql create script added --- .../common/model/sql/generate_sql_tables.sql | 85 ++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql b/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql index 5e06d91324..0ab2491902 100644 --- a/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql +++ b/src/net/sf/freecol/common/model/sql/generate_sql_tables.sql @@ -1 +1,84 @@ --- TODO: add sql \ No newline at end of file +-- Create game table +CREATE TABLE IF NOT EXISTS game ( + id INTEGER PRIMARY KEY, + difficulty TEXT, + mapFile TEXT, + gameOptions TEXT, + language TEXT, + turns INTEGER, + graphicalOptions TEXT, + soundOptions TEXT, + turn INTEGER +); + +-- Create player table +CREATE TABLE IF NOT EXISTS player ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + name TEXT, + color TEXT, + flag TEXT, + playerPreferences TEXT, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE +); + +-- Create native table +CREATE TABLE IF NOT EXISTS natives ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + name TEXT, + color TEXT, + type TEXT, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE +); + +-- Create faction table +CREATE TABLE IF NOT EXISTS factions ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + name TEXT, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE +); + +-- ... The existing unit, city, and tile table creation statements remain unchanged + +-- Create building table +CREATE TABLE IF NOT EXISTS building ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + city_id INTEGER, + type TEXT, + x INTEGER, + y INTEGER, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE, + FOREIGN KEY (city_id) REFERENCES city (id) ON DELETE CASCADE +); + +-- Create resource (goods) table +CREATE TABLE IF NOT EXISTS goods ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + type TEXT, + available INTEGER, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE +); + +-- Create highscore table +CREATE TABLE IF NOT EXISTS highScores ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + player_id INTEGER, + score INTEGER, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE, + FOREIGN KEY (player_id) REFERENCES player (id) ON DELETE CASCADE +); + +-- Create foundingFathers table +CREATE TABLE IF NOT EXISTS foundingFathers ( + id INTEGER PRIMARY KEY, + game_id INTEGER, + name TEXT, + bonus TEXT, + improvement TEXT, + FOREIGN KEY (game_id) REFERENCES game (id) ON DELETE CASCADE +); From 36286ed406449ad925b91b5215c44de5b792afd1 Mon Sep 17 00:00:00 2001 From: Jekoma <92033094+Jekoma@users.noreply.github.com> Date: Sat, 29 Apr 2023 12:10:00 +0300 Subject: [PATCH 9/9] Update SaveGameValidator.java --- .../sf/freecol/tools/SaveGameValidator.java | 148 +++++++++++++++--- 1 file changed, 127 insertions(+), 21 deletions(-) diff --git a/src/net/sf/freecol/tools/SaveGameValidator.java b/src/net/sf/freecol/tools/SaveGameValidator.java index e6240b78b2..eb3094b792 100644 --- a/src/net/sf/freecol/tools/SaveGameValidator.java +++ b/src/net/sf/freecol/tools/SaveGameValidator.java @@ -40,22 +40,35 @@ /** * Validate a saved game. */ +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + public class SaveGameValidator { + /** + * Main method to validate game save. + * + * @param args command line arguments containing the SQLite database file paths + * @throws Exception if there is any error during execution + */ public static void main(String[] args) throws Exception { - - SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); - File schemaLocation = new File("schema/data/data-savedGame.xsd"); - Schema schema = factory.newSchema(schemaLocation); - Validator saveGameValidator = schema.newValidator(); + // Load SQLite JDBC driver + Class.forName("org.sqlite.JDBC"); List allFiles = new ArrayList<>(); for (String name : args) { File file = new File(name); if (file.exists()) { if (file.isDirectory()) { - allFiles.addAll(FreeColDirectories.getSavegameFileList(file)); - } else if (FreeColDirectories.saveGameFilter.test(file)) { + // You need to implement getSQLiteDatabaseFileList method to list SQLite files in the directory + allFiles.addAll(getSQLiteDatabaseFileList(file)); + } else { + // You can use any custom file filter, if required allFiles.add(file); } } @@ -63,25 +76,118 @@ public static void main(String[] args) throws Exception { int ret = 0; for (File file : allFiles) { - //System.out.println("Processing file " + file.getPath()); - try { - FreeColSavegameFile mapFile = new FreeColSavegameFile(file); - try (InputStream in = mapFile.getSavegameInputStream()) { - saveGameValidator.validate(new StreamSource(in)); - } + System.out.println("Processing file " + file.getPath()); + try (Connection connection = DriverManager.getConnection("jdbc:sqlite:" + file.getPath())) { + ret = validateSaveGame(connection) ? 0 : Math.max(ret, 1); System.out.println("Successfully validated " + file.getName()); - } catch (SAXParseException e) { - System.out.println(e.getMessage() - + " at line=" + e.getLineNumber() - + " column=" + e.getColumnNumber()); - ret = Math.max(ret, 1); - } catch (IOException | SAXException e) { - System.out.println("Failed to read " + file.getName()); + } catch (Exception e) { + System.out.println("Failed to read or validate " + file.getName()); ret = 2; } } System.exit(ret); } -} + /** + * Validates game save based on the SQLite database file. + * + * @param connection SQLite database connection + * @return true if the game save is valid, false otherwise + * @throws Exception if any error occurs during validation + */ + private static boolean validateSaveGame(Connection connection) throws Exception { + Statement stmt = connection.createStatement(); + ResultSet rs; + + // Validate game table + rs = stmt.executeQuery("SELECT * FROM game"); + if (!rs.next()) { + System.out.println("No game data found in the 'game' table"); + return false; + } + rs.close(); + + // Validate player table + rs = stmt.executeQuery("SELECT * FROM player"); + if (!rs.next()) { + System.out.println("No player data found in the 'player' table"); + return false; + } + rs.close(); + + + // Validate natives table + rs = stmt.executeQuery("SELECT * FROM natives"); + if (!rs.next()) { + System.out.println("No native data found in the 'natives' table"); + return false; + } + rs.close(); + + // Validate factions table + rs = stmt.executeQuery("SELECT * FROM factions"); + if (!rs.next()) { + System.out.println("No faction data found in the 'factions' table"); + return false; + } + rs.close(); + + // Validate building table + rs = stmt.executeQuery("SELECT * FROM building"); + if (!rs.next()) { + System.out.println("No building data found in the 'building' table"); + return false; + } + rs.close(); + // Validate goods table + rs = stmt.executeQuery("SELECT * FROM goods"); + if (!rs.next()) { + System.out.println("No goods data found in the 'goods' table"); + return false; + } + rs.close(); + + // Validate highScores table + rs = stmt.executeQuery("SELECT * FROM highScores"); + if (!rs.next()) { + System.out.println("No highScores data found in the 'highScores' table"); + return false; + } + rs.close(); + + // Validate foundingFathers table + rs = stmt.executeQuery("SELECT * FROM foundingFathers"); + if (!rs.next()) { + System.out.println("No foundingFathers data found in the 'foundingFathers' table"); + return false; + } + rs.close(); + + stmt.close(); + + // All validations passed + return true; + } + + /** + * Gets a list of SQLite database files in the given directory. + * + * @param directory Directory containing the SQLite database files + * @return a List of SQLite database files + */ + private static List getSQLiteDatabaseFileList(File directory) { + List sqliteFiles = new ArrayList<>(); + File[] files = directory.listFiles(); + + if (files != null) { + for (File file : files) { + if (file.isFile() && file.getName().toLowerCase().endsWith(".sqlite")) { + sqliteFiles.add(file); + } + } + } + + return sqliteFiles; + } +}