From 5a9fca22074b6afa99552fcf0d8d7abd53da820f Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 4 Feb 2022 03:12:38 +0800 Subject: [PATCH] Make ResourceView implement Closeable --- .../architectury/transfer/ResourceView.java | 6 +++++- .../transfer/TransferHandler.java | 4 +++- .../wrapper/ContainerTransferHandler.java | 4 ++++ .../wrapper/FilteringResourceView.java | 5 +++++ .../fabric/FabricStorageTransferHandler.java | 19 ++++++++++++++++--- .../FabricContainerItemTransferHandler.java | 4 ++++ .../fluid/forge/FluidTransferImpl.java | 17 ++++++++++++++--- .../transfer/item/forge/ItemTransferImpl.java | 18 +++++++++++++++--- 8 files changed, 66 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/dev/architectury/transfer/ResourceView.java b/common/src/main/java/dev/architectury/transfer/ResourceView.java index 7364f8e4..b3b5400c 100644 --- a/common/src/main/java/dev/architectury/transfer/ResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/ResourceView.java @@ -19,6 +19,7 @@ package dev.architectury.transfer; +import java.io.Closeable; import java.util.function.Predicate; /** @@ -26,7 +27,7 @@ import java.util.function.Predicate; * * @param the type of resource */ -public interface ResourceView extends TransferView { +public interface ResourceView extends TransferView, Closeable { /** * Returns the resource that this view represents. * The returned resource is immutable. @@ -50,4 +51,7 @@ public interface ResourceView extends TransferView { return blank(); } + + @Override + void close(); } diff --git a/common/src/main/java/dev/architectury/transfer/TransferHandler.java b/common/src/main/java/dev/architectury/transfer/TransferHandler.java index 666544f9..349eb5d3 100644 --- a/common/src/main/java/dev/architectury/transfer/TransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/TransferHandler.java @@ -74,7 +74,9 @@ public interface TransferHandler extends TransferView { /** * Returns the resource in a particular index. - * This may be extremely expensive to compute, avoid if you can. + * This may be extremely expensive to compute, avoid if you can.
+ * Please properly close this stream. Failure to do so will result in a potential + * crash in conflicting transactions. * * @param index the index of the resource * @return the resource in the given index diff --git a/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java b/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java index de3fc402..cc216c1c 100644 --- a/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java @@ -88,5 +88,9 @@ public class ContainerTransferHandler implements CombinedItemTransferHandler { public long getCapacity() { return Math.min(container.getMaxStackSize(), getResource().getMaxStackSize()); } + + @Override + public void close() { + } } } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java b/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java index ac7e0f81..fe7413a4 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java @@ -42,6 +42,11 @@ public interface FilteringResourceView extends ForwardingResourceView, Ext public boolean canExtract(T toExtract) { return canExtract.test(toExtract); } + + @Override + public void close() { + delegate.close(); + } }; } diff --git a/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java b/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java index c8601a28..501d4908 100644 --- a/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java +++ b/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java @@ -75,9 +75,8 @@ public class FabricStorageTransferHandler implements TransferHandler { if (storage instanceof InventoryStorage) { return new FabricStorageResourceView((StorageView) ((InventoryStorage) storage).getSlots().get(index)); } - try (Transaction transaction = Transaction.openNested(this.transaction)) { - return new FabricStorageResourceView(Iterables.get(storage.iterable(transaction), index)); - } + Transaction transaction = Transaction.openNested(this.transaction); + return new FabricStorageResourceView(Iterables.get(storage.iterable(transaction), index), transaction); } @Override @@ -176,9 +175,16 @@ public class FabricStorageTransferHandler implements TransferHandler { private class FabricStorageResourceView implements ResourceView { private final StorageView view; + @Nullable + private final Transaction transaction; private FabricStorageResourceView(StorageView view) { + this(view, null); + } + + private FabricStorageResourceView(StorageView view, @Nullable Transaction transaction) { this.view = view; + this.transaction = transaction; } @Override @@ -226,6 +232,13 @@ public class FabricStorageTransferHandler implements TransferHandler { public void loadState(Object state) { throw new UnsupportedOperationException(); } + + @Override + public void close() { + if (this.transaction != null) { + this.transaction.close(); + } + } } public static class TypeAdapter { diff --git a/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java b/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java index aa424be2..3aec8120 100644 --- a/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java +++ b/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java @@ -189,5 +189,9 @@ public class FabricContainerItemTransferHandler implements TransferHandler