diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataCreatePatch.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataCreatePatch.java index d5ff0eb7..0f376818 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataCreatePatch.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataCreatePatch.java @@ -2,6 +2,7 @@ package org.qortal.arbitrary; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.qortal.arbitrary.metadata.ArbitraryDataMetadataPatch; import org.qortal.repository.DataException; import org.qortal.settings.Settings; import org.qortal.utils.FilesystemUtils; @@ -23,6 +24,7 @@ public class ArbitraryDataCreatePatch { private Path finalPath; private int totalFileCount; private int fileDifferencesCount; + private ArbitraryDataMetadataPatch metadata; private Path workingPath; private String identifier; @@ -121,7 +123,7 @@ public class ArbitraryDataCreatePatch { diff.compute(); this.totalFileCount = diff.getTotalFileCount(); - this.fileDifferencesCount = diff.getFileDifferencesCount(); + this.metadata = diff.getMetadata(); } public Path getFinalPath() { @@ -132,8 +134,8 @@ public class ArbitraryDataCreatePatch { return this.totalFileCount; } - public int getFileDifferencesCount() { - return this.fileDifferencesCount; + public ArbitraryDataMetadataPatch getMetadata() { + return this.metadata; } } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java index 6a68e276..acc3b7ec 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataDiff.java @@ -75,6 +75,7 @@ public class ArbitraryDataDiff { private final List removedPaths; private int totalFileCount; + private ArbitraryDataMetadataPatch metadata; public ArbitraryDataDiff(Path pathBefore, Path pathAfter, byte[] previousSignature) throws DataException { this.pathBefore = pathBefore; @@ -258,6 +259,9 @@ public class ArbitraryDataDiff { diff.removedPaths.add(filePathBefore); } + // Keep a tally of the total number of files to help with decision making + diff.totalFileCount++; + return FileVisitResult.CONTINUE; } @@ -300,6 +304,7 @@ public class ArbitraryDataDiff { metadata.setPreviousHash(this.previousHash); metadata.setCurrentHash(this.currentHash); metadata.write(); + this.metadata = metadata; } @@ -360,8 +365,8 @@ public class ArbitraryDataDiff { return this.totalFileCount; } - public int getFileDifferencesCount() { - return this.addedPaths.size() + this.modifiedPaths.size() + this.removedPaths.size(); + public ArbitraryDataMetadataPatch getMetadata() { + return this.metadata; } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java index 1aba93ae..73f48c9b 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataTransactionBuilder.java @@ -4,6 +4,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.arbitrary.exception.MissingDataException; import org.qortal.arbitrary.ArbitraryDataFile.ResourceIdType; +import org.qortal.arbitrary.ArbitraryDataDiff.*; +import org.qortal.arbitrary.metadata.ArbitraryDataMetadataPatch; import org.qortal.arbitrary.misc.Service; import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; @@ -113,14 +115,30 @@ public class ArbitraryDataTransactionBuilder { } // Check number of modified files + ArbitraryDataMetadataPatch metadata = patch.getMetadata(); int totalFileCount = patch.getTotalFileCount(); - int differencesCount = patch.getFileDifferencesCount(); + int differencesCount = metadata.getFileDifferencesCount(); difference = (double) differencesCount / (double) totalFileCount; if (difference > MAX_FILE_DIFF) { LOGGER.info("Reached maximum file differences ({} / {}) - using PUT", difference, MAX_FILE_DIFF); return Method.PUT; } + // Check the patch types + // Limit this check to single file resources only for now + boolean atLeastOnePatch = false; + if (totalFileCount == 1) { + for (ModifiedPath path : metadata.getModifiedPaths()) { + if (path.getDiffType() != DiffType.COMPLETE_FILE) { + atLeastOnePatch = true; + } + } + } + if (!atLeastOnePatch) { + LOGGER.info("Patch consists of complete files only - using PUT"); + return Method.PUT; + } + // State is appropriate for a PATCH transaction return Method.PATCH; } diff --git a/src/main/java/org/qortal/arbitrary/metadata/ArbitraryDataMetadataPatch.java b/src/main/java/org/qortal/arbitrary/metadata/ArbitraryDataMetadataPatch.java index 9555bdfa..cac135e2 100644 --- a/src/main/java/org/qortal/arbitrary/metadata/ArbitraryDataMetadataPatch.java +++ b/src/main/java/org/qortal/arbitrary/metadata/ArbitraryDataMetadataPatch.java @@ -174,4 +174,9 @@ public class ArbitraryDataMetadataPatch extends ArbitraryDataMetadata { return this.currentHash; } + + public int getFileDifferencesCount() { + return this.addedPaths.size() + this.modifiedPaths.size() + this.removedPaths.size(); + } + }