diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java index d322a970..ae857e9d 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java @@ -42,6 +42,13 @@ public class ArbitraryDataManager extends Thread { private volatile boolean isStopping = false; + public enum StoragePolicy { + FOLLOWED_AND_VIEWED, + FOLLOWED, + VIEWED, + ALL, + NONE + } /** * Map of recent requests for ARBITRARY transaction data file lists. diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 8c5ac410..150b9888 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -5,10 +5,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -24,9 +21,11 @@ import org.eclipse.persistence.exceptions.XMLMarshalException; import org.eclipse.persistence.jaxb.JAXBContextFactory; import org.eclipse.persistence.jaxb.UnmarshallerProperties; import org.qortal.block.BlockChain; +import org.qortal.controller.arbitrary.ArbitraryDataManager.*; import org.qortal.crosschain.Bitcoin.BitcoinNet; import org.qortal.crosschain.Litecoin.LitecoinNet; import org.qortal.crosschain.Dogecoin.DogecoinNet; +import org.qortal.utils.EnumUtils; // All properties to be converted to JSON via JAXB @XmlAccessorType(XmlAccessType.FIELD) @@ -263,6 +262,9 @@ public class Settings { /** Data storage path (for temporary data). */ private String tempDataPath = "data/_temp"; + /** Storage policy to indicate which data should be hosted */ + private String storagePolicy = "FOLLOWED_AND_VIEWED"; + /** Whether to validate every layer when building arbitrary data, or just the final layer */ private boolean validateAllDataLayers = false; @@ -417,6 +419,13 @@ public class Settings { if (this.apiKey != null && this.apiKey.trim().length() < 8) throwValidationError("apiKey must be at least 8 characters"); + + try { + StoragePolicy.valueOf(this.storagePolicy); + } catch (IllegalArgumentException ex) { + String possibleValues = EnumUtils.getNames(StoragePolicy.class, ", "); + throwValidationError(String.format("storagePolicy must be one of: %s", possibleValues)); + } } // Getters / setters @@ -766,6 +775,10 @@ public class Settings { return this.tempDataPath; } + public StoragePolicy getStoragePolicy() { + return StoragePolicy.valueOf(this.storagePolicy); + } + public boolean shouldValidateAllDataLayers() { return this.validateAllDataLayers; } diff --git a/src/main/java/org/qortal/utils/EnumUtils.java b/src/main/java/org/qortal/utils/EnumUtils.java new file mode 100644 index 00000000..9a486b11 --- /dev/null +++ b/src/main/java/org/qortal/utils/EnumUtils.java @@ -0,0 +1,15 @@ +package org.qortal.utils; + +import java.util.Arrays; + +public class EnumUtils { + + public static String[] getNames(Class> e) { + return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new); + } + + public static String getNames(Class> e, String delimiter) { + return String.join(delimiter, EnumUtils.getNames(e)); + } + +}