Skip to content

Commit fccbd26

Browse files
committed
fix database stuff
1 parent 64724e1 commit fccbd26

File tree

12 files changed

+286
-94
lines changed

12 files changed

+286
-94
lines changed

build.gradle.kts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,27 @@ dependencies {
2323
implementation("org.hibernate:hibernate-core:6.3.1.Final")
2424
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
2525

26+
implementation("org.reflections:reflections:0.10.2")
27+
2628
implementation("org.projectlombok:lombok:1.18.36")
2729
annotationProcessor("org.projectlombok:lombok:1.18.36")
2830
implementation("org.jetbrains:annotations:26.0.1")
2931
implementation("org.jetbrains:annotations:26.0.1")
32+
33+
testImplementation("org.mongodb:mongodb-driver-sync:5.2.1")
34+
35+
compileOnly("org.projectlombok:lombok:1.18.36")
36+
annotationProcessor("org.projectlombok:lombok:1.18.36")
37+
testImplementation("org.projectlombok:lombok:1.18.36")
38+
testAnnotationProcessor("org.projectlombok:lombok:1.18.36")
39+
40+
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.11.4")
41+
42+
testImplementation("org.slf4j:slf4j-jdk14:2.0.16")
43+
}
44+
45+
tasks.withType<Test> {
46+
useJUnitPlatform()
3047
}
3148

3249
java {

docker-compose.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: '3.3'
2+
services:
3+
db:
4+
image: mysql:5.7
5+
restart: always
6+
environment:
7+
MYSQL_DATABASE: 'db'
8+
MYSQL_USER: 'user'
9+
MYSQL_PASSWORD: 'password'
10+
MYSQL_ROOT_PASSWORD: 'password'
11+
ports:
12+
- '3306:3306'
13+
expose:
14+
- '3306'
15+
volumes:
16+
- my-db:/var/lib/mysql
17+
volumes:
18+
my-db:

src/main/java/de/varilx/database/Repository.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ public interface Repository<ENTITY, ID> {
99

1010
CompletableFuture<ENTITY> findFirstById(ID id);
1111

12-
void deleteById(ID id);
12+
CompletableFuture<Void> deleteById(ID id);
1313

14-
void save(ENTITY entity);
14+
CompletableFuture<Void> save(ENTITY entity);
1515

16-
void insert(ENTITY entity);
16+
CompletableFuture<Void> insert(ENTITY entity);
1717

1818
CompletableFuture<Boolean> exists(ID id);
1919

20-
void deleteAll();
20+
CompletableFuture<Void> deleteAll();
2121

2222
}

src/main/java/de/varilx/database/Service.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.varilx.database;
22

3+
import com.google.common.reflect.ClassPath;
34
import de.varilx.database.mongo.MongoService;
5+
import de.varilx.database.sql.SQLService;
46
import lombok.AllArgsConstructor;
57
import lombok.Getter;
68
import lombok.RequiredArgsConstructor;
@@ -12,17 +14,17 @@
1214

1315
public abstract class Service {
1416

15-
public Service(YamlConfiguration configuration) {
17+
public Service(YamlConfiguration configuration, ClassLoader loader) {
1618

1719
}
1820

1921
public abstract <ENTITY, ID> Repository<ENTITY, ID> create(String name, Class<ENTITY> entityClazz, Class<ID> idClass);
2022

21-
public static Service load(YamlConfiguration configuration) {
23+
public static Service load(YamlConfiguration configuration, ClassLoader loader) {
2224
@Nullable ServiceType type = ServiceType.findBy(configuration.getString("type"));
2325
if (type == null) throw new RuntimeException("No Database Type found");
2426
try {
25-
return (Service) type.getClazz().getDeclaredConstructors()[0].newInstance(configuration);
27+
return (Service) type.getClazz().getDeclaredConstructors()[0].newInstance(configuration, loader);
2628
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
2729
throw new RuntimeException(e);
2830
}
@@ -35,8 +37,7 @@ public static Service load(YamlConfiguration configuration) {
3537
public enum ServiceType {
3638

3739
MONGO(MongoService.class),
38-
MYSQL(Service.class),
39-
SQLITE(Service.class);
40+
SQL(SQLService.class);
4041

4142
private final Class<? extends Service> clazz;
4243

src/main/java/de/varilx/database/mongo/MongoRepo.java renamed to src/main/java/de/varilx/database/mongo/MongoRepository.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.mongodb.client.MongoCollection;
44
import com.mongodb.client.model.Filters;
55
import com.mongodb.client.model.ReplaceOptions;
6-
import com.mongodb.client.result.DeleteResult;
76
import com.mongodb.client.result.UpdateResult;
87
import de.varilx.database.Repository;
98
import de.varilx.utils.ReflectionUtils;
@@ -14,13 +13,13 @@
1413
import java.util.List;
1514
import java.util.concurrent.CompletableFuture;
1615

17-
public class MongoRepo<E, ID> implements Repository<E, ID> {
16+
public class MongoRepository<E, ID> implements Repository<E, ID> {
1817

1918
private final MongoCollection<E> database;
2019
private final Class<E> entityClass;
2120
private final Class<ID> idClass;
2221

23-
public MongoRepo(MongoCollection<E> database, Class<E> entityClass, Class<ID> idClass) {
22+
public MongoRepository(MongoCollection<E> database, Class<E> entityClass, Class<ID> idClass) {
2423
this.database = database;
2524
this.entityClass = entityClass;
2625
this.idClass = idClass;
@@ -42,28 +41,33 @@ public CompletableFuture<E> findFirstById(ID id) {
4241
}
4342

4443
@Override
45-
public void deleteById(ID id) {
46-
CompletableFuture.runAsync(() -> {
44+
public CompletableFuture<Void> deleteById(ID id) {
45+
return CompletableFuture.supplyAsync(() -> {
4746
this.database.deleteOne(createIdFilter(id));
47+
return null;
4848
});
4949
}
5050

5151
@Override
52-
public void save(E e) {
53-
CompletableFuture.runAsync(() -> {
52+
public CompletableFuture<Void> save(E e) {
53+
return CompletableFuture.supplyAsync(() -> {
5454
Bson idFilter = createIdFilter(getId(e));
5555
if (database.countDocuments(idFilter) > 0) {
5656
UpdateResult result = database.replaceOne(idFilter, e, new ReplaceOptions().upsert(true));
57-
return;
57+
return null;
5858
}
5959
database.insertOne(e);
60+
return null;
61+
6062
});
6163
}
6264

6365
@Override
64-
public void insert(E e) {
65-
CompletableFuture.runAsync(() -> {
66+
public CompletableFuture<Void> insert(E e) {
67+
return CompletableFuture.supplyAsync(() -> {
6668
database.insertOne(e);
69+
return null;
70+
6771
});
6872
}
6973

@@ -76,8 +80,11 @@ public CompletableFuture<Boolean> exists(ID id) {
7680
}
7781

7882
@Override
79-
public void deleteAll() {
80-
database.deleteMany(Filters.exists("_id"));
83+
public CompletableFuture<Void> deleteAll() {
84+
return CompletableFuture.supplyAsync(() -> {
85+
database.deleteMany(Filters.exists("_id"));
86+
return null;
87+
});
8188
}
8289

8390
private ID getId(E entity) {

src/main/java/de/varilx/database/mongo/MongoService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.varilx.database.mongo;
22

3+
import com.google.common.reflect.ClassPath;
34
import com.mongodb.client.MongoClient;
45
import com.mongodb.client.MongoClients;
56
import com.mongodb.client.MongoDatabase;
@@ -17,14 +18,14 @@ public class MongoService extends Service {
1718
MongoClient client;
1819
MongoDatabase database;
1920

20-
public MongoService(YamlConfiguration configuration) {
21-
super(configuration);
21+
public MongoService(YamlConfiguration configuration, ClassLoader loader) {
22+
super(configuration, loader);
2223
this.client = MongoClients.create(Objects.requireNonNull(configuration.getString("connection-string"), "No Connection String given"));
2324
this.database = client.getDatabase(Objects.requireNonNull(configuration.getString("database"), "No database given"));
2425
}
2526

2627
@Override
2728
public <ENTITY, ID> Repository<ENTITY, ID> create(String name, Class<ENTITY> entityClazz, Class<ID> idClass) {
28-
return new MongoRepo<>(database.getCollection(name).withDocumentClass(entityClazz), entityClazz, idClass);
29+
return new MongoRepository<>(database.getCollection(name).withDocumentClass(entityClazz), entityClazz, idClass);
2930
}
3031
}

src/main/java/de/varilx/database/mysql/repository/MySQLRepository.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/main/java/de/varilx/database/mysql/MySQLService.java renamed to src/main/java/de/varilx/database/sql/SQLService.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,50 @@
1-
package de.varilx.database.mysql;
1+
package de.varilx.database.sql;
22

3+
import com.google.common.reflect.ClassPath;
34
import de.varilx.database.Repository;
45
import de.varilx.database.Service;
5-
import de.varilx.database.mysql.configuration.HibernateConfiguration;
6+
import de.varilx.database.sql.configuration.HibernateConfiguration;
7+
import de.varilx.database.sql.repository.SQLRepository;
68
import lombok.AccessLevel;
79
import lombok.Getter;
810
import lombok.experimental.FieldDefaults;
911
import org.bukkit.configuration.file.YamlConfiguration;
1012
import org.hibernate.SessionFactory;
11-
import org.hibernate.cfg.Configuration;
1213

1314
import java.util.Objects;
1415

1516
@Getter
1617
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
17-
public class MySQLService extends Service {
18+
public class SQLService extends Service {
1819

1920
SessionFactory sessionFactory;
2021

21-
public MySQLService(YamlConfiguration configuration) {
22-
super(configuration);
22+
public SQLService(String connectionString, String username, String password, ClassLoader loader) {
23+
super(null, loader);
24+
HibernateConfiguration hibernateConfiguration = new HibernateConfiguration(
25+
connectionString,
26+
username,
27+
password
28+
);
29+
30+
31+
sessionFactory = hibernateConfiguration.toHibernateConfig(loader).buildSessionFactory();
32+
}
33+
34+
public SQLService(YamlConfiguration configuration, ClassLoader loader) {
35+
super(configuration, loader);
2336
HibernateConfiguration hibernateConfiguration = new HibernateConfiguration(
2437
Objects.requireNonNull(configuration.getString("MySQL.connection-string")),
2538
Objects.requireNonNull(configuration.getString("MySQL.username")),
2639
Objects.requireNonNull(configuration.getString("MySQL.password"))
2740
);
2841

2942

30-
sessionFactory = hibernateConfiguration.toHibernateConfig().buildSessionFactory();
43+
sessionFactory = hibernateConfiguration.toHibernateConfig(loader).buildSessionFactory();
3144
}
3245

3346
@Override
3447
public <ENTITY, ID> Repository<ENTITY, ID> create(String name, Class<ENTITY> entityClazz, Class<ID> idClass) {
35-
return null;
48+
return new SQLRepository<>(sessionFactory, entityClazz, idClass, name);
3649
}
3750
}

src/main/java/de/varilx/database/mysql/configuration/HibernateConfiguration.java renamed to src/main/java/de/varilx/database/sql/configuration/HibernateConfiguration.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
package de.varilx.database.mysql.configuration;
1+
package de.varilx.database.sql.configuration;
22

3+
import jakarta.persistence.Entity;
34
import lombok.AccessLevel;
45
import lombok.AllArgsConstructor;
56
import lombok.experimental.FieldDefaults;
67
import org.hibernate.cfg.Configuration;
8+
import org.reflections.Reflections;
9+
10+
import java.util.logging.Level;
11+
import java.util.logging.Logger;
712

813
@AllArgsConstructor
914
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
1015
public class HibernateConfiguration {
1116

1217
String connectionUri, userName, password;
1318

14-
public Configuration toHibernateConfig() {
19+
public Configuration toHibernateConfig(ClassLoader loader) {
1520
Configuration configuration = new Configuration();
1621

1722
configuration.setProperty("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
@@ -20,9 +25,20 @@ public Configuration toHibernateConfig() {
2025
configuration.setProperty("hibernate.connection.password", password);
2126

2227
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
23-
configuration.setProperty("hibernate.show_sql", "true");
24-
configuration.setProperty("hibernate.format_sql", "true");
2528
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
29+
configuration.setProperty("spring.jpa.hibernate.ddl-auto", "auto");
30+
31+
Logger reflectionsLogger = Logger.getLogger("org.reflections");
32+
reflectionsLogger.setLevel(Level.OFF);
33+
34+
for (Package definedPackage : loader.getDefinedPackages()) {
35+
Reflections reflections = new Reflections(definedPackage.getName());
36+
for (Class<?> aClass : reflections.getTypesAnnotatedWith(Entity.class)) {
37+
configuration.addAnnotatedClass(aClass);
38+
}
39+
}
40+
41+
2642

2743
return configuration;
2844
}

0 commit comments

Comments
 (0)