diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 331e3cf..ec06eed 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -19,13 +19,13 @@ jobs: java-version: 21 distribution: 'temurin' # Alternative distribution options are available. - name: Cache SonarCloud packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - name: Cache Maven packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} diff --git a/pom.xml b/pom.xml index 8713c49..1b0470c 100644 --- a/pom.xml +++ b/pom.xml @@ -130,13 +130,6 @@ - - org.xerial - sqlite-jdbc - 3.43.2.2 - compile - - org.bstats bstats-bukkit @@ -153,8 +146,8 @@ net.guizhanss - guizhanlib-all - 2.0.0-SNAPSHOT + GuizhanLib-api + 1.8.1 compile diff --git a/src/main/java/net/guizhanss/gcereborn/GeneticChickengineering.java b/src/main/java/net/guizhanss/gcereborn/GeneticChickengineering.java index bbc1632..abe4532 100644 --- a/src/main/java/net/guizhanss/gcereborn/GeneticChickengineering.java +++ b/src/main/java/net/guizhanss/gcereborn/GeneticChickengineering.java @@ -16,10 +16,8 @@ import net.guizhanss.gcereborn.core.commands.GCECommand; import net.guizhanss.gcereborn.core.services.ConfigurationService; -import net.guizhanss.gcereborn.core.services.DatabaseService; import net.guizhanss.gcereborn.core.services.IntegrationService; import net.guizhanss.gcereborn.core.services.LocalizationService; -import net.guizhanss.gcereborn.listeners.WorldSavedListener; import net.guizhanss.gcereborn.setup.Items; import net.guizhanss.gcereborn.setup.Researches; import net.guizhanss.guizhanlib.slimefun.addon.AbstractAddon; @@ -33,7 +31,6 @@ public class GeneticChickengineering extends AbstractAddon { private ConfigurationService configService; private LocalizationService localization; - private DatabaseService dbService; private IntegrationService integrationService; private boolean debugEnabled = false; @@ -51,11 +48,6 @@ public static LocalizationService getLocalization() { return inst().localization; } - @Nonnull - public static DatabaseService getDatabaseService() { - return inst().dbService; - } - @Nonnull public static IntegrationService getIntegrationService() { return inst().integrationService; @@ -105,14 +97,6 @@ public void enable() { return; } - // database - log(Level.INFO, localization.getString("console.load.database")); - dbService = new DatabaseService(this); - if (!dbService.isConnected()) { - getServer().getPluginManager().disablePlugin(this); - return; - } - // items log(Level.INFO, localization.getString("console.load.items")); Items.setup(this); @@ -122,7 +106,6 @@ public void enable() { Researches.setup(); // listeners - new WorldSavedListener(this); // commands if (configService.isCommandsEnabled()) { @@ -140,17 +123,11 @@ public void enable() { // metrics setupMetrics(); - - // run cleanup once after startup - getScheduler().run(() -> dbService.cleanup()); } @Override public void disable() { - if (dbService != null) { - dbService.cleanup(); - dbService.shutdown(); - } + // do nothing } private void setupMetrics() { diff --git a/src/main/java/net/guizhanss/gcereborn/core/services/DatabaseService.java b/src/main/java/net/guizhanss/gcereborn/core/services/DatabaseService.java deleted file mode 100644 index 155379f..0000000 --- a/src/main/java/net/guizhanss/gcereborn/core/services/DatabaseService.java +++ /dev/null @@ -1,241 +0,0 @@ -package net.guizhanss.gcereborn.core.services; - -import java.io.File; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.logging.Level; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -import com.google.common.base.Preconditions; - -import org.bukkit.World; -import org.bukkit.entity.Entity; - -import io.github.thebusybiscuit.slimefun4.libraries.dough.data.persistent.PersistentDataAPI; - -import net.guizhanss.gcereborn.GeneticChickengineering; -import net.guizhanss.gcereborn.utils.Keys; - -@SuppressWarnings("ConstantConditions") -@Deprecated(forRemoval = true) -public final class DatabaseService { - - private static final String DB_NAME = "GCE.db"; - - private final String dbPath; - - private Connection conn; - private boolean hasChanges = false; - private Map cache; - - public DatabaseService(GeneticChickengineering plugin) { - dbPath = plugin.getDataFolder().getPath() + File.separator + DB_NAME; - - connect(); - - if (isConnected()) { - GeneticChickengineering.log(Level.INFO, GeneticChickengineering.getLocalization().getString("console.database.connected")); - createTables(); - } - } - - public boolean isConnected() { - return conn != null; - } - - public boolean checkConnection() { - if (!isConnected()) { - GeneticChickengineering.log(Level.SEVERE, GeneticChickengineering.getLocalization().getString("console.database.not-connected")); - return false; - } else { - return true; - } - } - - @Nonnull - public Map getAllChickens() { - if (!hasChanges && cache != null) { - return cache; - } - - checkConnection(); - Map chickens = new HashMap<>(); - try { - String sql = "SELECT uuid, dna FROM entities;"; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql); - while (rs.next()) { - chickens.put(rs.getString("uuid"), rs.getString("dna")); - } - hasChanges = false; - cache = chickens; - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - return chickens; - } - - public boolean hasChicken(@Nonnull String uuid) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - - return getAllChickens().containsKey(uuid); - } - - public boolean hasChicken(@Nonnull UUID uuid) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - - return hasChicken(uuid.toString()); - } - - /** - * Get the chicken DNA. - * Make sure you have called {@link #hasChicken(String)} to check if chicken exists first. - * - * @param uuid The uuid of the chicken. - * @return The chicken DNA. - */ - @Nullable - public String getChickenDNA(@Nonnull String uuid) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - - return getAllChickens().get(uuid); - } - - public String getChickenDNA(@Nonnull UUID uuid) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - - return getChickenDNA(uuid.toString()); - } - - @ParametersAreNonnullByDefault - public void addChicken(String uuid, String dna) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - Preconditions.checkArgument(dna != null, "dna cannot be null"); - - checkConnection(); - String sql = "INSERT INTO entities (uuid, dna) VALUES (?, ?);"; - try (var stmt = conn.prepareStatement(sql)) { - stmt.setString(1, uuid); - stmt.setString(2, dna); - stmt.executeUpdate(); - hasChanges = true; - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - } - - public void removeChicken(@Nonnull String uuid) { - Preconditions.checkArgument(uuid != null, "uuid cannot be null"); - - checkConnection(); - String sql = "DELETE FROM entities WHERE uuid = ?;"; - try (var stmt = conn.prepareStatement(sql)) { - stmt.setString(1, uuid); - stmt.executeUpdate(); - hasChanges = true; - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - } - - - /** - * Clean up the database, remove the records of chickens that no longer exist. - */ - public void cleanup() { - var chickens = getAllChickens(); - if (chickens.isEmpty()) { - return; - } - List worlds = GeneticChickengineering.getInstance().getServer().getWorlds(); - - List found = new ArrayList<>(); - for (World world : worlds) { - for (var entry : chickens.entrySet()) { - String uuid = entry.getKey(); - if (found.contains(uuid)) { - continue; - } - Entity chick = world.getEntity(UUID.fromString(uuid)); - if (chick != null) { - found.add(uuid); - PersistentDataAPI.setString(chick, Keys.CHICKEN_DNA, entry.getValue()); - } - } - } - int validCount = 0; - int invalidCount = 0; - - for (var entry : chickens.entrySet()) { - String uuid = entry.getKey(); - removeChicken(uuid); - if (found.contains(uuid)) { - validCount++; - } else { - invalidCount++; - } - } - commit(); - if (invalidCount > 0) { - GeneticChickengineering.log(Level.INFO, "Migrated {0} valid records and removed {1} invalid records from the database.", validCount, invalidCount); - } - } - - public void shutdown() { - checkConnection(); - try { - commit(); - conn.close(); - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - } - - private void connect() { - try { - String url = "jdbc:sqlite:" + dbPath; - conn = DriverManager.getConnection(url); - conn.setAutoCommit(false); - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.connect-fail")); - } - } - - private void createTables() { - try { - String sql = "CREATE TABLE IF NOT EXISTS entities (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "uuid TEXT NOT NULL," + "dna TEXT NOT NULL);"; - execSql(sql); - commit(); - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - } - - private void execSql(@Nonnull String sql) throws SQLException { - if (!checkConnection()) return; - GeneticChickengineering.debug("Prepare execute sql entry: {0}", sql); - - try (var stmt = conn.createStatement()) { - stmt.execute(sql); - } - } - - private void commit() { - try { - conn.commit(); - } catch (SQLException ex) { - GeneticChickengineering.log(Level.SEVERE, ex, GeneticChickengineering.getLocalization().getString("console.database.exception")); - } - } -} diff --git a/src/main/java/net/guizhanss/gcereborn/listeners/WorldSavedListener.java b/src/main/java/net/guizhanss/gcereborn/listeners/WorldSavedListener.java deleted file mode 100644 index d86c12d..0000000 --- a/src/main/java/net/guizhanss/gcereborn/listeners/WorldSavedListener.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.guizhanss.gcereborn.listeners; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.WorldSaveEvent; - -import net.guizhanss.gcereborn.GeneticChickengineering; - -public class WorldSavedListener implements Listener { - - public WorldSavedListener(GeneticChickengineering plugin) { - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @EventHandler - public void onWorldSave(WorldSaveEvent e) { - GeneticChickengineering.getDatabaseService().cleanup(); - } -} diff --git a/src/main/java/net/guizhanss/gcereborn/utils/ChickenUtils.java b/src/main/java/net/guizhanss/gcereborn/utils/ChickenUtils.java index cbbaaf4..ec5a4c7 100644 --- a/src/main/java/net/guizhanss/gcereborn/utils/ChickenUtils.java +++ b/src/main/java/net/guizhanss/gcereborn/utils/ChickenUtils.java @@ -90,7 +90,6 @@ public static ItemStack capture(@Nonnull Chicken chicken) { GeneticChickengineering.getIntegrationService().captureChicken(chicken); JsonObject json = PocketChicken.ADAPTER.saveData(chicken); ItemStack item = GCEItems.POCKET_CHICKEN.clone(); - var db = GeneticChickengineering.getDatabaseService(); DNA dna; String uuid = chicken.getUniqueId().toString(); @@ -99,16 +98,6 @@ public static ItemStack capture(@Nonnull Chicken chicken) { String dnaStr = PersistentDataAPI.getString(chicken, Keys.CHICKEN_DNA); GeneticChickengineering.debug("captured chicken has data in pdc: {0}", dnaStr); dna = new DNA(dnaStr); - } else if (chicken.hasMetadata(Keys.METADATA)) { - String dnaStr = chicken.getMetadata(Keys.METADATA).get(0).asString(); - GeneticChickengineering.debug("captured chicken has meta data: {0}", dnaStr); - dna = new DNA(dnaStr); - db.removeChicken(uuid); - } else if (db.hasChicken(uuid)) { - // Checked if the UUID existed first, so null won't be returned - String dnaStr = db.getChickenDNA(uuid); - GeneticChickengineering.debug("captured chicken in database: {0}", dnaStr); - dna = new DNA(dnaStr); } else { GeneticChickengineering.debug("captured chicken has no DNA information"); dna = new DNA();