diff --git a/game/src/main/org/apollo/game/model/inv/transaction/ItemTransaction.java b/game/src/main/org/apollo/game/model/inv/transaction/ItemTransaction.java new file mode 100644 index 00000000..27545256 --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/ItemTransaction.java @@ -0,0 +1,53 @@ +package org.apollo.game.model.inv.transaction; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Queue; +import java.util.Set; + +import org.apollo.game.model.inv.Inventory; + +public final class ItemTransaction { + + private final Queue queuedBlocks = new ArrayDeque<>(); + private final List committedBlocks = new ArrayList<>(); + private final Set inventories = new HashSet<>(); + private TransactionListener listener; + + public void setListener(TransactionListener listener) { + this.listener = listener; + } + + public void sync(Inventory inventory) { + inventories.add(inventory); + } + + public void append(TransactionBlock block) { + queuedBlocks.add(block); + } + + public void refresh() { + inventories.forEach(Inventory::forceRefresh); + } + + public void rollback() { + committedBlocks.forEach(TransactionBlock::revert); + listener.alertFailure(); + } + + public boolean commit() { + for (TransactionBlock change : queuedBlocks) { + if (!change.commit()) { + rollback(); + return false; + } + committedBlocks.add(change); + } + refresh(); + return true; + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/inv/transaction/TransactionBlock.java b/game/src/main/org/apollo/game/model/inv/transaction/TransactionBlock.java new file mode 100644 index 00000000..e81ebf2a --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/TransactionBlock.java @@ -0,0 +1,9 @@ +package org.apollo.game.model.inv.transaction; + +public interface TransactionBlock { + + boolean commit(); + + void revert(); + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/inv/transaction/TransactionBuilder.java b/game/src/main/org/apollo/game/model/inv/transaction/TransactionBuilder.java new file mode 100644 index 00000000..447551e8 --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/TransactionBuilder.java @@ -0,0 +1,62 @@ +package org.apollo.game.model.inv.transaction; + +import org.apollo.game.model.Item; +import org.apollo.game.model.entity.Player; +import org.apollo.game.model.inv.Inventory; + +public final class TransactionBuilder { + + private final ItemTransaction transaction = new ItemTransaction(); + private final Inventory inventory; + + private TransactionBuilder(Inventory inventory) { + transaction.sync(inventory); + this.inventory = inventory; + } + + public TransactionBuilder failureMessage(Player player, String message) { + return listener(new TransactionFailureListener(player, message)); + } + + public TransactionBuilder listener(TransactionListener listener) { + transaction.setListener(listener); + return this; + } + + public TransactionBuilder swap(Inventory source, int fromSlot, int toSlot) { + // TODO: Swap item block + transaction.sync(source); + return this; + } + + public TransactionBuilder add(Item item) { + // TODO: Add item block + return this; + } + + public TransactionBuilder remove(Item item) { + // TODO: Remove item block + return this; + } + + public TransactionBuilder move(Inventory source, Item item) { + // TODO: Move item block + transaction.sync(source); + return this; + } + + public TransactionBuilder take(Inventory destination, Item item) { + // TODO: Move item block + transaction.sync(destination); + return this; + } + + public ItemTransaction build() { + return transaction; + } + + public static TransactionBuilder create(Inventory inventory) { + return new TransactionBuilder(inventory); + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/inv/transaction/TransactionFailureListener.java b/game/src/main/org/apollo/game/model/inv/transaction/TransactionFailureListener.java new file mode 100644 index 00000000..fec73289 --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/TransactionFailureListener.java @@ -0,0 +1,20 @@ +package org.apollo.game.model.inv.transaction; + +import org.apollo.game.model.entity.Player; + +public final class TransactionFailureListener implements TransactionListener { + + private final Player player; + private final String message; + + public TransactionFailureListener(Player player, String message) { + this.player = player; + this.message = message; + } + + @Override + public void alertFailure() { + player.sendMessage(message); + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/inv/transaction/TransactionItem.java b/game/src/main/org/apollo/game/model/inv/transaction/TransactionItem.java new file mode 100644 index 00000000..f331c231 --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/TransactionItem.java @@ -0,0 +1,20 @@ +package org.apollo.game.model.inv.transaction; + +import org.apollo.game.model.Item; +import org.apollo.game.model.inv.Inventory; + +public abstract class TransactionItem { + + protected final Inventory inventory; + + protected TransactionItem(Inventory inventory) { + this.inventory = inventory; + } + + public abstract Item delete(); + + public abstract boolean deleteSuccessful(); + + public abstract void revert(); + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/model/inv/transaction/TransactionListener.java b/game/src/main/org/apollo/game/model/inv/transaction/TransactionListener.java new file mode 100644 index 00000000..5cbb9e7a --- /dev/null +++ b/game/src/main/org/apollo/game/model/inv/transaction/TransactionListener.java @@ -0,0 +1,7 @@ +package org.apollo.game.model.inv.transaction; + +public interface TransactionListener { + + void alertFailure(); + +} \ No newline at end of file