ConfigStringUtils.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.gmail.nossr50.util.text;
  2. import com.gmail.nossr50.datatypes.party.PartyFeature;
  3. import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
  4. import org.bukkit.Material;
  5. import org.bukkit.entity.EntityType;
  6. import org.jetbrains.annotations.NotNull;
  7. import java.util.Map;
  8. import java.util.concurrent.ConcurrentHashMap;
  9. import java.util.function.Function;
  10. import static com.gmail.nossr50.util.text.StringUtils.getCapitalized;
  11. import static java.util.Objects.requireNonNull;
  12. /**
  13. * Utility class for String operations, including formatting and caching deterministic results to improve performance.
  14. */
  15. public class ConfigStringUtils {
  16. public static final String UNDERSCORE = "_";
  17. public static final String SPACE = " ";
  18. // Using concurrent hash maps to avoid concurrency issues (Folia)
  19. private static final Map<EntityType, String> configEntityStrings = new ConcurrentHashMap<>();
  20. private static final Map<SuperAbilityType, String> configSuperAbilityStrings = new ConcurrentHashMap<>();
  21. private static final Map<Material, String> configMaterialStrings = new ConcurrentHashMap<>();
  22. private static final Map<PartyFeature, String> configPartyFeatureStrings = new ConcurrentHashMap<>();
  23. public static String getConfigSuperAbilityString(SuperAbilityType superAbilityType) {
  24. requireNonNull(superAbilityType, "superAbilityType cannot be null");
  25. return configSuperAbilityStrings.computeIfAbsent(superAbilityType,
  26. ConfigStringUtils::createConfigFriendlyString);
  27. }
  28. public static String getMaterialConfigString(Material material) {
  29. return configMaterialStrings.computeIfAbsent(material, ConfigStringUtils::createConfigFriendlyString);
  30. }
  31. public static String getConfigEntityTypeString(EntityType entityType) {
  32. return configEntityStrings.computeIfAbsent(entityType, ConfigStringUtils::createConfigFriendlyString);
  33. }
  34. public static String getConfigPartyFeatureString(PartyFeature partyFeature) {
  35. return configPartyFeatureStrings.computeIfAbsent(partyFeature,
  36. // For whatever dumb reason, party feature enums got formatted like this...
  37. pf -> createConfigFriendlyString(pf.name()).replace(UNDERSCORE, ""));
  38. }
  39. private static String createConfigFriendlyString(String baseString) {
  40. return CONFIG_FRIENDLY_STRING_FORMATTER.apply(baseString);
  41. }
  42. private static final Function<String, String> CONFIG_FRIENDLY_STRING_FORMATTER = baseString -> {
  43. if (baseString.contains(UNDERSCORE) && !baseString.contains(SPACE)) {
  44. return asConfigFormat(baseString.split(UNDERSCORE));
  45. } else {
  46. if(baseString.contains(SPACE)) {
  47. return asConfigFormat(baseString.split(SPACE));
  48. } else{
  49. return getCapitalized(baseString);
  50. }
  51. }
  52. };
  53. private static @NotNull String asConfigFormat(String[] substrings) {
  54. final StringBuilder configString = new StringBuilder();
  55. for (int i = 0; i < substrings.length; i++) {
  56. configString.append(getCapitalized(substrings[i]));
  57. if (i < substrings.length - 1) {
  58. configString.append(UNDERSCORE);
  59. }
  60. }
  61. return configString.toString();
  62. }
  63. private static String createConfigFriendlyString(Object object) {
  64. return createConfigFriendlyString(object.toString());
  65. }
  66. }