From c21eb6f78c0df62114283800496fb99fc77958a9 Mon Sep 17 00:00:00 2001 From: Stuart Pomeroy Date: Mon, 23 Nov 2020 05:20:42 +0000 Subject: [PATCH] Initial hibernate stripping. Player, Rank and Setting DAO's complete --- build.gradle | 6 +- .../core/api/objects/EventBooth.java | 15 +- .../core/api/objects/EventBoothPlot.java | 9 +- .../core/api/objects/EventPlayer.java | 32 +-- .../core/api/objects/EventRank.java | 24 +- .../core/api/objects/EventSetting.java | 22 +- .../core/modules/discord/DiscordLinkDAO.java | 18 +- .../core/modules/mysql/MySQLDatabase.java | 81 ++----- .../core/modules/mysql/MySQLModule.java | 7 +- .../core/modules/mysql/dao/BoothDAO.java | 133 ++++++++--- .../core/modules/mysql/dao/PlayerDAO.java | 220 +++++++++++++----- .../core/modules/mysql/dao/RankDAO.java | 172 +++++++++++--- .../core/modules/mysql/dao/SettingDAO.java | 88 +++++-- 13 files changed, 529 insertions(+), 298 deletions(-) diff --git a/build.gradle b/build.gradle index 58f9a45..33b8ebb 100644 --- a/build.gradle +++ b/build.gradle @@ -14,13 +14,9 @@ repositories { } dependencies { - compile 'org.hibernate:hibernate-core:5.4.21.Final' - compile 'org.hibernate:hibernate-c3p0:5.4.21.Final' - compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2' - compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.4' + compile 'com.zaxxer:HikariCP:3.4.5' compile 'redis.clients:jedis:3.2.0' compile "com.influxdb:influxdb-client-java:1.13.0" - runtime 'mysql:mysql-connector-java:5.1.37' implementation 'com.google.code.gson:gson:2.8.5' implementation 'net.kyori:adventure-api:4.1.1' diff --git a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBooth.java b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBooth.java index 3f4d974..2d1ffd4 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBooth.java +++ b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBooth.java @@ -1,11 +1,8 @@ package dev.imabad.mceventsuite.core.api.objects; -import javax.persistence.*; import java.util.List; import java.util.UUID; -@Entity -@Table(name = "booths") public class EventBooth { private String id; @@ -16,8 +13,6 @@ public class EventBooth { private String plotID; private String status = "un-assigned"; - protected EventBooth(){} - public EventBooth(String name, String boothType, EventPlayer owner, List members){ this.id = UUID.randomUUID().toString(); this.name = name; @@ -26,11 +21,17 @@ public EventBooth(String name, String boothType, EventPlayer owner, List members, String plotID, String status){ + this(name, boothType, owner, members); + this.id = id; + this.plotID = plotID; + this.status = status; + } + public void setId(String id) { this.id = id; } - @Id public String getId() { return id; } @@ -51,7 +52,6 @@ public void setBoothType(String boothType) { this.boothType = boothType; } - @OneToOne(fetch = FetchType.EAGER) public EventPlayer getOwner() { return owner; } @@ -60,7 +60,6 @@ public void setOwner(EventPlayer owner) { this.owner = owner; } - @ManyToMany(fetch = FetchType.EAGER) public List getMembers() { return members; } diff --git a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBoothPlot.java b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBoothPlot.java index 7d09c66..c566cfe 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBoothPlot.java +++ b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventBoothPlot.java @@ -1,10 +1,8 @@ package dev.imabad.mceventsuite.core.api.objects; -import javax.persistence.*; import java.util.UUID; -@Entity -@Table(name = "booth_plots") +//TODO: Move into a separate module public class EventBoothPlot { private String id; @@ -15,8 +13,6 @@ public class EventBoothPlot { private String status = "empty"; private EventBooth booth; - protected EventBoothPlot(){} - public EventBoothPlot(String boothType, String posOne, String posTwo){ this.id = UUID.randomUUID().toString(); this.boothType = boothType; @@ -28,7 +24,6 @@ public void setId(String id) { this.id = id; } - @Id public String getId() { return id; } @@ -41,7 +36,6 @@ public void setBoothType(String boothType) { this.boothType = boothType; } - @OneToOne(fetch = FetchType.EAGER) public EventBooth getBooth() { return booth; } @@ -82,6 +76,7 @@ public void setFrontPos(String frontPos) { this.frontPos = frontPos; } + //TODO: Come back and rewrite this to not be hard-coded public int plotSize(){ switch(boothType){ case "small": diff --git a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventPlayer.java b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventPlayer.java index 4c6ad3f..63e8032 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventPlayer.java +++ b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventPlayer.java @@ -1,26 +1,15 @@ package dev.imabad.mceventsuite.core.api.objects; import dev.imabad.mceventsuite.core.EventCore; -import dev.imabad.mceventsuite.core.api.actions.Action; -import dev.imabad.mceventsuite.core.modules.eventpass.db.EventPassPlayer; import dev.imabad.mceventsuite.core.modules.mysql.MySQLModule; -import dev.imabad.mceventsuite.core.modules.mysql.PropertyMapConverter; import dev.imabad.mceventsuite.core.modules.mysql.dao.RankDAO; import dev.imabad.mceventsuite.core.util.PropertyMap; -import java.io.Serializable; -import jdk.nashorn.internal.runtime.Property; -import org.hibernate.annotations.DynamicUpdate; - -import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.UUID; -@Entity -@Table(name = "players") -@DynamicUpdate -public class EventPlayer implements Serializable { +public class EventPlayer { private static PropertyMap defaultProperties = new PropertyMap(); @@ -28,16 +17,13 @@ public static void addDefault(String name, Object defaultValue){ defaultProperties.put(name, defaultValue); } - @org.hibernate.annotations.Type(type="uuid-char") private UUID uuid; private String lastUsername; private EventRank rank; private List permissions; private PropertyMap properties = defaultProperties; - protected EventPlayer(){} - - protected EventPlayer(UUID uuid, String lastUsername, EventRank rank, List permissions, PropertyMap properties) { + public EventPlayer(UUID uuid, String lastUsername, EventRank rank, List permissions, PropertyMap properties) { this.uuid = uuid; this.lastUsername = lastUsername; this.rank = rank; @@ -48,13 +34,10 @@ protected EventPlayer(UUID uuid, String lastUsername, EventRank rank, List getPermissions() { return permissions; } @@ -111,7 +90,7 @@ public boolean hasPermission(String permission){ hasPerm = playerHasPermission(permission); } if(!hasPerm && rank.isInheritsFromBelow()){ - for(EventRank eventRank : EventCore.getInstance().getModuleRegistry().getModule(MySQLModule.class).getMySQLDatabase().getDAO(RankDAO.class).getRanks()){ + for(EventRank eventRank : EventCore.getInstance().getModuleRegistry().getModule(MySQLModule.class).getDAO(RankDAO.class).getRanks().values()){ if(eventRank.getPower() <= rank.getPower() && eventRank.hasPermission(permission)){ return true; } @@ -139,12 +118,11 @@ public boolean playerHasPermission(String permission){ return containsPermission(permission); } + //TODO: Modify this to allow for negated permissions private boolean containsPermission(String permission){ return this.permissions != null && (this.permissions.contains(permission) || (!this.permissions.contains('-' + permission) && this.permissions.contains('+' + permission))); } - @Column(name="properties") - @Convert(converter = PropertyMapConverter.class) public PropertyMap getProperties() { return properties; } diff --git a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventRank.java b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventRank.java index a81d42a..3d1bd0e 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventRank.java +++ b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventRank.java @@ -1,11 +1,8 @@ package dev.imabad.mceventsuite.core.api.objects; - -import javax.persistence.*; import java.util.List; -@Entity -@Table(name = "ranks") +//TODO: Remove XP from here. public class EventRank { private int id; @@ -18,7 +15,6 @@ public class EventRank { private boolean inheritsFromBelow = true; private int initialEventPassXP = 0; - public EventRank(int power, String name, String prefix, String suffix, List permissions, boolean inheritsFromBelow) { this.power = power; this.name = name; @@ -34,32 +30,24 @@ public EventRank(int power, String name, String prefix, String suffix, List permissions, boolean inheritsFromBelow){ + public EventRank(int id, int power, String name, String prefix, String suffix, List permissions, boolean inheritsFromBelow, String chatColor){ this(power, name, prefix, suffix, permissions, inheritsFromBelow); this.id = id; + this.chatColor = chatColor; } - public EventRank() { - } - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", unique = true) public int getId() { return id; } - @Column(name = "power") public int getPower() { return power; } - @Column(name = "name") public String getName() { return name; } - @Column(name = "prefix") public String getPrefix() { if(prefix == null){ return ""; @@ -67,7 +55,6 @@ public String getPrefix() { return prefix; } - @Column(name = "suffix") public String getSuffix() { if(suffix == null){ return ""; @@ -75,17 +62,14 @@ public String getSuffix() { return suffix; } - @ElementCollection(fetch = FetchType.EAGER) public List getPermissions() { return permissions; } - @Column(name = "inheritsFromBelow") public boolean isInheritsFromBelow() { return inheritsFromBelow; } - @Column(name = "chatColor") public String getChatColor() { if(chatColor == null){ return "#fff"; @@ -93,7 +77,6 @@ public String getChatColor() { return chatColor; } - @Column(name = "initialXP") public int getInitialEventPassXP() { return initialEventPassXP; } @@ -134,6 +117,7 @@ public void setInitialEventPassXP(int initialEventPassXP) { this.initialEventPassXP = initialEventPassXP; } + //TODO: Modify this to allow for negated permissions private boolean containsPermission(String permission){ return this.permissions.contains(permission) || (!this.permissions.contains('-' + permission) && this.permissions.contains('+' + permission)); } diff --git a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventSetting.java b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventSetting.java index 58e157a..dc3803b 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventSetting.java +++ b/src/main/java/dev/imabad/mceventsuite/core/api/objects/EventSetting.java @@ -1,16 +1,7 @@ package dev.imabad.mceventsuite.core.api.objects; - -import com.google.gson.Gson; import dev.imabad.mceventsuite.core.util.GsonUtils; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "event_settings") public class EventSetting { private String name; @@ -25,10 +16,13 @@ public EventSetting(String name, Object defaultValue, String group, String permi this.permission = permission; } - public EventSetting() { + public EventSetting(String group, String name, String value, String permission){ + this.group = group; + this.name = name; + this.value = value; + this.permission = permission; } - @Column(name = "group") public String getGroup() { return group; } @@ -37,8 +31,6 @@ public void setGroup(String group) { this.group = group; } - @Id - @Column(name = "name") public String getName() { return name; } @@ -47,8 +39,7 @@ public void setName(String name) { this.name = name; } - @Column(name = "value") - private String getValue() { + public String getValueJSON() { return value; } @@ -60,7 +51,6 @@ public void setValue(Object value) { this.value = GsonUtils.getGson().toJson(value); } - @Column(name = "permission") public String getPermission() { return permission; } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/discord/DiscordLinkDAO.java b/src/main/java/dev/imabad/mceventsuite/core/modules/discord/DiscordLinkDAO.java index b554f3e..d7aa317 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/discord/DiscordLinkDAO.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/discord/DiscordLinkDAO.java @@ -1,14 +1,12 @@ package dev.imabad.mceventsuite.core.modules.discord; import dev.imabad.mceventsuite.core.api.objects.EventPlayer; -import dev.imabad.mceventsuite.core.modules.audit.db.AuditLogEntry; import dev.imabad.mceventsuite.core.modules.mysql.MySQLDatabase; import dev.imabad.mceventsuite.core.modules.mysql.dao.DAO; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.Query; - -import javax.persistence.NoResultException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import redis.clients.jedis.Transaction; public class DiscordLinkDAO extends DAO { @@ -17,14 +15,16 @@ public DiscordLinkDAO(MySQLDatabase mySQLDatabase) { } public EventPlayer getPlayerFromDiscord(String discordID){ - try(Session session = mySQLDatabase.getSession()){ - Query q= session.createQuery("select d.player FROM DiscordLink d LEFT JOIN FETCH d.player.permissions e WHERE d.discordID = :discordID", EventPlayer.class); - q.setParameter("discordID", discordID); + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement query = connection.prepareStatement("SELECT * FROM players WHERE players.uuid = (SELECT player FROM discord_links WHERE discordID = ?) LIMIT 1;"); + query.setString(1, discordID); try { return q.getSingleResult(); } catch (NoResultException e) { return null; } + } catch(SQLException ignored){ + return null; } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLDatabase.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLDatabase.java index 88cad48..98c26f1 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLDatabase.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLDatabase.java @@ -1,35 +1,28 @@ package dev.imabad.mceventsuite.core.modules.mysql; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; import dev.imabad.mceventsuite.core.EventCore; import dev.imabad.mceventsuite.core.api.database.DatabaseProvider; import dev.imabad.mceventsuite.core.api.database.DatabaseType; -import dev.imabad.mceventsuite.core.api.objects.*; import dev.imabad.mceventsuite.core.config.database.MySQLConfig; -import dev.imabad.mceventsuite.core.modules.ac.db.AccessControlSetting; -import dev.imabad.mceventsuite.core.modules.ac.db.PlayerBan; -import dev.imabad.mceventsuite.core.modules.announcements.db.ScheduledAnnouncement; -import dev.imabad.mceventsuite.core.modules.audit.db.AuditLogEntry; -import dev.imabad.mceventsuite.core.modules.discord.DiscordLink; -import dev.imabad.mceventsuite.core.modules.eventpass.db.EventPassPlayer; -import dev.imabad.mceventsuite.core.modules.eventpass.db.EventPassReward; -import dev.imabad.mceventsuite.core.modules.mysql.dao.*; +import dev.imabad.mceventsuite.core.modules.mysql.dao.BoothDAO; +import dev.imabad.mceventsuite.core.modules.mysql.dao.DAO; +import dev.imabad.mceventsuite.core.modules.mysql.dao.InvalidDAOException; +import dev.imabad.mceventsuite.core.modules.mysql.dao.PlayerDAO; +import dev.imabad.mceventsuite.core.modules.mysql.dao.RankDAO; +import dev.imabad.mceventsuite.core.modules.mysql.dao.SettingDAO; import dev.imabad.mceventsuite.core.modules.mysql.events.MySQLLoadedEvent; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; - -import javax.persistence.Entity; +import java.sql.Connection; +import java.sql.SQLException; import java.util.Arrays; import java.util.HashSet; -import java.util.Properties; import java.util.Set; -import org.hibernate.cfg.Environment; public class MySQLDatabase extends DatabaseProvider { private MySQLConfig mySQLConfig; - private SessionFactory sessionFactory; - private Configuration configuration; + private HikariDataSource dataSource; private Set registeredDAOs; @@ -46,7 +39,7 @@ public MySQLDatabase(MySQLConfig mySQLConfig){ @Override public boolean isConnected() { - return !sessionFactory.isClosed(); + return !dataSource.isClosed(); } @Override @@ -61,52 +54,20 @@ public String getName() { @Override public void connect() { - Properties prop= new Properties(); + HikariConfig config = new HikariConfig(); String connectionString = mySQLConfig.getPort() != 0 ? String.format("jdbc:mysql://%s:%d/%s", mySQLConfig.getHostname(), mySQLConfig.getPort(), mySQLConfig.getDatabase()) : String.format("jdbc:mysql://%s/%s", mySQLConfig.getHostname(), mySQLConfig.getDatabase()); - prop.setProperty("hibernate.connection.url", connectionString); - - //You can use any database you want, I had it configured for Postgres - prop.setProperty("hibernate.dialect", "org.hibernate.dialect.MariaDB103Dialect"); - - prop.setProperty("hibernate.connection.username", mySQLConfig.getUsername()); + config.setJdbcUrl(connectionString); + config.setUsername(mySQLConfig.getUsername()); if(mySQLConfig.getPassword().length() > 0) { - prop.setProperty("hibernate.connection.password", mySQLConfig.getPassword()); + config.setPassword(mySQLConfig.getPassword()); } - - prop.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); - prop.setProperty("hibernate.globally_quoted_identifiers", "true"); - prop.setProperty("hibernate.hbm2ddl.auto", "update"); - prop.setProperty("show_sql", "true"); - prop.setProperty("format_sql", "true"); - - // Start with just one connection (default is three) - prop.setProperty("hibernate.c3p0.min_size", "1"); - - // When the pool is exhausted, create one new connection (default is three) - prop.setProperty("hibernate.c3p0.acquire_increment", "1"); - prop.setProperty("hibernate.c3p0.validate", "true"); - - configuration = new Configuration().addProperties(prop); - configuration.addAnnotatedClass(EventSetting.class); - configuration.addAnnotatedClass(EventPlayer.class); - configuration.addAnnotatedClass(EventRank.class); - configuration.addAnnotatedClass(EventBooth.class); - configuration.addAnnotatedClass(AccessControlSetting.class); - configuration.addAnnotatedClass(PlayerBan.class); - configuration.addAnnotatedClass(AuditLogEntry.class); - configuration.addAnnotatedClass(DiscordLink.class); - configuration.addAnnotatedClass(EventBoothPlot.class); - configuration.addAnnotatedClass(ScheduledAnnouncement.class); - configuration.addAnnotatedClass(EventPassPlayer.class); - configuration.addAnnotatedClass(EventPassReward.class); - configuration.addPackage("dev.imabad.mceventsuite"); - sessionFactory = configuration.buildSessionFactory(); + dataSource = new HikariDataSource(config); EventCore.getInstance().getEventRegistry().handleEvent(new MySQLLoadedEvent(this)); } @@ -120,11 +81,11 @@ public T getDAO(Class dao){ @Override public void disconnect() { - if(sessionFactory != null) - sessionFactory.close(); + if(dataSource != null) + dataSource.close(); } - public Session getSession(){ - return sessionFactory.openSession(); + public Connection getSession() throws SQLException { + return dataSource.getConnection(); } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLModule.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLModule.java index 99b47a6..37d9ff0 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLModule.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/MySQLModule.java @@ -3,7 +3,7 @@ import dev.imabad.mceventsuite.core.api.IConfigProvider; import dev.imabad.mceventsuite.core.api.modules.Module; import dev.imabad.mceventsuite.core.config.database.MySQLConfig; - +import dev.imabad.mceventsuite.core.modules.mysql.dao.DAO; import java.util.Collections; import java.util.List; @@ -85,8 +85,11 @@ public boolean saveOnQuit() { return false; } - public MySQLDatabase getMySQLDatabase() { return mySQLDatabase; } + + public T getDAO(Class dao){ + return mySQLDatabase.getDAO(dao); + } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/BoothDAO.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/BoothDAO.java index b86c0cb..da1f7ab 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/BoothDAO.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/BoothDAO.java @@ -5,28 +5,54 @@ import dev.imabad.mceventsuite.core.api.objects.EventPlayer; import dev.imabad.mceventsuite.core.api.objects.EventRank; import dev.imabad.mceventsuite.core.modules.mysql.MySQLDatabase; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.Query; - -import javax.persistence.NoResultException; -import javax.persistence.TypedQuery; +import dev.imabad.mceventsuite.core.util.GsonUtils; +import dev.imabad.mceventsuite.core.util.PropertyMap; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; +import redis.clients.jedis.Transaction; +//TODO: Move into booths module public class BoothDAO extends DAO { public BoothDAO(MySQLDatabase mySQLDatabase){ super(mySQLDatabase); } - public List getBooths(){ - Session session = mySQLDatabase.getSession(); - try { - return session.createQuery("select r from EventBooth r LEFT JOIN FETCH r.owner.permissions e", EventBooth.class).list(); - } finally { - session.close(); + public Collection getBooths(int perPage, int page){ + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM booths INNER JOIN booths_players ON booths.id=booths_players.EventBooth_id LIMIT ? OFFSET ?"); + statement.setInt(1, perPage); + statement.setInt(2, (perPage * page) - perPage); + ResultSet resultSet = statement.executeQuery(); + Map boothMap = new HashMap<>(); + while(resultSet.next()){ + String uuid = resultSet.getString("id"); + EventBooth eventBooth = boothMap.get(uuid); + if(eventBooth == null){ + String boothType = resultSet.getString("boothType"); + String name = resultSet.getString("name"); + String plotID = resultSet.getString("plotID"); + String status = resultSet.getString("status"); + String ownerUUID = resultSet.getString("owner_uuid"); + EventPlayer owner = mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString(ownerUUID)); + List members = new ArrayList<>(); + eventBooth = new EventBooth(uuid, name, boothType, owner, members, plotID, status); + boothMap.put(uuid, eventBooth); + } + eventBooth.getMembers().add(mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString("members_uuid"))); + } + return boothMap.values(); + } catch (SQLException throwables) { + return Collections.emptyList(); } } @@ -40,28 +66,81 @@ public List getPlots(){ } public EventBooth getBoothFromID(UUID uuid){ - try(Session session = mySQLDatabase.getSession()){ - Query boothQuery = session.createQuery("select r from EventBooth r LEFT JOIN FETCH r.owner.permissions e where r.id = :uuid ", EventBooth.class); - boothQuery.setParameter("uuid", uuid.toString()); - return boothQuery.getSingleResult(); + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM booths INNER JOIN booths_players ON booths.id=booths_players.EventBooth_id WHERE id = ?"); + statement.setString(1, uuid.toString()); + ResultSet resultSet = statement.executeQuery(); + EventBooth booth = null; + while(resultSet.next()){ + if(booth == null){ + String boothType = resultSet.getString("boothType"); + String name = resultSet.getString("name"); + String plotID = resultSet.getString("plotID"); + String status = resultSet.getString("status"); + String ownerUUID = resultSet.getString("owner_uuid"); + EventPlayer owner = mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString(ownerUUID)); + List members = new ArrayList<>(); + booth = new EventBooth(uuid.toString(), name, boothType, owner, members, plotID, status); + } + booth.getMembers().add(mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString("members_uuid"))); + } + return booth; + } catch (SQLException throwables) { + return null; } } - public List getPlayerBooths(EventPlayer player){ - try(Session session = mySQLDatabase.getSession()){ - Query boothQuery = session.createQuery("select r from EventBooth r where :player MEMBER OF r.members OR r.owner = :player", EventBooth.class); - boothQuery.setParameter("player", player); - return boothQuery.getResultList(); + public Collection getPlayerBooths(EventPlayer player){ + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM booths INNER JOIN booths_players ON booths.id=booths_players.EventBooth_id WHERE owner_uuid = ? OR WHERE booths.id IN (SELECT EventBooth_id FROM booths_players WHERE booths_players.members_uuid = ?)"); + statement.setString(1, player.getUUID().toString()); + statement.setString(2, player.getUUID().toString()); + ResultSet resultSet = statement.executeQuery(); + Map boothMap = new HashMap<>(); + while(resultSet.next()){ + String uuid = resultSet.getString("id"); + EventBooth eventBooth = boothMap.get(uuid); + if(eventBooth == null){ + String boothType = resultSet.getString("boothType"); + String name = resultSet.getString("name"); + String plotID = resultSet.getString("plotID"); + String status = resultSet.getString("status"); + String ownerUUID = resultSet.getString("owner_uuid"); + EventPlayer owner = mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString(ownerUUID)); + List members = new ArrayList<>(); + eventBooth = new EventBooth(uuid, name, boothType, owner, members, plotID, status); + boothMap.put(uuid, eventBooth); + } + eventBooth.getMembers().add(mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString("members_uuid"))); + } + return boothMap.values(); + } catch (SQLException throwables) { + return Collections.emptyList(); } } public EventBooth getBoothFromPlotID(String type, String plotID){ - try(Session session = mySQLDatabase.getSession()){ - Query boothQuery = session.createQuery("select r from EventBooth r where r.boothType = :type and r.plotID = :plotID", EventBooth.class); - boothQuery.setParameter("type", type); - boothQuery.setParameter("plotID", plotID); - return boothQuery.getSingleResult(); - }catch(Exception e){ + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM booths INNER JOIN booths_players ON booths.id=booths_players.EventBooth_id WHERE boothType = ? AND plotID = ?"); + statement.setString(1, type); + statement.setString(2, plotID); + ResultSet resultSet = statement.executeQuery(); + EventBooth booth = null; + while(resultSet.next()){ + if(booth == null){ + String boothType = resultSet.getString("boothType"); + String uuid = resultSet.getString("uuid"); + String name = resultSet.getString("name"); + String status = resultSet.getString("status"); + String ownerUUID = resultSet.getString("owner_uuid"); + EventPlayer owner = mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString(ownerUUID)); + List members = new ArrayList<>(); + booth = new EventBooth(uuid, name, boothType, owner, members, plotID, status); + } + booth.getMembers().add(mySQLDatabase.getDAO(PlayerDAO.class).getPlayer(UUID.fromString("members_uuid"))); + } + return booth; + } catch (SQLException throwables) { return null; } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/PlayerDAO.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/PlayerDAO.java index 423db69..dea97ca 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/PlayerDAO.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/PlayerDAO.java @@ -1,15 +1,22 @@ package dev.imabad.mceventsuite.core.modules.mysql.dao; import dev.imabad.mceventsuite.core.api.objects.EventPlayer; +import dev.imabad.mceventsuite.core.api.objects.EventRank; import dev.imabad.mceventsuite.core.modules.mysql.MySQLDatabase; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.Query; - -import javax.persistence.NoResultException; +import dev.imabad.mceventsuite.core.util.GsonUtils; +import dev.imabad.mceventsuite.core.util.PropertyMap; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; public class PlayerDAO extends DAO { @@ -17,19 +24,40 @@ public PlayerDAO(MySQLDatabase mySQLDatabase) { super(mySQLDatabase); } + public Collection getPlayers(){ + return getPlayers(20, 1); + } + /** - * Get all players + * Get X amount of players offset by page * @return A list of players * @see EventPlayer */ - public List getPlayers(){ - try (Session session = mySQLDatabase.getSession()) { - Query q= session.createQuery("select p FROM EventPlayer p LEFT JOIN FETCH p.permissions e", EventPlayer.class); - try { - return q.getResultList(); - } catch (NoResultException e) { - return Collections.emptyList(); + public Collection getPlayers(int perPage, int page){ + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM players INNER JOIN EventPlayer_permissions ON players.uuid=EventPlayer_permissions.EventPlayer_uuid LIMIT ? OFFSET ?"); + statement.setInt(1, perPage); + statement.setInt(2, (perPage * page) - perPage); + ResultSet resultSet = statement.executeQuery(); + Map playerMap = new HashMap<>(); + while(resultSet.next()){ + String uuid = resultSet.getString("uuid"); + EventPlayer eventPlayer = playerMap.get(uuid); + if(eventPlayer == null){ + String lastUsername = resultSet.getString("last_username"); + String properties = resultSet.getString("properties"); + int rankID = resultSet.getInt("rank_id"); + EventRank rank = mySQLDatabase.getDAO(RankDAO.class).getRankByID(rankID); + List permissions = new ArrayList<>(); + PropertyMap propertyMap = GsonUtils.getGson().fromJson(properties, PropertyMap.class); + eventPlayer = new EventPlayer(UUID.fromString(uuid), lastUsername, rank, permissions, propertyMap); + playerMap.put(uuid, eventPlayer); + } + eventPlayer.getPermissions().add(resultSet.getString("permissions")); } + return playerMap.values(); + } catch (SQLException throwables) { + return Collections.emptyList(); } } @@ -48,7 +76,7 @@ public EventPlayer getOrCreatePlayer(UUID uuid, String username){ eventPlayer = getPlayer(username); if (eventPlayer == null) { eventPlayer = new EventPlayer(uuid, username); - savePlayer(eventPlayer); + saveNewPlayer(eventPlayer); } else { if(!eventPlayer.getUUID().equals(uuid)){ eventPlayer.setUUID(uuid); @@ -67,14 +95,27 @@ public EventPlayer getOrCreatePlayer(UUID uuid, String username){ * @see EventPlayer */ public EventPlayer getPlayer(UUID uuid){ - try (Session session = mySQLDatabase.getSession()) { - Query q= session.createQuery("select p FROM EventPlayer p LEFT JOIN FETCH p.permissions e WHERE p.UUID = :uuid", EventPlayer.class); - q.setParameter("uuid", uuid); - try { - return q.getSingleResult(); - } catch (NoResultException e) { - return null; + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM players INNER JOIN EventPlayer_permissions ON players.uuid=EventPlayer_permissions.EventPlayer_uuid WHERE uuid = ?"); + statement.setString(1, uuid.toString()); + ResultSet resultSet = statement.executeQuery(); + EventPlayer player = null; + while(resultSet.next()){ + if(player == null){ + String lastUsername = resultSet.getString("last_username"); + String properties = resultSet.getString("properties"); + int rankID = resultSet.getInt("rank_id"); + EventRank rank = mySQLDatabase.getDAO(RankDAO.class).getRankByID(rankID); + List permissions = new ArrayList<>(); + PropertyMap propertyMap = GsonUtils.getGson().fromJson(properties, PropertyMap.class); + player = new EventPlayer(uuid, lastUsername, rank, permissions, propertyMap); + } + player.getPermissions().add(resultSet.getString("permissions")); } + return player; + } catch (SQLException e){ + e.printStackTrace(); + return null; } } @@ -87,57 +128,110 @@ public EventPlayer getPlayer(UUID uuid){ * @see EventPlayer */ public EventPlayer getPlayer(String username){ - try(Session session = mySQLDatabase.getSession()) { - System.out.println("Checking for player with username: " + username); - Query q = session.createQuery("select p FROM EventPlayer p LEFT JOIN FETCH p.permissions e WHERE p.lastUsername = :username", - EventPlayer.class); - q.setParameter("username", username); - try { - return q.getSingleResult(); - } catch (NoResultException e) { - return null; + try (Connection connection = mySQLDatabase.getSession()) { + PreparedStatement statement = connection.prepareStatement("SELECT * FROM players INNER JOIN EventPlayer_permissions ON players.uuid=EventPlayer_permissions.EventPlayer_uuid WHERE last_username = ?"); + statement.setString(1, username); + ResultSet resultSet = statement.executeQuery(); + EventPlayer player = null; + while(resultSet.next()){ + if(player == null){ + String uuid = resultSet.getString("uuid"); + String properties = resultSet.getString("properties"); + int rankID = resultSet.getInt("rank_id"); + EventRank rank = mySQLDatabase.getDAO(RankDAO.class).getRankByID(rankID); + List permissions = new ArrayList<>(); + PropertyMap propertyMap = GsonUtils.getGson().fromJson(properties, PropertyMap.class); + player = new EventPlayer(UUID.fromString(uuid), username, rank, permissions, propertyMap); + } + player.getPermissions().add(resultSet.getString("permissions")); } + return player; + } catch (SQLException e){ + e.printStackTrace(); + return null; } } - /** - * Saves an EventPlayer to the database - * You should avoid this where possible and ask the central service to do this for you - * @param player - The EventPlayer you wish to save - */ - @Deprecated - public void saveOrUpdatePlayer(EventPlayer player){ - Transaction tx = null; - try (Session session = mySQLDatabase.getSession()) { - tx = session.beginTransaction(); - session.saveOrUpdate(player); - tx.commit(); // Flush happens automatically - } catch (RuntimeException e) { - assert tx != null; - tx.rollback(); + public boolean saveNewPlayer(EventPlayer player){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?);"); + insertStatement.setString(1, player.getUUID().toString()); + insertStatement.setString(2, player.getLastUsername()); + insertStatement.setString(3, GsonUtils.getGson().toJson(player.getProperties())); + insertStatement.setInt(4, player.getRank().getId()); + if(insertStatement.executeUpdate() == 0){ + return false; + } + updatePlayerPermissions(player, false); + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); } + return false; } - /** - * Saves an EventPlayer to the database - * You should avoid this where possible and ask the central service to do this for you - * @param player - The EventPlayer you wish to save - */ - @Deprecated - public void savePlayer(EventPlayer player){ - Session session = mySQLDatabase.getSession(); - Transaction tx = null; - try { - tx = session.beginTransaction(); - session.save(player); - tx.commit(); // Flush happens automatically + public void savePlayer(EventPlayer eventPlayer){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("UPDATE players SET last_username = ?, properties = ?, rank_id = ? WHERE uuid = ?"); + insertStatement.setString(1, eventPlayer.getLastUsername()); + insertStatement.setString(2, GsonUtils.getGson().toJson(eventPlayer.getProperties())); + insertStatement.setInt(4, eventPlayer.getRank().getId()); + insertStatement.setString(4, eventPlayer.getUUID().toString()); + insertStatement.executeUpdate(); + updatePlayerPermissions(eventPlayer, true); + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); } - catch (RuntimeException e) { - tx.rollback(); - e.printStackTrace(); + } + + public Collection getPlayerPermissions(EventPlayer eventPlayer){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement selectStatement = connection.prepareStatement("SELECT permissions FROM EventPlayer_permissions WHERE EventPlayer_uuid = ?"); + selectStatement.setString(1, eventPlayer.getUUID().toString()); + ResultSet resultSet = selectStatement.executeQuery(); + Collection permissions = new ArrayList<>(); + while(resultSet.next()){ + permissions.add(resultSet.getString("permissions")); + } + return permissions; + }catch (SQLException e){ + return Collections.emptyList(); } - finally { - session.close(); + } + + public void updatePlayerPermissions(EventPlayer eventPlayer, boolean isUpdate){ + try(Connection connection = mySQLDatabase.getSession()){ + Collection toAdd = eventPlayer.getPermissions(); + if(isUpdate){ + Collection existingPermissions = getPlayerPermissions(eventPlayer); + toAdd = toAdd.stream().filter(s -> !existingPermissions.contains(s)).collect( + Collectors.toList()); + Collection toRemove = existingPermissions.stream().filter(s -> !eventPlayer.getPermissions().contains(s)).collect( + Collectors.toList()); + if(!toRemove.isEmpty()){ + PreparedStatement removeStatement = connection.prepareStatement("DELETE FROM EventPlayer_permissions WHERE EventPlayer_uuid = ? AND permissions IN (?)"); + removeStatement.setString(1, eventPlayer.getUUID().toString()); + removeStatement.setArray(2, connection.createArrayOf("VARCHAR", toRemove.toArray())); + removeStatement.executeUpdate(); + } + } + if(!toAdd.isEmpty()){ + PreparedStatement addStatement = connection.prepareStatement("INSERT INTO EventPlayer_permissions VALUES(?,?)"); + addStatement.setString(1, eventPlayer.getUUID().toString()); + toAdd.forEach(s -> { + try { + addStatement.setString(2, s); + addStatement.addBatch(); + } catch(SQLException exception){ + exception.printStackTrace(); + } + }); + addStatement.executeBatch(); + } + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); } } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/RankDAO.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/RankDAO.java index 0afabd6..cc402b2 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/RankDAO.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/RankDAO.java @@ -1,22 +1,24 @@ package dev.imabad.mceventsuite.core.modules.mysql.dao; -import dev.imabad.mceventsuite.core.api.objects.EventPlayer; import dev.imabad.mceventsuite.core.api.objects.EventRank; import dev.imabad.mceventsuite.core.modules.mysql.MySQLDatabase; -import javassist.NotFoundException; -import org.hibernate.Session; -import org.hibernate.Transaction; - -import javax.persistence.NoResultException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; public class RankDAO extends DAO { - private List ranks; + private Map ranks; public RankDAO(MySQLDatabase mySQLDatabase){ super(mySQLDatabase); @@ -26,44 +28,144 @@ public Optional getRankByName(String name){ if(ranks == null){ getRanks(true); } - return ranks.stream().filter(eventRank -> eventRank.getName().equalsIgnoreCase(name)).findFirst(); + return ranks.values().stream().filter(eventRank -> eventRank.getName().equalsIgnoreCase(name)).findFirst(); } - public List getRanks(){ - if(ranks != null){ + public Map getRanks(boolean forceRefresh){ + if(ranks != null && !forceRefresh){ return ranks; } - Session session = mySQLDatabase.getSession(); - try { - ranks = session.createQuery("select r from EventRank r", EventRank.class).list(); + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement statement = connection.prepareStatement("SELECT * FROM ranks INNER JOIN EventRank_permissions ON ranks.id=EventRank_permissions.EventRank_id"); + ResultSet resultSet = statement.executeQuery(); + Map rankMap = new HashMap<>(); + while(resultSet.next()){ + int id = resultSet.getInt("id"); + EventRank rank = rankMap.get(id); + if(rank == null){ + String name = resultSet.getString("name"); + boolean inheritsFromBelow = resultSet.getBoolean("inheritsFromBelow"); + int power = resultSet.getInt("power"); + String prefix = resultSet.getString("prefix"); + String suffix = resultSet.getString("suffix"); + String chatColor = resultSet.getString("chatColor"); + List permissions = new ArrayList<>(); + rank = new EventRank(id, power, name, prefix, suffix, permissions, inheritsFromBelow, chatColor); + rankMap.put(id, rank); + } + rank.getPermissions().add(resultSet.getString("permissions")); + } + ranks = rankMap; return ranks; - } finally { - session.close(); + } catch(SQLException sqlException){ + sqlException.printStackTrace(); + return Collections.emptyMap(); } } - public List getRanks(boolean refresh){ - if(!refresh){ - return getRanks(); + public EventRank getRankByID(int id){ + return getRanks().get(id); + } + + public Map getRanks(){ + return getRanks(false); + } + + public boolean insertRank(EventRank rank){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("INSERT INTO ranks (power, name, inheritsFromBelow, prefix, suffix, chatColor) VALUES (?, ?, ?, ?, ?, ?);"); + insertStatement.setInt(1, rank.getPower()); + insertStatement.setString(2, rank.getName()); + insertStatement.setBoolean(3, rank.isInheritsFromBelow()); + insertStatement.setString(4, rank.getPrefix()); + insertStatement.setString(5, rank.getSuffix()); + insertStatement.setString(6, rank.getChatColor()); + if(insertStatement.executeUpdate() == 0){ + return false; + } + try (ResultSet generatedKeys = insertStatement.getGeneratedKeys()) { + if (generatedKeys.next()) { + int newID = generatedKeys.getInt(1); + rank.setId(newID); + updateRankPermissions(rank); + return true; + } + else { + throw new SQLException("Creating user failed, no ID obtained."); + } + } + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); } - Session session = mySQLDatabase.getSession(); - try { - ranks = session.createQuery("select r from EventRank r", EventRank.class).list(); - return ranks; - } finally { - session.close(); + return false; + } + + public void updateRank(EventRank rank){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("UPDATE ranks SET power = ?, name = ?, inheritsFromBelow = ?, prefix = ? suffix = ?, chatColor = ? WHERE id = ?"); + insertStatement.setInt(1, rank.getPower()); + insertStatement.setString(2, rank.getName()); + insertStatement.setBoolean(3, rank.isInheritsFromBelow()); + insertStatement.setString(4, rank.getPrefix()); + insertStatement.setString(5, rank.getSuffix()); + insertStatement.setString(6, rank.getChatColor()); + insertStatement.setInt(7, rank.getId()); + insertStatement.executeUpdate(); + updateRankPermissions(rank); + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); + } + } + + public Collection getRankPermissions(EventRank rank){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement selectStatement = connection.prepareStatement("SELECT permissions FROM EventRank_permissions WHERE EventRank_id = ?"); + selectStatement.setInt(1, rank.getId()); + ResultSet resultSet = selectStatement.executeQuery(); + Collection permissions = new ArrayList<>(); + while(resultSet.next()){ + permissions.add(resultSet.getString("permissions")); + } + return permissions; + }catch (SQLException e){ + return Collections.emptyList(); } } - public void saveRank(EventRank rank){ - Transaction tx = null; - try (Session session = mySQLDatabase.getSession()) { - tx = session.beginTransaction(); - session.saveOrUpdate(rank); - tx.commit(); // Flush happens automatically - } catch (RuntimeException e) { - assert tx != null; - tx.rollback(); + public void updateRankPermissions(EventRank rank){ + try(Connection connection = mySQLDatabase.getSession()){ + Collection toAdd = rank.getPermissions(); + if(rank.getId() != 0){ + Collection existingPermissions = getRankPermissions(rank); + toAdd = toAdd.stream().filter(s -> !existingPermissions.contains(s)).collect( + Collectors.toList()); + Collection toRemove = existingPermissions.stream().filter(s -> !rank.getPermissions().contains(s)).collect( + Collectors.toList()); + if(!toRemove.isEmpty()){ + PreparedStatement removeStatement = connection.prepareStatement("DELETE FROM EventRank_permissions WHERE EventRank_id = ? AND permissions IN (?)"); + removeStatement.setInt(1, rank.getId()); + removeStatement.setArray(2, connection.createArrayOf("VARCHAR", toRemove.toArray())); + removeStatement.executeUpdate(); + } + } + if(!toAdd.isEmpty()){ + PreparedStatement addStatement = connection.prepareStatement("INSERT INTO EventRank_permissions VALUES(?,?)"); + addStatement.setInt(1, rank.getId()); + toAdd.forEach(s -> { + try { + addStatement.setString(2, s); + addStatement.addBatch(); + } catch(SQLException exception){ + exception.printStackTrace(); + } + }); + addStatement.executeBatch(); + } + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); } } @@ -74,6 +176,6 @@ public Optional getLowestRank(){ if(ranks.size() < 1){ return Optional.of(new EventRank(0, "Default", "", "", Collections.emptyList())); } - return ranks.stream().min(Comparator.comparingInt(EventRank::getPower)); + return ranks.values().stream().min(Comparator.comparingInt(EventRank::getPower)); } } diff --git a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/SettingDAO.java b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/SettingDAO.java index 3b7ef99..3b8b02a 100644 --- a/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/SettingDAO.java +++ b/src/main/java/dev/imabad/mceventsuite/core/modules/mysql/dao/SettingDAO.java @@ -2,11 +2,10 @@ import dev.imabad.mceventsuite.core.api.objects.EventSetting; import dev.imabad.mceventsuite.core.modules.mysql.MySQLDatabase; -import org.hibernate.Session; -import org.hibernate.query.Query; - -import javax.persistence.NoResultException; -import java.util.UUID; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; public class SettingDAO extends DAO { @@ -24,10 +23,21 @@ public SettingDAO(MySQLDatabase mySQLDatabase) { * @see EventSetting */ public EventSetting getSetting(String group, String name){ - try(Session session = mySQLDatabase.getSession()) { - Query query = session.createQuery("SELECT s FROM EventSetting s WHERE s.group = :group AND s.name = :name", EventSetting.class).setParameter("group", group).setParameter("name", name); - return query.getSingleResult(); + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM event_settings WHERE event_settings.group = ? AND event_settings.name = ?"); + preparedStatement.setString(1, group); + preparedStatement.setString(2, name); + ResultSet resultSet = preparedStatement.executeQuery(); + if(resultSet.next()) { + return new EventSetting(resultSet.getString("group"), resultSet.getString("name"), resultSet.getString("value"), resultSet.getString("permission")); + } else { + return null; + } + }catch(SQLException e){ + //TODO: Better logging + e.printStackTrace(); } + return null; } /** @@ -39,25 +49,65 @@ public EventSetting getSetting(String group, String name){ * @see EventSetting */ public EventSetting getSetting(EventSetting eventSetting){ - try(Session session = mySQLDatabase.getSession()) { - Query query = session.createQuery("SELECT s FROM EventSetting s WHERE s.group = :group AND s.name = :name", EventSetting.class).setParameter("group", eventSetting.getGroup()).setParameter("name", eventSetting.getName()); - try { - return query.getSingleResult(); - } catch (NoResultException e) { - return eventSetting; - } + EventSetting dbSetting = getSetting(eventSetting.getGroup(), eventSetting.getName()); + if(dbSetting == null){ + return eventSetting; } + return dbSetting; } /** - * Saves a setting to the database + * Saves a new setting to the database * @param eventSetting The setting to save * @see EventSetting */ - public void saveSetting(EventSetting eventSetting){ - try(Session session = mySQLDatabase.getSession()) { - session.save(eventSetting); + public boolean saveNewSetting(EventSetting eventSetting){ + if(settingExists(eventSetting)){ + return saveSetting(eventSetting); + } + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("INSERT INTO event_settings VALUES (?, ?, ?, ?);"); + insertStatement.setString(1, eventSetting.getName()); + insertStatement.setString(2, eventSetting.getGroup()); + insertStatement.setString(3, eventSetting.getPermission()); + insertStatement.setString(4, eventSetting.getValueJSON()); + return insertStatement.executeUpdate() != 0; + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); + } + return false; + } + + public boolean saveSetting(EventSetting eventSetting){ + if(!settingExists(eventSetting)){ + return saveNewSetting(eventSetting); + } + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement insertStatement = connection.prepareStatement("UPDATE event_settings SET value = ? WHERE group = ? AND name = ?;"); + insertStatement.setString(1, eventSetting.getValueJSON()); + insertStatement.setString(2, eventSetting.getGroup()); + insertStatement.setString(3, eventSetting.getName()); + return insertStatement.executeUpdate() != 0; + }catch(SQLException exception){ + //TODO: Add proper logging + exception.printStackTrace(); + } + return false; + } + + public boolean settingExists(EventSetting setting){ + try(Connection connection = mySQLDatabase.getSession()){ + PreparedStatement preparedStatement = connection.prepareStatement("SELECT value FROM event_settings WHERE event_settings.group = ? AND event_settings.name = ?"); + preparedStatement.setString(1, setting.getGroup()); + preparedStatement.setString(2, setting.getName()); + ResultSet resultSet = preparedStatement.executeQuery(); + return resultSet.next(); + }catch(SQLException e){ + //TODO: Better logging + e.printStackTrace(); } + return false; } }