Specify locale when changing case (Fixes #291)

This commit is contained in:
Phoenix616 2020-01-29 16:35:04 +01:00
parent d4bb775086
commit 2a37304113
13 changed files with 45 additions and 26 deletions

View File

@ -8,6 +8,7 @@ import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Scanner;
@ -30,7 +31,7 @@ public class Configuration {
@Override
public <T> Object parseToJava(Class<T> type, Object object) {
if (object instanceof String && type.isEnum()) {
return Enum.valueOf((Class<? extends Enum>) type, ((String) object).toUpperCase());
return Enum.valueOf((Class<? extends Enum>) type, ((String) object).toUpperCase(Locale.ROOT));
}
return object;
}
@ -62,8 +63,8 @@ public class Configuration {
try {
if (config.isSet(path)) {
field.set(null, getParser(field).parseToJava(field.getType(), config.get(path)));
} else if (config.isSet(path.toLowerCase())) {
field.set(null, getParser(field).parseToJava(field.getType(), config.get(path.toLowerCase())));
} else if (config.isSet(path.toLowerCase(Locale.ROOT))) {
field.set(null, getParser(field).parseToJava(field.getType(), config.get(path.toLowerCase(Locale.ROOT))));
} else {
if (field.isAnnotationPresent(PrecededBySpace.class)) {
writer.newLine();
@ -131,7 +132,7 @@ public class Configuration {
* @param valueParser The parser itself
*/
public static void registerParser(String name, ValueParser valueParser) {
parsers.put(name.toLowerCase(), valueParser);
parsers.put(name.toLowerCase(Locale.ROOT), valueParser);
}
/**
@ -140,7 +141,7 @@ public class Configuration {
* @return The parser or null if it doesn't exist
*/
public static ValueParser getParser(String name) {
return parsers.get(name.toLowerCase());
return parsers.get(name.toLowerCase(Locale.ROOT));
}
/**

View File

@ -26,6 +26,7 @@ import org.yaml.snakeyaml.nodes.Tag;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.regex.Matcher;
@ -127,7 +128,7 @@ public class MaterialUtil {
* @return Material found
*/
public static Material getMaterial(String name) {
String formatted = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").replace(' ', '_').toUpperCase();
String formatted = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").replace(' ', '_').toUpperCase(Locale.ROOT);
Material material = MATERIAL_CACHE.get(formatted);
if (material != null) {
@ -394,10 +395,10 @@ public class MaterialUtil {
private static class EnumParser<E extends Enum<E>> {
private E parse(String name, E[] values) {
try {
return E.valueOf(values[0].getDeclaringClass(), name.toUpperCase());
return E.valueOf(values[0].getDeclaringClass(), name.toUpperCase(Locale.ROOT));
} catch (IllegalArgumentException exception) {
E currentEnum = null;
String[] typeParts = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").toUpperCase().split("[ _]");
String[] typeParts = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").toUpperCase(Locale.ROOT).split("[ _]");
int length = Short.MAX_VALUE;
for (E e : values) {
String enumName = e.name();

View File

@ -1,6 +1,7 @@
package com.Acrobot.Breeze.Utils;
import java.math.BigDecimal;
import java.util.Locale;
/**
* @author Acrobot
@ -23,8 +24,8 @@ public class PriceUtil {
* @return exact price
*/
public static BigDecimal getExact(String text, char indicator) {
String[] split = text.replace(" ", "").toLowerCase().split(":");
String character = String.valueOf(indicator).toLowerCase();
String[] split = text.replace(" ", "").toLowerCase(Locale.ROOT).split(":");
String character = String.valueOf(indicator).toLowerCase(Locale.ROOT);
for (String part : split) {
if (!part.startsWith(character) && !part.endsWith(character)) {

View File

@ -4,6 +4,7 @@ import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import java.util.Collection;
import java.util.Locale;
/**
* @author Acrobot
@ -18,9 +19,12 @@ public class StringUtil {
* @return Reformatted string
*/
public static String capitalizeFirstLetter(String string, char separator) {
if (string == null || string.isEmpty()) {
return string;
}
char[] separators = new char[]{separator};
return WordUtils.capitalizeFully(string, separators).replace(String.valueOf(separator), " ");
return WordUtils.capitalize(string.toLowerCase(Locale.ROOT), separators).replace(String.valueOf(separator), " ");
}
/**
@ -28,7 +32,7 @@ public class StringUtil {
*
* @param string String to reformat
* @return Reformatted string
* @see com.Acrobot.Breeze.Utils.StringUtil#capitalizeFirstLetter(String, char)
* @see StringUtil#capitalizeFirstLetter(String, char)
*/
public static String capitalizeFirstLetter(String string) {
return capitalizeFirstLetter(string, ' ');

View File

@ -14,6 +14,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
import java.util.logging.Level;
@ -42,7 +43,7 @@ public class Properties {
set.add((Material) o);
} else if (o instanceof String) {
try {
set.add(Material.getMaterial(((String) o).toUpperCase()));
set.add(Material.getMaterial(((String) o).toUpperCase(Locale.ROOT)));
} catch (IllegalArgumentException e) {
ChestShop.getBukkitLogger().log(Level.WARNING, o + " is not a valid Material name in the config!");
}

View File

@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Locale;
import java.util.logging.Level;
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.BUY_PRICE_ABOVE_MAX;
@ -84,7 +85,7 @@ public class PriceRestrictionModule implements Listener {
for (String typeId : section.getKeys(false)) {
Material material = Material.matchMaterial(typeId);
if (material != null) {
configuration.set(sectionPath + "." + material.toString().toLowerCase(), configuration.get(sectionPath + "." + typeId));
configuration.set(sectionPath + "." + material.toString().toLowerCase(Locale.ROOT), configuration.get(sectionPath + "." + typeId));
configuration.set(sectionPath + "." + typeId, null);
}
}
@ -101,7 +102,7 @@ public class PriceRestrictionModule implements Listener {
return;
}
String itemType = material.getType().toString().toLowerCase();
String itemType = material.getType().toString().toLowerCase(Locale.ROOT);
int amount;
try {
amount = Integer.parseInt(event.getSignLine(QUANTITY_LINE));

View File

@ -10,6 +10,8 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import java.util.Locale;
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NO_PERMISSION;
import static com.Acrobot.ChestShop.Permission.*;
import static com.Acrobot.ChestShop.Signs.ChestShopSign.ITEM_LINE;
@ -39,7 +41,7 @@ public class PermissionChecker implements Listener {
return;
}
String matID = item.getType().toString().toLowerCase();
String matID = item.getType().toString().toLowerCase(Locale.ROOT);
if (PriceUtil.hasBuyPrice(priceLine)) {
if (Permission.has(player, SHOP_CREATION_BUY_ID + matID)) {
return;

View File

@ -7,6 +7,8 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import java.util.Locale;
import static com.Acrobot.Breeze.Utils.PriceUtil.isPrice;
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.INVALID_PRICE;
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
@ -18,7 +20,7 @@ public class PriceChecker implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public static void onPreShopCreation(PreShopCreationEvent event) {
String line = event.getSignLine(PRICE_LINE).toUpperCase();
String line = event.getSignLine(PRICE_LINE).toUpperCase(Locale.ROOT);
if (Properties.PRICE_PRECISION <= 0) {
line = line.replaceAll("\\.\\d*", ""); //remove too many decimal places
} else {

View File

@ -8,6 +8,8 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import java.util.Locale;
import static com.Acrobot.ChestShop.Events.PreTransactionEvent.TransactionOutcome.CLIENT_DOES_NOT_HAVE_PERMISSION;
import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType.BUY;
@ -25,7 +27,7 @@ public class PermissionChecker implements Listener {
TransactionEvent.TransactionType transactionType = event.getTransactionType();
for (ItemStack stock : event.getStock()) {
String matID = stock.getType().toString().toLowerCase();
String matID = stock.getType().toString().toLowerCase(Locale.ROOT);
boolean hasPerm;

View File

@ -4,6 +4,7 @@ import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Locale;
import java.util.Optional;
/**
@ -54,7 +55,7 @@ public enum Permission {
}
public static boolean has(CommandSender sender, String node) {
return sender.hasPermission(node) || sender.hasPermission(node.toLowerCase());
return sender.hasPermission(node) || sender.hasPermission(node.toLowerCase(Locale.ROOT));
}
public static boolean otherName(Player player, String name) {
@ -64,15 +65,15 @@ public enum Permission {
public static boolean otherName(Player player, Permission base, String name) {
boolean hasBase = base != OTHER_NAME && otherName(player, OTHER_NAME, name);
if (hasBase || has(player, base + ".*")) {
return !hasPermissionSetFalse(player, base+ "." + name) && !hasPermissionSetFalse(player, base + "." + name.toLowerCase());
return !hasPermissionSetFalse(player, base+ "." + name) && !hasPermissionSetFalse(player, base + "." + name.toLowerCase(Locale.ROOT));
}
return has(player, base + "." + name) || has(player, base + "." + name.toLowerCase());
return has(player, base + "." + name) || has(player, base + "." + name.toLowerCase(Locale.ROOT));
}
private static boolean hasPermissionSetFalse(CommandSender sender, String permission) {
return (sender.isPermissionSet(permission) && !sender.hasPermission(permission))
|| (sender.isPermissionSet(permission.toLowerCase()) && !sender.hasPermission(permission.toLowerCase()));
|| (sender.isPermissionSet(permission.toLowerCase(Locale.ROOT)) && !sender.hasPermission(permission.toLowerCase(Locale.ROOT)));
}
public static org.bukkit.permissions.Permission getPermission(Permission permission) {

View File

@ -19,6 +19,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import java.util.Locale;
import java.util.regex.Pattern;
/**
@ -56,7 +57,7 @@ public class ChestShopSign {
public static boolean isValid(String[] line) {
line = StringUtil.stripColourCodes(line);
return isValidPreparedSign(line) && (line[PRICE_LINE].toUpperCase().contains("B") || line[PRICE_LINE].toUpperCase().contains("S")) && !line[NAME_LINE].isEmpty();
return isValidPreparedSign(line) && (line[PRICE_LINE].toUpperCase(Locale.ROOT).contains("B") || line[PRICE_LINE].toUpperCase(Locale.ROOT).contains("S")) && !line[NAME_LINE].isEmpty();
}
public static boolean isValid(Block sign) {

View File

@ -22,6 +22,7 @@ import org.bukkit.event.Listener;
import java.sql.SQLException;
import java.util.Date;
import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
@ -164,14 +165,14 @@ public class NameManager implements Listener {
} catch (ExecutionException ignored) {}
}
if (account == null && searchOfflinePlayer && !invalidPlayers.contains(shortName.toLowerCase())) {
if (account == null && searchOfflinePlayer && !invalidPlayers.contains(shortName.toLowerCase(Locale.ROOT))) {
// no account with that shortname was found, try to get an offline player with that name
OfflinePlayer offlinePlayer = ChestShop.getBukkitServer().getOfflinePlayer(shortName);
if (offlinePlayer != null && offlinePlayer.getName() != null && offlinePlayer.getUniqueId() != null
&& offlinePlayer.getUniqueId().version() == uuidVersion) {
account = storeUsername(new PlayerDTO(offlinePlayer.getUniqueId(), offlinePlayer.getName()));
} else {
invalidPlayers.put(shortName.toLowerCase(), true);
invalidPlayers.put(shortName.toLowerCase(Locale.ROOT), true);
}
}
return account;

View File

@ -17,6 +17,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@ -241,7 +242,7 @@ public class Updater {
this.waitForThread();
if (this.versionType != null) {
for (ReleaseType type : ReleaseType.values()) {
if (this.versionType.equals(type.name().toLowerCase())) {
if (this.versionType.equals(type.name().toLowerCase(Locale.ROOT))) {
return type;
}
}