Skip to content

Commit ee01e45

Browse files
authored
Merge pull request #16 from Dev-LotusStudio/database
Database refactor
2 parents 32bfb67 + 68c31f3 commit ee01e45

24 files changed

+514
-428
lines changed

.github/workflows/gradle-publish.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,14 @@ jobs:
7878
BRANCH_NAME=${GITHUB_REF##*/}
7979
echo "Branch: $BRANCH_NAME"
8080
81-
# Останній тег для release або pre-release
8281
if [ "$BRANCH_NAME" == "release" ]; then
83-
LAST_TAG=$(git describe --tags --match "v[0-9]*\.[0-9]*\.[0-9]*" --abbrev=0 2>/dev/null || echo "")
82+
# беремо тільки стабільні теги vX.Y.Z
83+
LAST_TAG=$(git tag --list "v[0-9]*.[0-9]*.[0-9]*" --sort=-creatordate | tail -n1)
8484
else
85-
LAST_TAG=$(git tag --list "v*-dev.*" --sort=-creatordate | head -n1 || echo "")
85+
# беремо тільки dev/pre-release теги
86+
LAST_TAG=$(git tag --list "v*-dev.*" --sort=-creatordate | tail -n1)
8687
fi
88+
8789
echo "Last tag: $LAST_TAG"
8890
8991
# Розбираємо версію
@@ -154,6 +156,7 @@ jobs:
154156
155157
echo "New version: $NEW_VERSION"
156158
echo "new=$NEW_VERSION" >> $GITHUB_OUTPUT
159+
157160

158161
- name: Grant execute permission for gradlew
159162
run: chmod +x gradlew

build.gradle

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
12
plugins {
23
id 'java'
3-
id 'com.github.johnrengelman.shadow' version '8.1.1'
44
}
55

66
group = 'dev.lotus.studio'
@@ -21,7 +21,7 @@ repositories {
2121
url = "https://maven.enginehub.org/repo/"
2222
}
2323
maven { url 'https://jitpack.io' }
24-
maven { url "https://repository.jboss.org/nexus/content/repositories/releases/" } // JBoss репозиторій
24+
maven { url "https://repository.jboss.org/nexus/content/repositories/releases/" }
2525
maven {
2626
url "https://repo.oraxen.com/releases"
2727
}
@@ -31,15 +31,8 @@ dependencies {
3131
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
3232
compileOnly 'io.th0rgal:oraxen:1.184.1'
3333
compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.15")
34-
implementation 'org.hibernate.orm:hibernate-core:6.6.1.Final'
35-
implementation 'org.hibernate.orm:hibernate-community-dialects:6.6.1.Final'
36-
implementation 'org.xerial:sqlite-jdbc:3.47.0.0'
37-
// https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime
38-
implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.5'
39-
// https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-core
40-
implementation 'org.glassfish.jaxb:jaxb-core:4.0.5'
41-
// https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api
42-
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2'
34+
implementation("org.xerial:sqlite-jdbc:3.50.3.0")
35+
implementation("com.j256.ormlite:ormlite-jdbc:6.1")
4336
}
4437

4538
java {
@@ -49,12 +42,6 @@ java {
4942
}
5043

5144

52-
shadowJar {
53-
archiveClassifier.set('')
54-
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
55-
configurations = [project.configurations.runtimeClasspath]
56-
}
57-
5845

5946
processResources {
6047
def props = [version: version]
@@ -63,4 +50,4 @@ processResources {
6350
filesMatching('paper-plugin.yml') {
6451
expand props
6552
}
66-
}
53+
}

src/main/java/dev/lotus/studio/Main.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
package dev.lotus.studio;
22

3+
import com.j256.ormlite.support.ConnectionSource;
4+
import dev.lotus.studio.database.DatabaseInitializer;
5+
import dev.lotus.studio.database.playerdata.PlayerDataService;
36
import org.bukkit.event.HandlerList;
47
import org.bukkit.plugin.java.JavaPlugin;
5-
import dev.lotus.studio.database.hibernate.playerdata.PlayerDataServiceImpl;
6-
import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService;
7-
import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataServiceImpl;
8+
import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl;
9+
import dev.lotus.studio.database.savezone.SaveZoneDataService;
10+
import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl;
811
import dev.lotus.studio.event.EatEvent;
912
import dev.lotus.studio.event.JoinLeaveEvent;
1013
import dev.lotus.studio.item.CustomItemManager;
1114
import dev.lotus.studio.command.MainCommand;
12-
import dev.lotus.studio.database.hibernate.HibernateUtil;
1315
import dev.lotus.studio.event.ArmorEvent;
1416
import dev.lotus.studio.playerdata.PlayerBar;
1517
import dev.lotus.studio.playerdata.PlayerManager;
1618
import dev.lotus.studio.safezone.SafeZoneManager;
1719

20+
import java.sql.SQLException;
21+
1822
public final class Main extends JavaPlugin {
1923

2024
private static Main instance;
@@ -23,9 +27,9 @@ public final class Main extends JavaPlugin {
2327

2428

2529

26-
private PlayerDataServiceImpl playerDataBase;
30+
private PlayerDataService playerDataBase;
2731
private SaveZoneDataService saveZoneDataService;
28-
32+
private DatabaseInitializer databaseInitializer;
2933

3034

3135

@@ -36,8 +40,11 @@ public void onEnable() {
3640
PlayerManager.getInstance().startGlobalTask();
3741
//cfg
3842
itemManager = new CustomItemManager();
39-
this.playerDataBase = new PlayerDataServiceImpl();
40-
this.saveZoneDataService = new SaveZoneDataServiceImpl();
43+
databaseInitializer = new DatabaseInitializer(this);
44+
playerDataBase = databaseInitializer.getPlayerDataBase();
45+
saveZoneDataService = databaseInitializer.getSaveZoneDataService();
46+
47+
4148

4249
itemManager.loadItems();
4350
getServer().getPluginManager().registerEvents(new ArmorEvent(itemManager),this);
@@ -57,14 +64,14 @@ public void onEnable() {
5764
@Override
5865
public void onDisable() {
5966
PlayerManager.getInstance().getGlobalTask().cancel();
60-
// Закриття SessionFactory Hibernate при вимкненні плагіна
61-
if (HibernateUtil.getSessionFactory() != null) {
62-
HibernateUtil.getSessionFactory().close();
67+
// Закриття DataBase
68+
if (databaseInitializer != null) {
69+
databaseInitializer.closeConnection();
6370
}
6471
getLogger().info("LotusOffSeason plugin disabled!");
6572
HandlerList.unregisterAll(this);
6673
}
67-
public PlayerDataServiceImpl getPlayerDataBase() {
74+
public PlayerDataService getPlayerDataBase() {
6875
return playerDataBase;
6976
}
7077

src/main/java/dev/lotus/studio/command/MainCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.bukkit.command.CommandSender;
55
import org.bukkit.entity.Player;
66
import org.bukkit.inventory.ItemStack;
7-
import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService;
7+
import dev.lotus.studio.database.savezone.SaveZoneDataService;
88
import dev.lotus.studio.item.CustomItemManager;
99

1010
import java.util.ArrayList;

src/main/java/dev/lotus/studio/command/SafeZoneCommand.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import org.bukkit.Location;
55
import org.bukkit.command.CommandSender;
66
import org.bukkit.entity.Player;
7-
import dev.lotus.studio.database.hibernate.savezone.SaveZoneData;
8-
import dev.lotus.studio.database.hibernate.savezone.SaveZoneDataService;
7+
import dev.lotus.studio.database.savezone.SafeZoneDataBase;
8+
import dev.lotus.studio.database.savezone.SaveZoneDataService;
99

1010
import java.util.HashMap;
1111
import java.util.List;
@@ -70,27 +70,27 @@ public boolean execute(CommandSender sender, String label, String[] args) {
7070
}
7171

7272
private void removeZoneToDB(Player player, int id) {
73-
service.getAllSaveZones().forEach(saveZoneData -> {
74-
if (saveZoneData.getSafeZoneId() == id){
75-
player.sendMessage("Сейв зону удаленно с названием: " + saveZoneData.getSafeZoneName() + " ID: " + saveZoneData.getSafeZoneId());
73+
service.getAllSaveZones().forEach(safeZoneDataBase -> {
74+
if (safeZoneDataBase.getSafeZoneId() == id){
75+
player.sendMessage("Сейв зону удаленно с названием: " + safeZoneDataBase.getSafeZoneName() + " ID: " + safeZoneDataBase.getSafeZoneId());
7676
}
7777
});
7878
service.removeProtectZone(id);
7979
}
8080

8181
private void listZoneToDB(Player player) {
8282
// Отримуємо всі збережені зони з бази даних
83-
List<SaveZoneData> saveZoneDatas = service.getAllSaveZones();
83+
List<SafeZoneDataBase> safeZoneDataBases = service.getAllSaveZones();
8484

8585
// Якщо зон немає, повідомляємо гравця
86-
if (saveZoneDatas.isEmpty()) {
86+
if (safeZoneDataBases.isEmpty()) {
8787
player.sendMessage("нет зон.");
8888
return;
8989
}
9090

9191
// Формуємо мапу з імен зон і їх ідентифікаторів
9292
HashMap<String, Integer> saveId = new HashMap<>();
93-
saveZoneDatas.forEach(saveZoneData -> saveId.put(saveZoneData.getSafeZoneName(), saveZoneData.getSafeZoneId()));
93+
safeZoneDataBases.forEach(saveZoneData -> saveId.put(saveZoneData.getSafeZoneName(), saveZoneData.getSafeZoneId()));
9494

9595
// Виводимо гравцю список зон
9696
player.sendMessage("Список зон:");
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package dev.lotus.studio.database;
2+
3+
import com.j256.ormlite.jdbc.JdbcConnectionSource;
4+
import com.j256.ormlite.support.ConnectionSource;
5+
import com.j256.ormlite.table.TableUtils;
6+
import dev.lotus.studio.database.playerdata.PlayerDataBase;
7+
import dev.lotus.studio.database.playerdata.PlayerDataService;
8+
import dev.lotus.studio.database.playerdata.PlayerDataServiceImpl;
9+
import dev.lotus.studio.database.savezone.SafeZoneDataBase;
10+
import dev.lotus.studio.database.savezone.SaveZoneDataService;
11+
import dev.lotus.studio.database.savezone.SaveZoneDataServiceImpl;
12+
import org.bukkit.plugin.java.JavaPlugin;
13+
14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.sql.SQLException;
17+
import java.util.logging.Logger;
18+
19+
public class DatabaseInitializer {
20+
21+
private final JavaPlugin plugin;
22+
private final Logger logger;
23+
private final String databasePath;
24+
private ConnectionSource connectionSource;
25+
26+
private PlayerDataService playerDataBase;
27+
28+
private SaveZoneDataService saveZoneDataService;
29+
30+
public DatabaseInitializer(JavaPlugin plugin) {
31+
this.plugin = plugin;
32+
this.logger = plugin.getLogger();
33+
this.databasePath = plugin.getDataFolder().getAbsolutePath() + File.separator + "database.db";
34+
try {
35+
createDatabaseFile();
36+
createTables();
37+
initialDataService();
38+
} catch (IOException | SQLException e) {
39+
throw new RuntimeException(e);
40+
}
41+
}
42+
43+
/**
44+
* Створюємо файл бази даних якщо його ще нема
45+
*/
46+
public void createDatabaseFile() throws IOException {
47+
File dataFolder = plugin.getDataFolder();
48+
if (!dataFolder.exists()) {
49+
if (!dataFolder.mkdirs()) {
50+
logger.warning("Не вдалося створити директорію плагіна: " + dataFolder.getAbsolutePath());
51+
}
52+
}
53+
54+
File databaseFile = new File(databasePath);
55+
if (!databaseFile.exists()) {
56+
if (databaseFile.createNewFile()) {
57+
logger.info("Створено новий файл бази даних: " + databasePath);
58+
} else {
59+
logger.warning("Не вдалося створити файл бази даних: " + databasePath);
60+
}
61+
}
62+
}
63+
64+
65+
/**
66+
* Инициализация сервисов бд
67+
*/
68+
69+
public void initialDataService() {
70+
try {
71+
ConnectionSource connectionSource = openConnection();
72+
this.playerDataBase = new PlayerDataServiceImpl(connectionSource);
73+
this.saveZoneDataService = new SaveZoneDataServiceImpl(connectionSource);
74+
} catch (SQLException e) {
75+
throw new RuntimeException(e);
76+
}
77+
}
78+
79+
80+
81+
82+
83+
84+
/**
85+
* Повертає ORMLite ConnectionSource
86+
*/
87+
public ConnectionSource openConnection() throws SQLException {
88+
if (connectionSource == null) {
89+
String url = "jdbc:sqlite:" + databasePath;
90+
connectionSource = new JdbcConnectionSource(url);
91+
92+
logger.info("З’єднання з базою даних встановлено (ORMLite)");
93+
}
94+
return connectionSource;
95+
}
96+
97+
/**
98+
* Створюємо таблиці через ORMLite
99+
*/
100+
public void createTables() throws SQLException {
101+
ConnectionSource cs = openConnection();
102+
103+
TableUtils.createTableIfNotExists(cs, PlayerDataBase.class);
104+
TableUtils.createTableIfNotExists(cs, SafeZoneDataBase.class);
105+
106+
logger.info("Таблиці ORMLite створені/перевірені");
107+
}
108+
109+
/**
110+
* Закриття з’єднання
111+
*/
112+
public void closeConnection() {
113+
if (connectionSource != null) {
114+
try {
115+
connectionSource.close();
116+
logger.info("З’єднання з базою даних закрито");
117+
} catch (Exception e) {
118+
logger.warning("Помилка закриття з’єднання: " + e.getMessage());
119+
}
120+
}
121+
}
122+
123+
/**
124+
* This method
125+
* @return PlayerDataService
126+
*/
127+
public PlayerDataService getPlayerDataBase() {
128+
return playerDataBase;
129+
}
130+
/**
131+
* This method
132+
* @return SaveZoneDataService
133+
*/
134+
public SaveZoneDataService getSaveZoneDataService() {
135+
return saveZoneDataService;
136+
}
137+
}

0 commit comments

Comments
 (0)