From 8ddfe05dd65706214689e268562e99628b06f69c Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 4 Apr 2021 14:54:54 +0200 Subject: [PATCH] refactor: use try-with-resources for cash shop db operations --- src/main/java/server/CashShop.java | 306 ++++++++++++----------------- 1 file changed, 129 insertions(+), 177 deletions(-) diff --git a/src/main/java/server/CashShop.java b/src/main/java/server/CashShop.java index 1eb541e05d..cdf024f316 100644 --- a/src/main/java/server/CashShop.java +++ b/src/main/java/server/CashShop.java @@ -21,36 +21,27 @@ along with this program. If not, see . */ package server; -import java.io.File; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.locks.Lock; - +import client.inventory.*; import config.YamlConfig; +import constants.inventory.ItemConstants; import net.server.Server; +import net.server.audit.locks.MonitoredLockType; import net.server.audit.locks.factory.MonitoredReentrantLockFactory; - import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import tools.DatabaseConnection; import tools.Pair; -import client.inventory.Equip; -import client.inventory.Item; -import client.inventory.ItemFactory; -import client.inventory.MapleInventoryType; -import client.inventory.MaplePet; -import constants.inventory.ItemConstants; -import java.util.Collections; -import net.server.audit.locks.MonitoredLockType; + +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.locks.Lock; /* * @author Flav @@ -99,7 +90,7 @@ public class CashShop { if (ItemConstants.isPet(itemId)) { petid = MaplePet.createPet(itemId); } - + if (ItemConstants.getInventoryType(itemId).equals(MapleInventoryType.EQUIP)) { item = MapleItemInformationProvider.getInstance().getEquipById(itemId); } else { @@ -107,28 +98,28 @@ public class CashShop { } if (ItemConstants.EXPIRING_ITEMS) { - if(period == 1) { - if(itemId == 5211048 || itemId == 5360042) { // 4 Hour 2X coupons, the period is 1, but we don't want them to last a day. - item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 4)); + if (period == 1) { + if (itemId == 5211048 || itemId == 5360042) { // 4 Hour 2X coupons, the period is 1, but we don't want them to last a day. + item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 4)); /* } else if(itemId == 5211047 || itemId == 5360014) { // 3 Hour 2X coupons, unused as of now item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 3)); */ - } else if(itemId == 5211060) { // 2 Hour 3X coupons. - item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 2)); - } else { - item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 24)); - } + } else if (itemId == 5211060) { // 2 Hour 3X coupons. + item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 2)); } else { - item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 24 * period)); + item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 24)); } + } else { + item.setExpiration(Server.getInstance().getCurrentTime() + (1000 * 60 * 60 * 24 * period)); + } } - + item.setSN(sn); return item; } } - + public static class SpecialCashItem { private int sn, modifier; private byte info; //? @@ -181,43 +172,33 @@ public class CashShop { packages.put(Integer.parseInt(cashPackage.getName()), cPackage); } - - for(Entry e : items.entrySet()) { - if(e.getValue().isOnSale()) { + + for (Entry e : items.entrySet()) { + if (e.getValue().isOnSale()) { randomitemsns.add(e.getKey()); } } - - PreparedStatement ps = null; - ResultSet rs = null; - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - ps = con.prepareStatement("SELECT * FROM specialcashitems"); - rs = ps.executeQuery(); + + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT * FROM specialcashitems"); + ResultSet rs = ps.executeQuery()) { while (rs.next()) { specialcashitems.add(new SpecialCashItem(rs.getInt("sn"), rs.getInt("modifier"), rs.getByte("info"))); } } catch (SQLException ex) { ex.printStackTrace(); - } finally { - try { - if (rs != null && !rs.isClosed()) rs.close(); - if (ps != null && !ps.isClosed()) ps.close(); - if (con != null && !con.isClosed()) con.close(); - } catch (SQLException ex) { - ex.printStackTrace(); - } } } public static CashItem getRandomCashItem() { - if(randomitemsns.isEmpty()) return null; - - int rnd = (int)(Math.random() * randomitemsns.size()); + if (randomitemsns.isEmpty()) { + return null; + } + + int rnd = (int) (Math.random() * randomitemsns.size()); return items.get(randomitemsns.get(rnd)); } - + public static CashItem getItem(int sn) { return items.get(sn); } @@ -239,33 +220,21 @@ public class CashShop { public static List getSpecialCashItems() { return specialcashitems; } - + public static void reloadSpecialCashItems() {//Yay? specialcashitems.clear(); - PreparedStatement ps = null; - ResultSet rs = null; - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - ps = con.prepareStatement("SELECT * FROM specialcashitems"); - rs = ps.executeQuery(); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT * FROM specialcashitems"); + ResultSet rs = ps.executeQuery()) { while (rs.next()) { specialcashitems.add(new SpecialCashItem(rs.getInt("sn"), rs.getInt("modifier"), rs.getByte("info"))); } } catch (SQLException ex) { ex.printStackTrace(); - } finally { - try { - if (rs != null && !rs.isClosed()) rs.close(); - if (ps != null && !ps.isClosed()) ps.close(); - if (con != null && !con.isClosed()) con.close(); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } + } } } - + private int accountId, characterId, nxCredit, maplePoint, nxPrepaid; private boolean opened; private ItemFactory factory; @@ -290,42 +259,32 @@ public class CashShop { factory = ItemFactory.CASH_OVERALL; } - Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = null; - ResultSet rs = null; - try { - ps = con.prepareStatement("SELECT `nxCredit`, `maplePoint`, `nxPrepaid` FROM `accounts` WHERE `id` = ?"); - ps.setInt(1, accountId); - rs = ps.executeQuery(); + try (Connection con = DatabaseConnection.getConnection()) { + try (PreparedStatement ps = con.prepareStatement("SELECT `nxCredit`, `maplePoint`, `nxPrepaid` FROM `accounts` WHERE `id` = ?")) { + ps.setInt(1, accountId); - if (rs.next()) { - this.nxCredit = rs.getInt("nxCredit"); - this.maplePoint = rs.getInt("maplePoint"); - this.nxPrepaid = rs.getInt("nxPrepaid"); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + this.nxCredit = rs.getInt("nxCredit"); + this.maplePoint = rs.getInt("maplePoint"); + this.nxPrepaid = rs.getInt("nxPrepaid"); + } + } } - rs.close(); - ps.close(); - for (Pair item : factory.loadItems(accountId, false)) { inventory.add(item.getLeft()); } - ps = con.prepareStatement("SELECT `sn` FROM `wishlists` WHERE `charid` = ?"); - ps.setInt(1, characterId); - rs = ps.executeQuery(); + try (PreparedStatement ps = con.prepareStatement("SELECT `sn` FROM `wishlists` WHERE `charid` = ?")) { + ps.setInt(1, characterId); - while (rs.next()) { - wishList.add(rs.getInt("sn")); + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + wishList.add(rs.getInt("sn")); + } + } } - - rs.close(); - ps.close(); - con.close(); - } finally { - if (ps != null && !ps.isClosed()) ps.close(); - if (rs != null && !rs.isClosed()) rs.close(); - if (con != null && !con.isClosed()) con.close(); } } @@ -355,10 +314,12 @@ public class CashShop { break; } } - + public void gainCash(int type, CashItem buyItem, int world) { gainCash(type, -buyItem.getPrice()); - if(!YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) Server.getInstance().getWorld(world).addCashItemBought(buyItem.getSN()); + if (!YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) { + Server.getInstance().getWorld(world).addCashItemBought(buyItem.getSN()); + } } public boolean isOpened() { @@ -388,7 +349,7 @@ public class CashShop { } else { isRing = false; } - + if ((item.getPetId() > -1 ? item.getPetId() : isRing ? equip.getRingId() : item.getCashId()) == cashId) { return item; } @@ -432,70 +393,58 @@ public class CashShop { } public void gift(int recipient, String from, String message, int sn, int ringid) { - PreparedStatement ps = null; - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - ps = con.prepareStatement("INSERT INTO `gifts` VALUES (DEFAULT, ?, ?, ?, ?, ?)"); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("INSERT INTO `gifts` VALUES (DEFAULT, ?, ?, ?, ?, ?)")) { ps.setInt(1, recipient); ps.setString(2, from); ps.setString(3, message); ps.setInt(4, sn); ps.setInt(5, ringid); ps.executeUpdate(); - con.close(); } catch (SQLException sqle) { sqle.printStackTrace(); - } finally { - try { - if (ps != null && !ps.isClosed()) ps.close(); - if (con != null && !con.isClosed()) con.close(); - } catch (SQLException ex) { - ex.printStackTrace(); - } } } public List> loadGifts() { List> gifts = new ArrayList<>(); - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT * FROM `gifts` WHERE `to` = ?"); - ps.setInt(1, characterId); - ResultSet rs = ps.executeQuery(); + try (Connection con = DatabaseConnection.getConnection()) { - while (rs.next()) { - notes++; - CashItem cItem = CashItemFactory.getItem(rs.getInt("sn")); - Item item = cItem.toItem(); - Equip equip = null; - item.setGiftFrom(rs.getString("from")); - if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) { - equip = (Equip) item; - equip.setRingId(rs.getInt("ringid")); - gifts.add(new Pair(equip, rs.getString("message"))); - } else - gifts.add(new Pair<>(item, rs.getString("message"))); + try (PreparedStatement ps = con.prepareStatement("SELECT * FROM `gifts` WHERE `to` = ?")) { + ps.setInt(1, characterId); - if (CashItemFactory.isPackage(cItem.getItemId())) { //Packages never contains a ring - for (Item packageItem : CashItemFactory.getPackage(cItem.getItemId())) { - packageItem.setGiftFrom(rs.getString("from")); - addToInventory(packageItem); + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + notes++; + CashItem cItem = CashItemFactory.getItem(rs.getInt("sn")); + Item item = cItem.toItem(); + Equip equip = null; + item.setGiftFrom(rs.getString("from")); + if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) { + equip = (Equip) item; + equip.setRingId(rs.getInt("ringid")); + gifts.add(new Pair<>(equip, rs.getString("message"))); + } else { + gifts.add(new Pair<>(item, rs.getString("message"))); + } + + if (CashItemFactory.isPackage(cItem.getItemId())) { //Packages never contains a ring + for (Item packageItem : CashItemFactory.getPackage(cItem.getItemId())) { + packageItem.setGiftFrom(rs.getString("from")); + addToInventory(packageItem); + } + } else { + addToInventory(equip == null ? item : equip); + } } - } else { - addToInventory(equip == null ? item : equip); } } - rs.close(); - ps.close(); - ps = con.prepareStatement("DELETE FROM `gifts` WHERE `to` = ?"); - ps.setInt(1, characterId); - ps.executeUpdate(); - ps.close(); - con.close(); + try (PreparedStatement ps = con.prepareStatement("DELETE FROM `gifts` WHERE `to` = ?")) { + ps.setInt(1, characterId); + ps.executeUpdate(); + } } catch (SQLException sqle) { sqle.printStackTrace(); } @@ -512,13 +461,14 @@ public class CashShop { } public void save(Connection con) throws SQLException { - PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `nxCredit` = ?, `maplePoint` = ?, `nxPrepaid` = ? WHERE `id` = ?"); - ps.setInt(1, nxCredit); - ps.setInt(2, maplePoint); - ps.setInt(3, nxPrepaid); - ps.setInt(4, accountId); - ps.executeUpdate(); - ps.close(); + try (PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `nxCredit` = ?, `maplePoint` = ?, `nxPrepaid` = ? WHERE `id` = ?")) { + ps.setInt(1, nxCredit); + ps.setInt(2, maplePoint); + ps.setInt(3, nxPrepaid); + ps.setInt(4, accountId); + ps.executeUpdate(); + } + List> itemsWithType = new ArrayList<>(); List inv = getInventory(); @@ -527,53 +477,55 @@ public class CashShop { } factory.saveItems(itemsWithType, accountId, con); - ps = con.prepareStatement("DELETE FROM `wishlists` WHERE `charid` = ?"); - ps.setInt(1, characterId); - ps.executeUpdate(); - ps.close(); - ps = con.prepareStatement("INSERT INTO `wishlists` VALUES (DEFAULT, ?, ?)"); - ps.setInt(1, characterId); - for (int sn : wishList) { - ps.setInt(2, sn); + try (PreparedStatement ps = con.prepareStatement("DELETE FROM `wishlists` WHERE `charid` = ?")) { + ps.setInt(1, characterId); ps.executeUpdate(); } - ps.close(); + try (PreparedStatement ps = con.prepareStatement("INSERT INTO `wishlists` VALUES (DEFAULT, ?, ?)")) { + ps.setInt(1, characterId); + + for (int sn : wishList) { + // TODO: batch insert + ps.setInt(2, sn); + ps.executeUpdate(); + } + } } - + private Item getCashShopItemByItemid(int itemid) { lock.lock(); try { - for(Item it : inventory) { - if(it.getItemId() == itemid) { + for (Item it : inventory) { + if (it.getItemId() == itemid) { return it; } } } finally { lock.unlock(); } - + return null; } - + public synchronized Pair openCashShopSurprise() { Item css = getCashShopItemByItemid(5222000); - - if(css != null) { + + if (css != null) { CashItem cItem = CashItemFactory.getRandomCashItem(); - - if(cItem != null) { - if(css.getQuantity() > 1) { + + if (cItem != null) { + if (css.getQuantity() > 1) { /* if(NOT ENOUGH SPACE) { looks like we're not dealing with cash inventory limit whatsoever, k then return null; } */ - + css.setQuantity((short) (css.getQuantity() - 1)); } else { removeFromInventory(css); } - + Item item = cItem.toItem(); addToInventory(item); @@ -585,7 +537,7 @@ public class CashShop { return null; } } - + public static Item generateCouponItem(int itemId, short quantity) { CashItem it = new CashItem(77777777, itemId, 7777, ItemConstants.isPet(itemId) ? 30 : 0, quantity, true); return it.toItem();