Skip to content

Commit 99a3dbc

Browse files
committed
Await storage updates during item removal
1 parent 125f710 commit 99a3dbc

6 files changed

Lines changed: 62 additions & 60 deletions

File tree

API/src/main/java/fr/maxlego08/zauctionhouse/api/AuctionManager.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ public interface AuctionManager {
6565

6666
void removeCache(Player player);
6767

68-
void removeListedItem(Player player, Item item);
68+
java.util.concurrent.CompletableFuture<Void> removeListedItem(Player player, Item item);
6969

70-
void removeOwnedItem(Player player, Item item);
70+
java.util.concurrent.CompletableFuture<Void> removeOwnedItem(Player player, Item item);
7171

72-
void removeExpiredItem(Player player, Item item);
72+
java.util.concurrent.CompletableFuture<Void> removeExpiredItem(Player player, Item item);
7373

74-
void removePurchasedItem(Player player, Item item);
74+
java.util.concurrent.CompletableFuture<Void> removePurchasedItem(Player player, Item item);
7575

7676
void adminRemoveItem(Player admin, java.util.UUID targetUniqueId, Item item, StorageType storageType);
7777

API/src/main/java/fr/maxlego08/zauctionhouse/api/services/AuctionRemoveService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
public interface AuctionRemoveService {
77

8-
void removeListedItem(Player player, Item item);
8+
java.util.concurrent.CompletableFuture<Void> removeListedItem(Player player, Item item);
99

10-
void removeOwnedItem(Player player, Item item);
10+
java.util.concurrent.CompletableFuture<Void> removeOwnedItem(Player player, Item item);
1111

12-
void removeExpiredItem(Player player, Item item);
12+
java.util.concurrent.CompletableFuture<Void> removeExpiredItem(Player player, Item item);
1313

14-
void removePurchasedItem(Player player, Item item);
14+
java.util.concurrent.CompletableFuture<Void> removePurchasedItem(Player player, Item item);
1515

1616
}

API/src/main/java/fr/maxlego08/zauctionhouse/api/storage/StorageManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface StorageManager {
2727

2828
<T extends Repository> T with(Class<T> module);
2929

30-
void updateItem(Item item, StorageType storageType);
30+
java.util.concurrent.CompletableFuture<Void> updateItem(Item item, StorageType storageType);
3131

3232
void log(LogType logType, int itemId, Player player, UUID targetUniqueId, BigDecimal price, String economyName, String additionalData);
3333

src/main/java/fr/maxlego08/zauctionhouse/ZAuctionManager.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public void removeCache(Player player) {
223223
}
224224

225225
@Override
226-
public void removeListedItem(Player player, Item item) {
226+
public CompletableFuture<Void> removeListedItem(Player player, Item item) {
227227

228228
var configuration = this.plugin.getConfiguration();
229229
var storageManager = this.plugin.getStorageManager();
@@ -234,9 +234,11 @@ public void removeListedItem(Player player, Item item) {
234234
this.updateListedItems(item, false, player);
235235
clearPlayerCache(player, PlayerCacheKey.ITEMS_OWNED, PlayerCacheKey.ITEMS_EXPIRED); // Suppression du cache du joueur
236236

237+
CompletableFuture<Void> updateFuture;
238+
237239
if (configuration.getActions().listed().giveItem() && item.canReceiveItem(player)) {
238240

239-
storageManager.updateItem(item, StorageType.DELETED);
241+
updateFuture = storageManager.updateItem(item, StorageType.DELETED);
240242
giveItem(player, item);
241243

242244
} else {
@@ -246,7 +248,7 @@ public void removeListedItem(Player player, Item item) {
246248
item.setExpiredAt(new Date(expiredAt));
247249

248250
addItem(StorageType.EXPIRED, item);
249-
storageManager.updateItem(item, StorageType.EXPIRED);
251+
updateFuture = storageManager.updateItem(item, StorageType.EXPIRED);
250252
}
251253

252254
message(this.plugin, player, Message.ITEM_REMOVE_LISTED, "%items%", item.getItemDisplay());
@@ -260,10 +262,12 @@ public void removeListedItem(Player player, Item item) {
260262
callEvent(new AuctionRemoveListedItemEvent(item, player));
261263

262264
logItemAction(LogType.REMOVE_LISTED, item, player, null, "removed_from_listed");
265+
266+
return updateFuture;
263267
}
264268

265269
@Override
266-
public void removeOwnedItem(Player player, Item item) {
270+
public CompletableFuture<Void> removeOwnedItem(Player player, Item item) {
267271

268272
var configuration = this.plugin.getConfiguration();
269273
var storageManager = this.plugin.getStorageManager();
@@ -274,7 +278,7 @@ public void removeOwnedItem(Player player, Item item) {
274278
this.updateListedItems(item, false, player);
275279
clearPlayerCache(player, PlayerCacheKey.ITEMS_OWNED, PlayerCacheKey.ITEMS_EXPIRED); // Suppression du cache du joueur
276280

277-
storageManager.updateItem(item, StorageType.DELETED);
281+
var updateFuture = storageManager.updateItem(item, StorageType.DELETED);
278282
giveItem(player, item);
279283

280284
message(this.plugin, player, Message.ITEM_REMOVE_OWNED, "%items%", item.getItemDisplay());
@@ -288,18 +292,20 @@ public void removeOwnedItem(Player player, Item item) {
288292
callEvent(new AuctionRemoveListedItemEvent(item, player));
289293

290294
logItemAction(LogType.REMOVE_OWNED, item, player, null, "removed_owned_item");
295+
296+
return updateFuture;
291297
}
292298

293299
@Override
294-
public void removeExpiredItem(Player player, Item item) {
300+
public CompletableFuture<Void> removeExpiredItem(Player player, Item item) {
295301

296302
var configuration = this.plugin.getConfiguration();
297303
var storageManager = this.plugin.getStorageManager();
298304

299305
removeItem(StorageType.EXPIRED, item);
300306
clearPlayerCache(player, PlayerCacheKey.ITEMS_EXPIRED);
301307

302-
storageManager.updateItem(item, StorageType.DELETED);
308+
var updateFuture = storageManager.updateItem(item, StorageType.DELETED);
303309
giveItem(player, item);
304310

305311
message(this.plugin, player, Message.ITEM_REMOVE_EXPIRED, "%items%", item.getItemDisplay());
@@ -313,18 +319,20 @@ public void removeExpiredItem(Player player, Item item) {
313319
callEvent(new AuctionRemoveExpiredItemEvent(item, player));
314320

315321
logItemAction(LogType.REMOVE_EXPIRED, item, player, null, "removed_expired_item");
322+
323+
return updateFuture;
316324
}
317325

318326
@Override
319-
public void removePurchasedItem(Player player, Item item) {
327+
public CompletableFuture<Void> removePurchasedItem(Player player, Item item) {
320328

321329
var configuration = this.plugin.getConfiguration();
322330
var storageManager = this.plugin.getStorageManager();
323331

324332
removeItem(StorageType.PURCHASED, item);
325333
clearPlayerCache(player, PlayerCacheKey.ITEMS_PURCHASED);
326334

327-
storageManager.updateItem(item, StorageType.DELETED);
335+
var updateFuture = storageManager.updateItem(item, StorageType.DELETED);
328336
giveItem(player, item);
329337

330338
message(this.plugin, player, Message.ITEM_REMOVE_PURCHASED, "%items%", item.getItemDisplay());
@@ -339,6 +347,8 @@ public void removePurchasedItem(Player player, Item item) {
339347

340348
logItemAction(LogType.REMOVE_PURCHASED, item, player, item.getSellerUniqueId(), "removed_purchased_item");
341349

350+
return updateFuture;
351+
342352
}
343353

344354
@Override

src/main/java/fr/maxlego08/zauctionhouse/services/RemoveService.java

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import fr.maxlego08.zauctionhouse.api.AuctionPlugin;
44
import fr.maxlego08.zauctionhouse.api.cache.PlayerCacheKey;
5-
import fr.maxlego08.zauctionhouse.api.cluster.LockToken;
65
import fr.maxlego08.zauctionhouse.api.event.events.remove.AuctionPreRemoveExpiredItemEvent;
76
import fr.maxlego08.zauctionhouse.api.event.events.remove.AuctionPreRemoveListedItemEvent;
87
import fr.maxlego08.zauctionhouse.api.event.events.remove.AuctionPreRemovePurchasedItemEvent;
@@ -12,6 +11,9 @@
1211
import fr.maxlego08.zauctionhouse.api.services.AuctionRemoveService;
1312
import org.bukkit.entity.Player;
1413

14+
import java.util.concurrent.CompletableFuture;
15+
import java.util.function.Supplier;
16+
1517
public class RemoveService extends AuctionService implements AuctionRemoveService {
1618

1719
private final AuctionPlugin plugin;
@@ -21,10 +23,10 @@ public RemoveService(AuctionPlugin plugin) {
2123
}
2224

2325
@Override
24-
public void removeListedItem(Player player, Item item) {
26+
public CompletableFuture<Void> removeListedItem(Player player, Item item) {
2527

2628
var event = new AuctionPreRemoveListedItemEvent(item, player);
27-
if (!event.callEvent()) return;
29+
if (!event.callEvent()) return CompletableFuture.completedFuture(null);
2830

2931
var auctionManager = this.plugin.getAuctionManager();
3032
var inventoryManager = this.plugin.getInventoriesLoader().getInventoryManager();
@@ -35,27 +37,27 @@ public void removeListedItem(Player player, Item item) {
3537
logger.info("Item expired");
3638
auctionManager.getCache(player).remove(PlayerCacheKey.ITEMS_LISTED);
3739
auctionManager.openMainAuction(player);
38-
return;
40+
return CompletableFuture.completedFuture(null);
3941
}
4042

4143
if (item.getStatus() != ItemStatus.AVAILABLE) {
4244
logger.info("Item not available");
4345
auctionManager.openMainAuction(player);
44-
return;
46+
return CompletableFuture.completedFuture(null);
4547
}
4648

4749
item.setStatus(ItemStatus.IS_BEING_REMOVED);
4850

4951
// 2. Vérifier si l'item est lock
50-
executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> auctionManager.removeListedItem(player, item), StorageType.LISTED);
52+
return executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> auctionManager.removeListedItem(player, item), StorageType.LISTED);
5153
}
5254

5355
@Override
54-
public void removeOwnedItem(Player player, Item item) {
56+
public CompletableFuture<Void> removeOwnedItem(Player player, Item item) {
5557

5658

5759
var event = new AuctionPreRemoveListedItemEvent(item, player);
58-
if (!event.callEvent()) return;
60+
if (!event.callEvent()) return CompletableFuture.completedFuture(null);
5961

6062
var auctionManager = this.plugin.getAuctionManager();
6163
var inventoryManager = this.plugin.getInventoriesLoader().getInventoryManager();
@@ -66,27 +68,27 @@ public void removeOwnedItem(Player player, Item item) {
6668
logger.info("Item expired");
6769
auctionManager.getCache(player).remove(PlayerCacheKey.ITEMS_LISTED);
6870
auctionManager.openMainAuction(player);
69-
return;
71+
return CompletableFuture.completedFuture(null);
7072
}
7173

7274
if (item.getStatus() != ItemStatus.AVAILABLE) {
7375
logger.info("Item not available");
7476
auctionManager.openMainAuction(player);
75-
return;
77+
return CompletableFuture.completedFuture(null);
7678
}
7779

7880
item.setStatus(ItemStatus.IS_BEING_REMOVED);
7981

8082
// 2. Vérifier si l'item est lock
81-
executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> auctionManager.removeOwnedItem(player, item), StorageType.LISTED);
83+
return executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> auctionManager.removeOwnedItem(player, item), StorageType.LISTED);
8284

8385
}
8486

8587
@Override
86-
public void removeExpiredItem(Player player, Item item) {
88+
public CompletableFuture<Void> removeExpiredItem(Player player, Item item) {
8789

8890
var event = new AuctionPreRemoveExpiredItemEvent(item, player);
89-
if (!event.callEvent()) return;
91+
if (!event.callEvent()) return CompletableFuture.completedFuture(null);
9092

9193
var auctionManager = this.plugin.getAuctionManager();
9294
var inventoryManager = this.plugin.getInventoriesLoader().getInventoryManager();
@@ -97,26 +99,26 @@ public void removeExpiredItem(Player player, Item item) {
9799
logger.info("Item expired");
98100
auctionManager.getCache(player).remove(PlayerCacheKey.ITEMS_EXPIRED);
99101
inventoryManager.updateInventory(player);
100-
return;
102+
return CompletableFuture.completedFuture(null);
101103
}
102104

103105
if (item.getStatus() != ItemStatus.REMOVED) {
104106
logger.info("Item not available");
105107
inventoryManager.updateInventory(player);
106-
return;
108+
return CompletableFuture.completedFuture(null);
107109
}
108110

109111
item.setStatus(ItemStatus.DELETED);
110112

111113
// 2. Vérifier si l'item est lock
112-
executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> this.plugin.getAuctionManager().removeExpiredItem(player, item), StorageType.EXPIRED);
114+
return executeRemoval(player, item, () -> inventoryManager.updateInventory(player), () -> this.plugin.getAuctionManager().removeExpiredItem(player, item), StorageType.EXPIRED);
113115
}
114116

115117
@Override
116-
public void removePurchasedItem(Player player, Item item) {
118+
public CompletableFuture<Void> removePurchasedItem(Player player, Item item) {
117119

118120
var event = new AuctionPreRemovePurchasedItemEvent(item, player);
119-
if (!event.callEvent()) return;
121+
if (!event.callEvent()) return CompletableFuture.completedFuture(null);
120122

121123
var auctionManager = this.plugin.getAuctionManager();
122124
var inventoryManager = this.plugin.getInventoriesLoader().getInventoryManager();
@@ -127,28 +129,28 @@ public void removePurchasedItem(Player player, Item item) {
127129
logger.info("Item expired");
128130
auctionManager.getCache(player).remove(PlayerCacheKey.ITEMS_EXPIRED);
129131
inventoryManager.updateInventory(player);
130-
return;
132+
return CompletableFuture.completedFuture(null);
131133
}
132134

133135
if (item.getStatus() != ItemStatus.PURCHASED) {
134136
logger.info("Item not available");
135137
inventoryManager.updateInventory(player);
136-
return;
138+
return CompletableFuture.completedFuture(null);
137139
}
138140

139141
item.setStatus(ItemStatus.DELETED);
140142

141143
var manager = this.plugin.getAuctionManager();
142-
executeRemoval(player, item, () -> manager.updateInventory(player), () -> manager.removePurchasedItem(player, item), StorageType.PURCHASED);
144+
return executeRemoval(player, item, () -> manager.updateInventory(player), () -> manager.removePurchasedItem(player, item), StorageType.PURCHASED);
143145

144146
}
145147

146-
private void executeRemoval(Player player, Item item, Runnable onUnavailable, Runnable onLocalRemoval, StorageType storageType) {
148+
private CompletableFuture<Void> executeRemoval(Player player, Item item, Runnable onUnavailable, Supplier<CompletableFuture<Void>> onLocalRemoval, StorageType storageType) {
147149

148150
var clusterBridge = this.plugin.getAuctionClusterBridge();
149151
var logger = this.plugin.getLogger();
150152

151-
clusterBridge.checkAvailability(item).thenCompose(available -> {
153+
return clusterBridge.checkAvailability(item).thenCompose(available -> {
152154

153155
if (!available) {
154156
logger.info("Item is not available");
@@ -158,22 +160,12 @@ private void executeRemoval(Player player, Item item, Runnable onUnavailable, Ru
158160

159161
return clusterBridge.lockItem(item, player.getUniqueId());
160162

161-
}).thenCompose(token -> {
162-
163-
// 3. On va supprimer l'item coté REDIS
164-
165-
logger.info("Token: " + token);
166-
return clusterBridge.removeItem(item, storageType);
167-
168-
}).thenCompose(v -> {
169-
170-
// 4. On supprime l'item en local
171-
onLocalRemoval.run();
172-
173-
return clusterBridge.unlockItem(item, LockToken.of(item));
174-
}).exceptionally(e -> {
175-
e.printStackTrace();
176-
return null;
177-
});
163+
}).thenCompose(token -> onLocalRemoval.get()
164+
.thenCompose(v -> clusterBridge.removeItem(item, storageType)
165+
.thenCompose(vv -> clusterBridge.unlockItem(item, token))))
166+
.exceptionally(e -> {
167+
e.printStackTrace();
168+
return null;
169+
});
178170
}
179171
}

src/main/java/fr/maxlego08/zauctionhouse/storage/ZStorageManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ public CompletableFuture<AuctionItem> createAuctionItem(Player seller, BigDecima
137137
}
138138

139139
@Override
140-
public void updateItem(Item item, StorageType storageType) {
141-
async(() -> with(ItemRepository.class).updateItem(item, storageType));
140+
public CompletableFuture<Void> updateItem(Item item, StorageType storageType) {
141+
return CompletableFuture.runAsync(() -> with(ItemRepository.class).updateItem(item, storageType), this.plugin.getExecutorService());
142142
}
143143

144144
@Override

0 commit comments

Comments
 (0)