Explicitly localize strings to Locale.US for internal implementation

There is inconsistent usage of toLowerCase/toUpperCase methods in the codebase.
Somewhere we already use Locale.US, somewhere not. That might cause various issues in runtime
as shown in CASSANDRA-19953 ticket when an environment Cassandra runs in has different locale from expected.
In this patch, all such method calls explicitly set their locale to Locale.US. This patch also contains
a checkstyle rule which fails the compilation if toLowerCase or toUpperCase is used.
We prefer calls to methods in LocalizeString class which use US locale.

patch by Ata İlhan Köktürk; reviewed by Stefan Miklosovic, Brandon Williams for CASSANDRA-19953

Co-authored-by: Maxwell Guo <cclive1601@gmail.com>
Co-authored-by: Stefan Miklosovic <smiklosovic@apacheorg>
This commit is contained in:
Ata İlhan Köktürk 2024-09-29 12:31:34 +08:00 committed by Stefan Miklosovic
parent c8854af030
commit 46b36f23cd
No known key found for this signature in database
GPG Key ID: 32F35CB2F546D93E
128 changed files with 493 additions and 243 deletions

View File

@ -62,7 +62,13 @@
<property name="idFormat" value="blockPathToFile"/> <property name="idFormat" value="blockPathToFile"/>
<property name="influenceFormat" value="0"/> <property name="influenceFormat" value="0"/>
</module> </module>
<module name="SuppressWithNearbyCommentFilter">
<property name="commentFormat" value="checkstyle: permit this invocation"/>
<property name="idFormat" value="blockToCases"/>
<property name="influenceFormat" value="0"/>
</module>
<module name="RegexpSinglelineJava"> <module name="RegexpSinglelineJava">
<!-- block system time --> <!-- block system time -->
<property name="id" value="blockSystemClock"/> <property name="id" value="blockSystemClock"/>
@ -151,6 +157,14 @@
<property name="message" value="Avoid Short() and use Short.valueOf()" /> <property name="message" value="Avoid Short() and use Short.valueOf()" />
</module> </module>
<module name="RegexpSinglelineJava">
<!-- block toLowerCase and toUpperCase -->
<property name="id" value="blockToCases"/>
<property name="format" value="toLowerCase\(|toUpperCase\("/>
<property name="ignoreComments" value="true"/>
<property name="message" value="Avoid toLowerCase() or toUpperCase() and use LocalizeString class instead" />
</module>
<module name="SuppressionCommentFilter"> <module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="checkstyle: suppress below '([\w\|]+)'"/> <property name="offCommentFormat" value="checkstyle: suppress below '([\w\|]+)'"/>
<property name="idFormat" value="$1"/> <property name="idFormat" value="$1"/>

View File

@ -1,4 +1,5 @@
5.1 5.1
* Explicitly localize strings to Locale.US for internal implementation (CASSANDRA-19953)
* Add -H option for human-friendly output in nodetool compactionhistory (CASSANDRA-20015) * Add -H option for human-friendly output in nodetool compactionhistory (CASSANDRA-20015)
* Fix type check for referenced duration type for nested types (CASSANDRA-19890) * Fix type check for referenced duration type for nested types (CASSANDRA-19890)
* In simulation tests, correctly set the tokens of replacement nodes (CASSANDRA-19997) * In simulation tests, correctly set the tokens of replacement nodes (CASSANDRA-19997)

View File

@ -50,6 +50,7 @@ import Parser,Lexer;
import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.exceptions.SyntaxException;
import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.ColumnMetadata;
import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.Pair;
import org.apache.cassandra.utils.LocalizeString;
} }
@members { @members {

View File

@ -722,7 +722,7 @@ createFunctionStatement returns [CreateFunctionStatement.Raw stmt]
K_LANGUAGE language = IDENT K_LANGUAGE language = IDENT
K_AS body = STRING_LITERAL K_AS body = STRING_LITERAL
{ $stmt = new CreateFunctionStatement.Raw( { $stmt = new CreateFunctionStatement.Raw(
fn, argNames, argTypes, returnType, calledOnNullInput, $language.text.toLowerCase(), $body.text, orReplace, ifNotExists); fn, argNames, argTypes, returnType, calledOnNullInput, LocalizeString.toLowerCaseLocalized($language.text), $body.text, orReplace, ifNotExists);
} }
; ;
@ -1127,7 +1127,7 @@ listPermissionsStatement returns [ListPermissionsStatement stmt]
permission returns [Permission perm] permission returns [Permission perm]
: p=(K_CREATE | K_ALTER | K_DROP | K_SELECT | K_MODIFY | K_AUTHORIZE | K_DESCRIBE | K_EXECUTE | K_UNMASK | K_SELECT_MASKED) : p=(K_CREATE | K_ALTER | K_DROP | K_SELECT | K_MODIFY | K_AUTHORIZE | K_DESCRIBE | K_EXECUTE | K_UNMASK | K_SELECT_MASKED)
{ $perm = Permission.valueOf($p.text.toUpperCase()); } { $perm = Permission.valueOf(LocalizeString.toUpperCaseLocalized($p.text)); }
; ;
permissionOrAll returns [Set<Permission> perms] permissionOrAll returns [Set<Permission> perms]
@ -1642,7 +1642,7 @@ functionName returns [FunctionName s]
; ;
allowedFunctionName returns [String s] allowedFunctionName returns [String s]
: f=IDENT { $s = $f.text.toLowerCase(); } : f=IDENT { $s = LocalizeString.toLowerCaseLocalized($f.text); }
| f=QUOTED_NAME { $s = $f.text; } | f=QUOTED_NAME { $s = $f.text; }
| u=unreserved_function_keyword { $s = u; } | u=unreserved_function_keyword { $s = u; }
| K_TOKEN { $s = "token"; } | K_TOKEN { $s = "token"; }

View File

@ -51,6 +51,8 @@ import org.apache.cassandra.transport.messages.ResultMessage;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.MBeanWrapper; import org.apache.cassandra.utils.MBeanWrapper;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Central location for managing the logging of client/user-initated actions (like queries, log in commands, and so on). * Central location for managing the logging of client/user-initated actions (like queries, log in commands, and so on).
* *
@ -387,7 +389,7 @@ public class AuditLogManager implements QueryEvents.Listener, AuthEvents.Listene
{ {
for (String query : queries) for (String query : queries)
{ {
if (query.toLowerCase().contains(PasswordObfuscator.PASSWORD_TOKEN)) if (toLowerCaseLocalized(query).contains(PasswordObfuscator.PASSWORD_TOKEN))
return "Syntax Exception. Obscured for security reasons."; return "Syntax Exception. Obscured for security reasons.";
} }
} }

View File

@ -34,6 +34,8 @@ import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.io.util.File; import org.apache.cassandra.io.util.File;
import org.apache.cassandra.utils.binlog.BinLogOptions; import org.apache.cassandra.utils.binlog.BinLogOptions;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class AuditLogOptions extends BinLogOptions public class AuditLogOptions extends BinLogOptions
{ {
public volatile boolean enabled = false; public volatile boolean enabled = false;
@ -143,13 +145,13 @@ public class AuditLogOptions extends BinLogOptions
public Builder withIncludedCategories(final String includedCategories) public Builder withIncludedCategories(final String includedCategories)
{ {
sanitise(includedCategories).map(v -> this.includedCategories = v.toUpperCase()); sanitise(includedCategories).map(v -> this.includedCategories = toUpperCaseLocalized(v));
return this; return this;
} }
public Builder withExcludedCategories(final String excludedCategories) public Builder withExcludedCategories(final String excludedCategories)
{ {
sanitise(excludedCategories).map(v -> this.excludedCategories = v.toUpperCase()); sanitise(excludedCategories).map(v -> this.excludedCategories = toUpperCaseLocalized(v));
return this; return this;
} }
@ -173,7 +175,7 @@ public class AuditLogOptions extends BinLogOptions
public Builder withRollCycle(final String rollCycle) public Builder withRollCycle(final String rollCycle)
{ {
sanitise(rollCycle).map(v -> this.rollCycle = v.toUpperCase()); sanitise(rollCycle).map(v -> this.rollCycle = toUpperCaseLocalized(v));
return this; return this;
} }
@ -230,8 +232,8 @@ public class AuditLogOptions extends BinLogOptions
opts.logger = this.logger; opts.logger = this.logger;
sanitise(this.includedKeyspaces).map(v -> opts.included_keyspaces = v); sanitise(this.includedKeyspaces).map(v -> opts.included_keyspaces = v);
sanitise(this.excludedKeyspaces).map(v -> opts.excluded_keyspaces = v); sanitise(this.excludedKeyspaces).map(v -> opts.excluded_keyspaces = v);
sanitise(this.includedCategories).map(v -> opts.included_categories = v.toUpperCase()); sanitise(this.includedCategories).map(v -> opts.included_categories = toUpperCaseLocalized(v));
sanitise(this.excludedCategories).map(v -> opts.excluded_categories = v.toUpperCase()); sanitise(this.excludedCategories).map(v -> opts.excluded_categories = toUpperCaseLocalized(v));
sanitise(this.includedUsers).map(v -> opts.included_users = v); sanitise(this.includedUsers).map(v -> opts.included_users = v);
sanitise(this.excludedUsers).map(v -> opts.excluded_users = v); sanitise(this.excludedUsers).map(v -> opts.excluded_users = v);
opts.roll_cycle = this.rollCycle; opts.roll_cycle = this.rollCycle;

View File

@ -39,6 +39,7 @@ import org.apache.cassandra.utils.concurrent.Future;
import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toMap;
import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory; import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum Stage public enum Stage
{ {
@ -79,7 +80,7 @@ public enum Stage
private static String normalizeName(String stageName) private static String normalizeName(String stageName)
{ {
// Handle discrepancy between JMX names and actual pool names // Handle discrepancy between JMX names and actual pool names
String upperStageName = stageName.toUpperCase(); String upperStageName = toUpperCaseLocalized(stageName);
if (upperStageName.endsWith("STAGE")) if (upperStageName.endsWith("STAGE"))
{ {
upperStageName = upperStageName.substring(0, stageName.length() - 5); upperStageName = upperStageName.substring(0, stageName.length() - 5);

View File

@ -32,6 +32,8 @@ import org.apache.cassandra.service.FileSystemOwnershipCheck;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.StorageCompatibilityMode; import org.apache.cassandra.utils.StorageCompatibilityMode;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
// checkstyle: suppress below 'blockSystemPropertyUsage' // checkstyle: suppress below 'blockSystemPropertyUsage'
/** A class that extracts system properties for the cassandra node it runs within. */ /** A class that extracts system properties for the cassandra node it runs within. */
@ -918,7 +920,7 @@ public enum CassandraRelevantProperties
} }
/** /**
* Gets the value of a system property as a enum, calling {@link String#toUpperCase()} first. * Gets the value of a system property as an enum, calling {@link org.apache.cassandra.utils.LocalizeString#toUpperCaseLocalized(String)} first.
* *
* @param defaultValue to return when not defined * @param defaultValue to return when not defined
* @param <T> type * @param <T> type
@ -930,7 +932,7 @@ public enum CassandraRelevantProperties
} }
/** /**
* Gets the value of a system property as a enum, optionally calling {@link String#toUpperCase()} first. * Gets the value of a system property as an enum, optionally calling {@link org.apache.cassandra.utils.LocalizeString#toUpperCaseLocalized(String)} first.
* *
* @param toUppercase before converting to enum * @param toUppercase before converting to enum
* @param defaultValue to return when not defined * @param defaultValue to return when not defined
@ -942,11 +944,11 @@ public enum CassandraRelevantProperties
String value = System.getProperty(key); String value = System.getProperty(key);
if (value == null) if (value == null)
return defaultValue; return defaultValue;
return Enum.valueOf(defaultValue.getDeclaringClass(), toUppercase ? value.toUpperCase() : value); return Enum.valueOf(defaultValue.getDeclaringClass(), toUppercase ? toUpperCaseLocalized(value) : value);
} }
/** /**
* Gets the value of a system property as an enum, optionally calling {@link String#toUpperCase()} first. * Gets the value of a system property as an enum, optionally calling {@link org.apache.cassandra.utils.LocalizeString#toLowerCaseLocalized(String)} first.
* If the value is missing, the default value for this property is used * If the value is missing, the default value for this property is used
* *
* @param toUppercase before converting to enum * @param toUppercase before converting to enum
@ -957,7 +959,7 @@ public enum CassandraRelevantProperties
public <T extends Enum<T>> T getEnum(boolean toUppercase, Class<T> enumClass) public <T extends Enum<T>> T getEnum(boolean toUppercase, Class<T> enumClass)
{ {
String value = System.getProperty(key, defaultVal); String value = System.getProperty(key, defaultVal);
return Enum.valueOf(enumClass, toUppercase ? value.toUpperCase() : value); return Enum.valueOf(enumClass, toUppercase ? toUpperCaseLocalized(value) : value);
} }
/** /**

View File

@ -27,6 +27,7 @@ import com.google.common.math.DoubleMath;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.BYTES_PER_SECOND; import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.BYTES_PER_SECOND;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Represents a data rate type used for cassandra configuration. It supports the opportunity for the users to be able to * Represents a data rate type used for cassandra configuration. It supports the opportunity for the users to be able to
@ -76,7 +77,7 @@ public abstract class DataRateSpec
// negatives are not allowed by the regex pattern // negatives are not allowed by the regex pattern
if (minUnit.convert(quantity, unit) >= max) if (minUnit.convert(quantity, unit) >= max)
throw new IllegalArgumentException("Invalid data rate: " + value + ". It shouldn't be more than " + throw new IllegalArgumentException("Invalid data rate: " + value + ". It shouldn't be more than " +
(max - 1) + " in " + minUnit.name().toLowerCase()); (max - 1) + " in " + toLowerCaseLocalized(minUnit.name()));
} }
private static void validateQuantity(double quantity, DataRateUnit unit, DataRateUnit minUnit, long max) private static void validateQuantity(double quantity, DataRateUnit unit, DataRateUnit minUnit, long max)
@ -86,8 +87,8 @@ public abstract class DataRateSpec
if (minUnit.convert(quantity, unit) >= max) if (minUnit.convert(quantity, unit) >= max)
throw new IllegalArgumentException(String.format("Invalid data rate: %s %s. It shouldn't be more than %d in %s", throw new IllegalArgumentException(String.format("Invalid data rate: %s %s. It shouldn't be more than %d in %s",
quantity, unit.name().toLowerCase(), quantity, toLowerCaseLocalized(unit.name()),
max - 1, minUnit.name().toLowerCase())); max - 1, toLowerCaseLocalized(minUnit.name())));
} }
// get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is

View File

@ -28,6 +28,7 @@ import com.google.common.primitives.Ints;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Represents an amount of data storage. Wrapper class for Cassandra configuration parameters, providing to the * Represents an amount of data storage. Wrapper class for Cassandra configuration parameters, providing to the
@ -99,7 +100,7 @@ public abstract class DataStorageSpec
if (minUnit.convert(quantity, sourceUnit) >= max) if (minUnit.convert(quantity, sourceUnit) >= max)
throw new IllegalArgumentException("Invalid data storage: " + value + ". It shouldn't be more than " + throw new IllegalArgumentException("Invalid data storage: " + value + ". It shouldn't be more than " +
(max - 1) + " in " + minUnit.name().toLowerCase()); (max - 1) + " in " + toLowerCaseLocalized(minUnit.name()));
} }
private static void validateQuantity(long quantity, DataStorageUnit sourceUnit, DataStorageUnit minUnit, long max) private static void validateQuantity(long quantity, DataStorageUnit sourceUnit, DataStorageUnit minUnit, long max)
@ -109,8 +110,8 @@ public abstract class DataStorageSpec
if (minUnit.convert(quantity, sourceUnit) >= max) if (minUnit.convert(quantity, sourceUnit) >= max)
throw new IllegalArgumentException(String.format("Invalid data storage: %d %s. It shouldn't be more than %d in %s", throw new IllegalArgumentException(String.format("Invalid data storage: %d %s. It shouldn't be more than %d in %s",
quantity, sourceUnit.name().toLowerCase(), quantity, toLowerCaseLocalized(sourceUnit.name()),
max - 1, minUnit.name().toLowerCase())); max - 1, toLowerCaseLocalized(minUnit.name())));
} }
// get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is

View File

@ -62,7 +62,7 @@ import com.google.common.collect.Sets;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import com.google.common.primitives.Longs; import com.google.common.primitives.Longs;
import com.google.common.util.concurrent.RateLimiter; import com.google.common.util.concurrent.RateLimiter;
import org.apache.cassandra.utils.Pair;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -116,6 +116,7 @@ import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.service.paxos.Paxos; import org.apache.cassandra.service.paxos.Paxos;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.MBeanWrapper; import org.apache.cassandra.utils.MBeanWrapper;
import org.apache.cassandra.utils.Pair;
import org.apache.cassandra.utils.StorageCompatibilityMode; import org.apache.cassandra.utils.StorageCompatibilityMode;
import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOCATE_TOKENS_FOR_KEYSPACE; import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOCATE_TOKENS_FOR_KEYSPACE;
@ -156,6 +157,7 @@ import static org.apache.cassandra.db.ConsistencyLevel.QUORUM;
import static org.apache.cassandra.io.util.FileUtils.ONE_GIB; import static org.apache.cassandra.io.util.FileUtils.ONE_GIB;
import static org.apache.cassandra.io.util.FileUtils.ONE_MIB; import static org.apache.cassandra.io.util.FileUtils.ONE_MIB;
import static org.apache.cassandra.utils.Clock.Global.logInitializationOutcome; import static org.apache.cassandra.utils.Clock.Global.logInitializationOutcome;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class DatabaseDescriptor public class DatabaseDescriptor
{ {
@ -1785,7 +1787,7 @@ public class DatabaseDescriptor
if (cidrAuthorizerMode == null || cidrAuthorizerMode.isEmpty()) if (cidrAuthorizerMode == null || cidrAuthorizerMode.isEmpty())
return defaultCidrAuthorizerMode; return defaultCidrAuthorizerMode;
return ICIDRAuthorizer.CIDRAuthorizerMode.valueOf(cidrAuthorizerMode.toUpperCase()); return ICIDRAuthorizer.CIDRAuthorizerMode.valueOf(toUpperCaseLocalized(cidrAuthorizerMode));
} }
public static int getCidrGroupsCacheRefreshInterval() public static int getCidrGroupsCacheRefreshInterval()

View File

@ -34,6 +34,8 @@ import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Represents a positive time duration. Wrapper class for Cassandra duration configuration parameters, providing to the * Represents a positive time duration. Wrapper class for Cassandra duration configuration parameters, providing to the
* users the opportunity to be able to provide config with a unit of their choice in cassandra.yaml as per the available * users the opportunity to be able to provide config with a unit of their choice in cassandra.yaml as per the available
@ -108,7 +110,7 @@ public abstract class DurationSpec
if (minUnit.convert(quantity, sourceUnit) >= max) if (minUnit.convert(quantity, sourceUnit) >= max)
throw new IllegalArgumentException("Invalid duration: " + value + ". It shouldn't be more than " + throw new IllegalArgumentException("Invalid duration: " + value + ". It shouldn't be more than " +
(max - 1) + " in " + minUnit.name().toLowerCase()); (max - 1) + " in " + toLowerCaseLocalized(minUnit.name()));
} }
private static void validateQuantity(long quantity, TimeUnit sourceUnit, TimeUnit minUnit, long max) private static void validateQuantity(long quantity, TimeUnit sourceUnit, TimeUnit minUnit, long max)
@ -118,8 +120,8 @@ public abstract class DurationSpec
if (minUnit.convert(quantity, sourceUnit) >= max) if (minUnit.convert(quantity, sourceUnit) >= max)
throw new IllegalArgumentException(String.format("Invalid duration: %d %s. It shouldn't be more than %d in %s", throw new IllegalArgumentException(String.format("Invalid duration: %d %s. It shouldn't be more than %d in %s",
quantity, sourceUnit.name().toLowerCase(), quantity, toLowerCaseLocalized(sourceUnit.name()),
max - 1, minUnit.name().toLowerCase())); max - 1, toLowerCaseLocalized(minUnit.name())));
} }
// get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is
@ -141,7 +143,7 @@ public abstract class DurationSpec
*/ */
static TimeUnit fromSymbol(String symbol) static TimeUnit fromSymbol(String symbol)
{ {
switch (symbol.toLowerCase()) switch (toLowerCaseLocalized(symbol))
{ {
case "d": return DAYS; case "d": return DAYS;
case "h": return HOURS; case "h": return HOURS;

View File

@ -38,6 +38,8 @@ import org.apache.cassandra.security.DisableSslContextFactory;
import org.apache.cassandra.security.ISslContextFactory; import org.apache.cassandra.security.ISslContextFactory;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* This holds various options used for enabling SSL/TLS encryption. * This holds various options used for enabling SSL/TLS encryption.
* Examples of such options are: supported cipher-suites, ssl protocol with version, accepted protocols, end-point * Examples of such options are: supported cipher-suites, ssl protocol with version, accepted protocols, end-point
@ -78,7 +80,7 @@ public class EncryptionOptions
for (ClientAuth clientAuth : ClientAuth.values()) for (ClientAuth clientAuth : ClientAuth.values())
{ {
VALUES.put(clientAuth.value, clientAuth); VALUES.put(clientAuth.value, clientAuth);
VALUES.put(clientAuth.name().toLowerCase(), clientAuth); VALUES.put(toLowerCaseLocalized(clientAuth.name()), clientAuth);
} }
} }
@ -89,9 +91,9 @@ public class EncryptionOptions
public static ClientAuth from(String value) public static ClientAuth from(String value)
{ {
if (VALUES.containsKey(value.toLowerCase())) if (VALUES.containsKey(toLowerCaseLocalized(value)))
{ {
return VALUES.get(value.toLowerCase()); return VALUES.get(toLowerCaseLocalized(value));
} }
throw new ConfigurationException(value + " is not a valid ClientAuth option"); throw new ConfigurationException(value + " is not a valid ClientAuth option");
} }
@ -183,7 +185,7 @@ public class EncryptionOptions
Set<String> valueSet = new HashSet<>(); Set<String> valueSet = new HashSet<>();
ConfigKey[] values = values(); ConfigKey[] values = values();
for(ConfigKey key: values) { for(ConfigKey key: values) {
valueSet.add(key.getKeyName().toLowerCase()); valueSet.add(toLowerCaseLocalized(key.getKeyName()));
} }
return valueSet; return valueSet;
} }
@ -302,7 +304,7 @@ public class EncryptionOptions
Set<String> configKeys = ConfigKey.asSet(); Set<String> configKeys = ConfigKey.asSet();
for (Map.Entry<String, String> entry : ssl_context_factory.parameters.entrySet()) for (Map.Entry<String, String> entry : ssl_context_factory.parameters.entrySet())
{ {
if(configKeys.contains(entry.getKey().toLowerCase())) if(configKeys.contains(toLowerCaseLocalized(entry.getKey())))
{ {
throw new IllegalArgumentException("SslContextFactory "+ssl_context_factory.class_name+" should " + throw new IllegalArgumentException("SslContextFactory "+ssl_context_factory.class_name+" should " +
"configure '"+entry.getKey()+"' as encryption_options instead of" + "configure '"+entry.getKey()+"' as encryption_options instead of" +

View File

@ -42,6 +42,7 @@ import org.apache.cassandra.service.ClientState;
import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.ByteBufferUtil;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public interface CQL3Type public interface CQL3Type
{ {
@ -139,7 +140,7 @@ public interface CQL3Type
@Override @Override
public String toString() public String toString()
{ {
return super.toString().toLowerCase(); return toLowerCaseLocalized(super.toString());
} }
} }

View File

@ -19,7 +19,6 @@ package org.apache.cassandra.cql3;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -34,6 +33,8 @@ import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.ObjectSizes; import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.memory.ByteBufferCloner; import org.apache.cassandra.utils.memory.ByteBufferCloner;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Represents an identifer for a CQL column definition. * Represents an identifer for a CQL column definition.
* TODO : should support light-weight mode without text representation for when not interned * TODO : should support light-weight mode without text representation for when not interned
@ -109,7 +110,7 @@ public class ColumnIdentifier implements IMeasurableMemory, Comparable<ColumnIde
public ColumnIdentifier(String rawText, boolean keepCase) public ColumnIdentifier(String rawText, boolean keepCase)
{ {
this.text = keepCase ? rawText : rawText.toLowerCase(Locale.US); this.text = keepCase ? rawText : toLowerCaseLocalized(rawText);
this.bytes = ByteBufferUtil.bytes(this.text); this.bytes = ByteBufferUtil.bytes(this.text);
this.prefixComparison = prefixComparison(bytes); this.prefixComparison = prefixComparison(bytes);
this.interned = false; this.interned = false;
@ -140,7 +141,7 @@ public class ColumnIdentifier implements IMeasurableMemory, Comparable<ColumnIde
public static ColumnIdentifier getInterned(String rawText, boolean keepCase) public static ColumnIdentifier getInterned(String rawText, boolean keepCase)
{ {
String text = keepCase ? rawText : rawText.toLowerCase(Locale.US); String text = keepCase ? rawText : toLowerCaseLocalized(rawText);
ByteBuffer bytes = ByteBufferUtil.bytes(text); ByteBuffer bytes = ByteBufferUtil.bytes(text);
return getInterned(UTF8Type.instance, bytes, text); return getInterned(UTF8Type.instance, bytes, text);
} }

View File

@ -30,6 +30,7 @@ import org.apache.cassandra.serializers.MarshalException;
import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue; import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.commons.lang3.time.DateUtils.MILLIS_PER_DAY; import static org.apache.commons.lang3.time.DateUtils.MILLIS_PER_DAY;
import io.netty.util.concurrent.FastThreadLocal; import io.netty.util.concurrent.FastThreadLocal;
@ -251,7 +252,7 @@ public final class Duration
private static Builder add(Builder builder, long number, String symbol) private static Builder add(Builder builder, long number, String symbol)
{ {
switch (symbol.toLowerCase()) switch (toLowerCaseLocalized(symbol))
{ {
case "y": return builder.addYears(number); case "y": return builder.addYears(number);
case "mo": return builder.addMonths(number); case "mo": return builder.addMonths(number);

View File

@ -17,13 +17,14 @@
*/ */
package org.apache.cassandra.cql3; package org.apache.cassandra.cql3;
import java.util.Locale;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.exceptions.SyntaxException;
import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.serializers.MarshalException;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Identifies a field in a UDT. * Identifies a field in a UDT.
*/ */
@ -41,7 +42,7 @@ public class FieldIdentifier
*/ */
public static FieldIdentifier forUnquoted(String text) public static FieldIdentifier forUnquoted(String text)
{ {
return new FieldIdentifier(convert(text == null ? null : text.toLowerCase(Locale.US))); return new FieldIdentifier(convert(text == null ? null : toLowerCaseLocalized(text)));
} }
/** /**

View File

@ -23,13 +23,15 @@ import java.util.Optional;
import org.apache.cassandra.auth.PasswordAuthenticator; import org.apache.cassandra.auth.PasswordAuthenticator;
import org.apache.cassandra.auth.RoleOptions; import org.apache.cassandra.auth.RoleOptions;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Obfuscates passwords in a given string * Obfuscates passwords in a given string
*/ */
public class PasswordObfuscator public class PasswordObfuscator
{ {
public static final String OBFUSCATION_TOKEN = "*******"; public static final String OBFUSCATION_TOKEN = "*******";
public static final String PASSWORD_TOKEN = PasswordAuthenticator.PASSWORD_KEY.toLowerCase(); public static final String PASSWORD_TOKEN = toLowerCaseLocalized(PasswordAuthenticator.PASSWORD_KEY);
/** /**
* Obfuscates everything after the first appearance password token * Obfuscates everything after the first appearance password token
@ -42,7 +44,7 @@ public class PasswordObfuscator
if (null == sourceString) if (null == sourceString)
return null; return null;
int passwordTokenStartIndex = sourceString.toLowerCase().indexOf(PASSWORD_TOKEN); int passwordTokenStartIndex = toLowerCaseLocalized(sourceString).indexOf(PASSWORD_TOKEN);
if (passwordTokenStartIndex < 0) if (passwordTokenStartIndex < 0)
return sourceString; return sourceString;

View File

@ -17,9 +17,10 @@
*/ */
package org.apache.cassandra.cql3; package org.apache.cassandra.cql3;
import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Class for the names of the keyspace-prefixed elements (e.g. table, index, view names) * Class for the names of the keyspace-prefixed elements (e.g. table, index, view names)
*/ */
@ -123,6 +124,6 @@ public class QualifiedName
*/ */
private static String toInternalName(String name, boolean keepCase) private static String toInternalName(String name, boolean keepCase)
{ {
return keepCase ? name : name.toLowerCase(Locale.US); return keepCase ? name : toLowerCaseLocalized(name);
} }
} }

View File

@ -30,6 +30,8 @@ import com.google.common.collect.ImmutableSet;
import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.ConfigurationException;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public final class ReservedKeywords public final class ReservedKeywords
{ {
private static final String FILE_NAME = "reserved_keywords.txt"; private static final String FILE_NAME = "reserved_keywords.txt";
@ -58,6 +60,6 @@ public final class ReservedKeywords
public static boolean isReserved(String text) public static boolean isReserved(String text)
{ {
return reservedKeywords.contains(text.toUpperCase()); return reservedKeywords.contains(toUpperCaseLocalized(text));
} }
} }

View File

@ -17,7 +17,7 @@
*/ */
package org.apache.cassandra.cql3; package org.apache.cassandra.cql3;
import java.util.Locale; import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class RoleName public class RoleName
{ {
@ -25,7 +25,7 @@ public class RoleName
public void setName(String name, boolean keepCase) public void setName(String name, boolean keepCase)
{ {
this.name = keepCase ? name : (name == null ? name : name.toLowerCase(Locale.US)); this.name = keepCase ? name : (name == null ? name : toLowerCaseLocalized(name));
} }
public boolean hasName() public boolean hasName()

View File

@ -18,7 +18,8 @@
package org.apache.cassandra.cql3; package org.apache.cassandra.cql3;
import java.util.Comparator; import java.util.Comparator;
import java.util.Locale;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A schema element (keyspace, udt, udf, uda, table, index, view). * A schema element (keyspace, udt, udf, uda, table, index, view).
@ -43,7 +44,7 @@ public interface SchemaElement
@Override @Override
public String toString() public String toString()
{ {
return super.toString().toLowerCase(Locale.US); return toLowerCaseLocalized(super.toString());
} }
} }

View File

@ -45,6 +45,7 @@ import org.apache.cassandra.db.marshal.UUIDType;
import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.transport.ProtocolVersion;
import static org.apache.cassandra.cql3.functions.TimeFcts.*; import static org.apache.cassandra.cql3.functions.TimeFcts.*;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -196,7 +197,7 @@ public final class CastFcts
private static String toLowerCaseString(CQL3Type type) private static String toLowerCaseString(CQL3Type type)
{ {
return type.toString().toLowerCase(); return toLowerCaseLocalized(type.toString());
} }
/** /**

View File

@ -35,6 +35,7 @@ import org.apache.cassandra.schema.UserFunctions;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.joining;
import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class FunctionResolver public final class FunctionResolver
{ {
@ -46,7 +47,7 @@ public final class FunctionResolver
{ {
return new ColumnSpecification(receiverKeyspace, return new ColumnSpecification(receiverKeyspace,
receiverTable, receiverTable,
new ColumnIdentifier("arg" + i + '(' + fun.name().toString().toLowerCase() + ')', true), new ColumnIdentifier("arg" + i + '(' + toLowerCaseLocalized(fun.name().toString()) + ')', true),
fun.argTypes().get(i)); fun.argTypes().get(i));
} }

View File

@ -26,6 +26,8 @@ import org.apache.cassandra.cql3.functions.FunctionParameter;
import org.apache.cassandra.cql3.functions.NativeScalarFunction; import org.apache.cassandra.cql3.functions.NativeScalarFunction;
import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.AbstractType;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A {@link NativeScalarFunction} that totally or partially replaces the original value of a column value, * A {@link NativeScalarFunction} that totally or partially replaces the original value of a column value,
* meant to obscure the real value of the column. * meant to obscure the real value of the column.
@ -56,7 +58,7 @@ public abstract class MaskingFunction extends NativeScalarFunction
{ {
public Factory(String name, FunctionParameter... parameters) public Factory(String name, FunctionParameter... parameters)
{ {
super(NAME_PREFIX + name.toLowerCase(), parameters); super(NAME_PREFIX + toLowerCaseLocalized(name), parameters);
} }
} }
} }

View File

@ -23,6 +23,8 @@ import com.google.common.collect.ImmutableList;
import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.transport.ProtocolVersion;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Data types supported by cassandra. * Data types supported by cassandra.
*/ */
@ -122,7 +124,7 @@ public abstract class DataType
@Override @Override
public String toString() public String toString()
{ {
return super.toString().toLowerCase(); return toLowerCaseLocalized(super.toString());
} }
} }

View File

@ -23,6 +23,7 @@ import java.util.regex.Pattern;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Represents a duration. A duration stores separately months, days, and seconds due to the fact * Represents a duration. A duration stores separately months, days, and seconds due to the fact
@ -237,7 +238,7 @@ public final class Duration
private static Builder add(Builder builder, long number, String symbol) private static Builder add(Builder builder, long number, String symbol)
{ {
String s = symbol.toLowerCase(); String s = toLowerCaseLocalized(symbol);
if (s.equals("y")) if (s.equals("y"))
{ {
return builder.addYears(number); return builder.addYears(number);

View File

@ -19,6 +19,8 @@ package org.apache.cassandra.cql3.functions.types;
import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.ColumnIdentifier;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Keeps metadata on the connected cluster, including known nodes and schema definitions. * Keeps metadata on the connected cluster, including known nodes and schema definitions.
*/ */
@ -65,7 +67,7 @@ public class Metadata
} }
if (isAlphanumeric) if (isAlphanumeric)
{ {
return id.toLowerCase(); return toLowerCaseLocalized(id);
} }
// Check if it's enclosed in quotes. If it is, remove them and unescape internal double quotes // Check if it's enclosed in quotes. If it is, remove them and unescape internal double quotes

View File

@ -42,6 +42,7 @@ import org.apache.cassandra.utils.Pair;
import static org.apache.cassandra.cql3.selection.SelectorFactories.createFactoriesAndCollectColumnDefinitions; import static org.apache.cassandra.cql3.selection.SelectorFactories.createFactoriesAndCollectColumnDefinitions;
import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest; import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public interface Selectable extends AssignmentTestable public interface Selectable extends AssignmentTestable
{ {
@ -447,7 +448,7 @@ public interface Selectable extends AssignmentTestable
@Override @Override
public String toString() public String toString()
{ {
return String.format("cast(%s as %s)", arg, type.toString().toLowerCase()); return String.format("cast(%s as %s)", arg, toLowerCaseLocalized(type.toString()));
} }
public Selector.Factory newSelectorFactory(TableMetadata table, AbstractType<?> expectedType, List<ColumnMetadata> defs, VariableSpecifications boundNames) public Selector.Factory newSelectorFactory(TableMetadata table, AbstractType<?> expectedType, List<ColumnMetadata> defs, VariableSpecifications boundNames)

View File

@ -37,6 +37,8 @@ import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.transport.ProtocolVersion; import org.apache.cassandra.transport.ProtocolVersion;
import org.apache.cassandra.utils.JsonUtils; import org.apache.cassandra.utils.JsonUtils;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public abstract class Selection public abstract class Selection
{ {
/** /**
@ -327,7 +329,7 @@ public abstract class Selection
sb.append(", "); sb.append(", ");
String columnName = spec.name.toString(); String columnName = spec.name.toString();
if (!columnName.equals(columnName.toLowerCase(Locale.US))) if (!columnName.equals(toLowerCaseLocalized(columnName)))
columnName = "\"" + columnName + "\""; columnName = "\"" + columnName + "\"";
sb.append('"'); sb.append('"');

View File

@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.exceptions.SyntaxException;
import static java.lang.String.format; import static java.lang.String.format;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class PropertyDefinitions public class PropertyDefinitions
{ {
@ -113,7 +114,7 @@ public class PropertyDefinitions
if (null == value) if (null == value)
throw new IllegalArgumentException("value argument can't be null"); throw new IllegalArgumentException("value argument can't be null");
String lowerCasedValue = value.toLowerCase(); String lowerCasedValue = toLowerCaseLocalized(value);
if (POSITIVE_PATTERN.matcher(lowerCasedValue).matches()) if (POSITIVE_PATTERN.matcher(lowerCasedValue).matches())
return true; return true;

View File

@ -17,9 +17,6 @@
*/ */
package org.apache.cassandra.db; package org.apache.cassandra.db;
import java.util.Locale;
import com.carrotsearch.hppc.ObjectIntHashMap; import com.carrotsearch.hppc.ObjectIntHashMap;
import org.apache.cassandra.locator.Endpoints; import org.apache.cassandra.locator.Endpoints;
import org.apache.cassandra.locator.InOurDc; import org.apache.cassandra.locator.InOurDc;
@ -31,6 +28,7 @@ import org.apache.cassandra.locator.NetworkTopologyStrategy;
import org.apache.cassandra.transport.ProtocolException; import org.apache.cassandra.transport.ProtocolException;
import static org.apache.cassandra.locator.Replicas.addToCountPerDc; import static org.apache.cassandra.locator.Replicas.addToCountPerDc;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum ConsistencyLevel public enum ConsistencyLevel
{ {
@ -85,7 +83,7 @@ public enum ConsistencyLevel
public static ConsistencyLevel fromString(String str) public static ConsistencyLevel fromString(String str)
{ {
return valueOf(str.toUpperCase(Locale.US)); return valueOf(toUpperCaseLocalized(str));
} }
public static int quorumFor(AbstractReplicationStrategy replicationStrategy) public static int quorumFor(AbstractReplicationStrategy replicationStrategy)

View File

@ -79,6 +79,8 @@ import org.apache.cassandra.utils.DirectorySizeCalculator;
import org.apache.cassandra.utils.JVMStabilityInspector; import org.apache.cassandra.utils.JVMStabilityInspector;
import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.Pair;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Encapsulate handling of paths to the data files. * Encapsulate handling of paths to the data files.
* *
@ -755,11 +757,11 @@ public class Directories
*/ */
public static boolean isStoredInLocalSystemKeyspacesDataLocation(String keyspace, String table) public static boolean isStoredInLocalSystemKeyspacesDataLocation(String keyspace, String table)
{ {
String keyspaceName = keyspace.toLowerCase(); String keyspaceName = toLowerCaseLocalized(keyspace);
return SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName) return SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName)
&& !(SchemaConstants.SYSTEM_KEYSPACE_NAME.equals(keyspaceName) && !(SchemaConstants.SYSTEM_KEYSPACE_NAME.equals(keyspaceName)
&& SystemKeyspace.TABLES_SPLIT_ACROSS_MULTIPLE_DISKS.contains(table.toLowerCase())); && SystemKeyspace.TABLES_SPLIT_ACROSS_MULTIPLE_DISKS.contains(toLowerCaseLocalized(table)));
} }
public static class DataDirectory public static class DataDirectory

View File

@ -17,6 +17,8 @@
*/ */
package org.apache.cassandra.db.compaction; package org.apache.cassandra.db.compaction;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public enum OperationType public enum OperationType
{ {
/** Each modification here should be also applied to {@link org.apache.cassandra.tools.nodetool.Stop#compactionType} */ /** Each modification here should be also applied to {@link org.apache.cassandra.tools.nodetool.Stop#compactionType} */
@ -69,7 +71,7 @@ public enum OperationType
OperationType(String type, boolean writesData, int priority) OperationType(String type, boolean writesData, int priority)
{ {
this.type = type; this.type = type;
this.fileName = type.toLowerCase().replace(" ", ""); this.fileName = toLowerCaseLocalized(type).replace(" ", "");
this.writesData = writesData; this.writesData = writesData;
this.priority = priority; this.priority = priority;
} }

View File

@ -25,18 +25,19 @@ import java.util.Random;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.cassandra.config.CassandraRelevantProperties;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.CassandraRelevantProperties;
import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.ColumnFamilyStore;
import org.apache.cassandra.db.compaction.UnifiedCompactionStrategy; import org.apache.cassandra.db.compaction.UnifiedCompactionStrategy;
import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.utils.Overlaps;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.MonotonicClock; import org.apache.cassandra.utils.MonotonicClock;
import org.apache.cassandra.utils.Overlaps;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* The controller provides compaction parameters to the unified compaction strategy * The controller provides compaction parameters to the unified compaction strategy
*/ */
@ -442,7 +443,7 @@ public class Controller
sstableGrowthModifier = FBUtilities.parsePercent(options.get(SSTABLE_GROWTH_OPTION)); sstableGrowthModifier = FBUtilities.parsePercent(options.get(SSTABLE_GROWTH_OPTION));
Overlaps.InclusionMethod inclusionMethod = options.containsKey(OVERLAP_INCLUSION_METHOD_OPTION) Overlaps.InclusionMethod inclusionMethod = options.containsKey(OVERLAP_INCLUSION_METHOD_OPTION)
? Overlaps.InclusionMethod.valueOf(options.get(OVERLAP_INCLUSION_METHOD_OPTION).toUpperCase()) ? Overlaps.InclusionMethod.valueOf(toUpperCaseLocalized(options.get(OVERLAP_INCLUSION_METHOD_OPTION)))
: DEFAULT_OVERLAP_INCLUSION_METHOD; : DEFAULT_OVERLAP_INCLUSION_METHOD;
return new Controller(cfs, return new Controller(cfs,
@ -583,7 +584,7 @@ public class Controller
{ {
try try
{ {
Overlaps.InclusionMethod.valueOf(s.toUpperCase()); Overlaps.InclusionMethod.valueOf(toUpperCaseLocalized(s));
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException e)
{ {

View File

@ -46,6 +46,8 @@ import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.PathUtils; import org.apache.cassandra.io.util.PathUtils;
import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* A decoded line in a transaction log file replica. * A decoded line in a transaction log file replica.
* *
@ -63,7 +65,7 @@ final class LogRecord
public static Type fromPrefix(String prefix) public static Type fromPrefix(String prefix)
{ {
return valueOf(prefix.toUpperCase()); return valueOf(toUpperCaseLocalized(prefix));
} }
public boolean hasFile() public boolean hasFile()

View File

@ -25,7 +25,6 @@ import java.util.List;
import java.util.Iterator; import java.util.Iterator;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.Locale;
import org.apache.cassandra.cql3.CQL3Type; import org.apache.cassandra.cql3.CQL3Type;
import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.ColumnSpecification;
@ -46,6 +45,8 @@ import org.apache.cassandra.utils.bytecomparable.ByteComparable;
import org.apache.cassandra.utils.bytecomparable.ByteSource; import org.apache.cassandra.utils.bytecomparable.ByteSource;
import org.apache.cassandra.utils.bytecomparable.ByteSourceInverse; import org.apache.cassandra.utils.bytecomparable.ByteSourceInverse;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* The abstract validator that is the base for maps, sets and lists (both frozen and non-frozen). * The abstract validator that is the base for maps, sets and lists (both frozen and non-frozen).
* *
@ -85,7 +86,7 @@ public abstract class CollectionType<T> extends MultiElementType<T>
@Override @Override
public String toString() public String toString()
{ {
return super.toString().toLowerCase(Locale.US); return toLowerCaseLocalized(super.toString());
} }
} }
@ -142,7 +143,7 @@ public abstract class CollectionType<T> extends MultiElementType<T>
public <V> void validate(V value, ValueAccessor<V> accessor) throws MarshalException public <V> void validate(V value, ValueAccessor<V> accessor) throws MarshalException
{ {
if (accessor.isEmpty(value)) if (accessor.isEmpty(value))
throw new MarshalException("Not enough bytes to read a " + kind.name().toLowerCase()); throw new MarshalException("Not enough bytes to read a " + toLowerCaseLocalized(kind.name()));
super.validate(value, accessor); super.validate(value, accessor);
} }

View File

@ -39,6 +39,7 @@ import org.apache.cassandra.utils.bytecomparable.ByteSource;
import org.apache.cassandra.utils.NoSpamLogger; import org.apache.cassandra.utils.NoSpamLogger;
import static org.apache.cassandra.config.CassandraRelevantProperties.SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR; import static org.apache.cassandra.config.CassandraRelevantProperties.SERIALIZATION_EMPTY_TYPE_NONEMPTY_BEHAVIOR;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* A type that only accept empty data. * A type that only accept empty data.
@ -59,7 +60,7 @@ public class EmptyType extends AbstractType<Void>
return NonEmptyWriteBehavior.FAIL; return NonEmptyWriteBehavior.FAIL;
try try
{ {
return NonEmptyWriteBehavior.valueOf(value.toUpperCase().trim()); return NonEmptyWriteBehavior.valueOf(toUpperCaseLocalized(value).trim());
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -50,6 +50,7 @@ import static com.google.common.collect.Iterables.any;
import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Iterables.transform;
import static org.apache.cassandra.config.CassandraRelevantProperties.TYPE_UDT_CONFLICT_BEHAVIOR; import static org.apache.cassandra.config.CassandraRelevantProperties.TYPE_UDT_CONFLICT_BEHAVIOR;
import static org.apache.cassandra.cql3.ColumnIdentifier.maybeQuote; import static org.apache.cassandra.cql3.ColumnIdentifier.maybeQuote;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A user defined type. * A user defined type.
@ -274,7 +275,7 @@ public class UserType extends TupleType implements SchemaElement
sb.append(", "); sb.append(", ");
String name = stringFieldNames.get(i); String name = stringFieldNames.get(i);
if (!name.equals(name.toLowerCase(Locale.US))) if (!name.equals(toLowerCaseLocalized(name)))
name = "\"" + name + "\""; name = "\"" + name + "\"";
sb.append('"'); sb.append('"');

View File

@ -32,6 +32,8 @@ import org.apache.cassandra.metrics.ClientMetrics;
import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.transport.ConnectedClient; import org.apache.cassandra.transport.ConnectedClient;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
final class ClientsTable extends AbstractVirtualTable final class ClientsTable extends AbstractVirtualTable
{ {
private static final String ADDRESS = "address"; private static final String ADDRESS = "address";
@ -88,7 +90,7 @@ final class ClientsTable extends AbstractVirtualTable
result.row(remoteAddress.getAddress(), remoteAddress.getPort()) result.row(remoteAddress.getAddress(), remoteAddress.getPort())
.column(HOSTNAME, remoteAddress.getHostName()) .column(HOSTNAME, remoteAddress.getHostName())
.column(USERNAME, client.username().orElse(null)) .column(USERNAME, client.username().orElse(null))
.column(CONNECTION_STAGE, client.stage().toString().toLowerCase()) .column(CONNECTION_STAGE, toLowerCaseLocalized(client.stage().toString()))
.column(PROTOCOL_VERSION, client.protocolVersion()) .column(PROTOCOL_VERSION, client.protocolVersion())
.column(CLIENT_OPTIONS, client.clientOptions().orElse(null)) .column(CLIENT_OPTIONS, client.clientOptions().orElse(null))
.column(DRIVER_NAME, client.driverName().orElse(null)) .column(DRIVER_NAME, client.driverName().orElse(null))

View File

@ -85,6 +85,7 @@ import org.apache.cassandra.utils.Pair;
import static org.apache.cassandra.db.rows.Cell.NO_DELETION_TIME; import static org.apache.cassandra.db.rows.Cell.NO_DELETION_TIME;
import static org.apache.cassandra.utils.FBUtilities.camelToSnake; import static org.apache.cassandra.utils.FBUtilities.camelToSnake;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* This is a virtual table that iteratively builds rows using a data set provided by internal collection. * This is a virtual table that iteratively builds rows using a data set provided by internal collection.
@ -255,7 +256,7 @@ public class CollectionVirtualTableAdapter<R> implements VirtualTable
Pattern pattern = Pattern.compile("^[A-Z1-9_]+$"); Pattern pattern = Pattern.compile("^[A-Z1-9_]+$");
// Contains only uppercase letters, numbers and underscores, so it's already snake case. // Contains only uppercase letters, numbers and underscores, so it's already snake case.
if (pattern.matcher(camel).matches()) if (pattern.matcher(camel).matches())
return camel.toLowerCase(); return toLowerCaseLocalized(camel);
// Some special cases must be handled manually. // Some special cases must be handled manually.
String modifiedCamel = camel; String modifiedCamel = camel;

View File

@ -35,6 +35,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadata;
import static org.apache.cassandra.gms.ApplicationState.TOKENS; import static org.apache.cassandra.gms.ApplicationState.TOKENS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A {@link VirtualTable} that return the Gossip information in tabular format. * A {@link VirtualTable} that return the Gossip information in tabular format.
@ -101,10 +102,10 @@ final class GossipInfoTable extends AbstractVirtualTable
.column(HEARTBEAT, getHeartBeat(localState)); .column(HEARTBEAT, getHeartBeat(localState));
for (ApplicationState state : STATES_FOR_VALUES) for (ApplicationState state : STATES_FOR_VALUES)
dataSet.column(state.name().toLowerCase(), getValue(localState, state)); dataSet.column(toLowerCaseLocalized(state.name()), getValue(localState, state));
for (ApplicationState state : STATES_FOR_VERSIONS) for (ApplicationState state : STATES_FOR_VERSIONS)
dataSet.column(state.name().toLowerCase() + "_version", getVersion(localState, state)); dataSet.column(toLowerCaseLocalized(state.name()) + "_version", getVersion(localState, state));
} }
return result; return result;
} }
@ -178,10 +179,10 @@ final class GossipInfoTable extends AbstractVirtualTable
.addRegularColumn(HEARTBEAT, Int32Type.instance); .addRegularColumn(HEARTBEAT, Int32Type.instance);
for (ApplicationState state : STATES_FOR_VALUES) for (ApplicationState state : STATES_FOR_VALUES)
builder.addRegularColumn(state.name().toLowerCase(), UTF8Type.instance); builder.addRegularColumn(toLowerCaseLocalized(state.name()), UTF8Type.instance);
for (ApplicationState state : STATES_FOR_VERSIONS) for (ApplicationState state : STATES_FOR_VERSIONS)
builder.addRegularColumn(state.name().toLowerCase() + "_version", Int32Type.instance); builder.addRegularColumn(toLowerCaseLocalized(state.name()) + "_version", Int32Type.instance);
return builder.build(); return builder.build();
} }

View File

@ -49,6 +49,8 @@ import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.service.ActiveRepairService; import org.apache.cassandra.service.ActiveRepairService;
import org.apache.cassandra.utils.TimeUUID; import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class LocalRepairTables public class LocalRepairTables
{ {
private LocalRepairTables() private LocalRepairTables()
@ -385,7 +387,7 @@ public class LocalRepairTables
private static String timestampColumnName(Enum<?> e) private static String timestampColumnName(Enum<?> e)
{ {
return timestampColumnName(e.name().toLowerCase()); return timestampColumnName(toLowerCaseLocalized(e.name()));
} }
private static String timestampColumnName(String e) private static String timestampColumnName(String e)
@ -431,7 +433,7 @@ public class LocalRepairTables
T currentState = state.getStatus(); T currentState = state.getStatus();
State.Result result = state.getResult(); State.Result result = state.getResult();
ds.column("status", result != null ? result.kind.name().toLowerCase() : currentState == null ? "init" : currentState.name().toLowerCase()); ds.column("status", result != null ? toLowerCaseLocalized(result.kind.name()) : currentState == null ? "init" : toLowerCaseLocalized(currentState.name()));
for (Map.Entry<T, Long> e : state.getStateTimesMillis().entrySet()) for (Map.Entry<T, Long> e : state.getStateTimesMillis().entrySet())
{ {
if (e.getValue().longValue() != 0) if (e.getValue().longValue() != 0)

View File

@ -27,6 +27,8 @@ import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.dht.LocalPartitioner; import org.apache.cassandra.dht.LocalPartitioner;
import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadata;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
final class SSTableTasksTable extends AbstractVirtualTable final class SSTableTasksTable extends AbstractVirtualTable
{ {
private final static String KEYSPACE_NAME = "keyspace_name"; private final static String KEYSPACE_NAME = "keyspace_name";
@ -74,11 +76,11 @@ final class SSTableTasksTable extends AbstractVirtualTable
task.getTable().orElse("*"), task.getTable().orElse("*"),
task.getTaskId()) task.getTaskId())
.column(COMPLETION_RATIO, completionRatio) .column(COMPLETION_RATIO, completionRatio)
.column(KIND, task.getTaskType().toString().toLowerCase()) .column(KIND, toLowerCaseLocalized(task.getTaskType().toString()))
.column(PROGRESS, completed) .column(PROGRESS, completed)
.column(SSTABLES, task.getSSTables().size()) .column(SSTABLES, task.getSSTables().size())
.column(TOTAL, total) .column(TOTAL, total)
.column(UNIT, task.getUnit().toString().toLowerCase()) .column(UNIT, toLowerCaseLocalized(task.getUnit().toString()))
.column(TARGET_DIRECTORY, task.targetDirectory()); .column(TARGET_DIRECTORY, task.targetDirectory());
} }

View File

@ -28,6 +28,8 @@ import org.apache.cassandra.streaming.StreamManager;
import org.apache.cassandra.streaming.StreamingState; import org.apache.cassandra.streaming.StreamingState;
import org.apache.cassandra.utils.TimeUUID; import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.cql3.statements.schema.CreateTableStatement.parse; import static org.apache.cassandra.cql3.statements.schema.CreateTableStatement.parse;
public class StreamingVirtualTable extends AbstractVirtualTable public class StreamingVirtualTable extends AbstractVirtualTable
@ -60,7 +62,7 @@ public class StreamingVirtualTable extends AbstractVirtualTable
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (StreamingState.Status state : StreamingState.Status.values()) for (StreamingState.Status state : StreamingState.Status.values())
sb.append(" status_").append(state.name().toLowerCase()).append("_timestamp timestamp,\n"); sb.append(" status_").append(toLowerCaseLocalized(state.name())).append("_timestamp timestamp,\n");
return sb.toString(); return sb.toString();
} }
@ -91,13 +93,13 @@ public class StreamingVirtualTable extends AbstractVirtualTable
ds.column("follower", state.follower()); ds.column("follower", state.follower());
ds.column("operation", state.operation().getDescription()); ds.column("operation", state.operation().getDescription());
ds.column("peers", state.peers().stream().map(Object::toString).collect(Collectors.toList())); ds.column("peers", state.peers().stream().map(Object::toString).collect(Collectors.toList()));
ds.column("status", state.status().name().toLowerCase()); ds.column("status", toLowerCaseLocalized(state.status().name()));
ds.column("progress_percentage", round(state.progress() * 100)); ds.column("progress_percentage", round(state.progress() * 100));
ds.column("duration_millis", state.durationMillis()); ds.column("duration_millis", state.durationMillis());
ds.column("failure_cause", state.failureCause()); ds.column("failure_cause", state.failureCause());
ds.column("success_message", state.successMessage()); ds.column("success_message", state.successMessage());
for (Map.Entry<StreamingState.Status, Long> e : state.stateTimesMillis().entrySet()) for (Map.Entry<StreamingState.Status, Long> e : state.stateTimesMillis().entrySet())
ds.column("status_" + e.getKey().name().toLowerCase() + "_timestamp", new Date(e.getValue())); ds.column("status_" + toLowerCaseLocalized(e.getKey().name()) + "_timestamp", new Date(e.getValue()));
state.sessions().update(ds); state.sessions().update(ds);
} }

View File

@ -29,6 +29,7 @@ import org.apache.cassandra.schema.TableMetadata;
import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_SCHEMA; import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_SCHEMA;
import static org.apache.cassandra.schema.TableMetadata.builder; import static org.apache.cassandra.schema.TableMetadata.builder;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class VirtualSchemaKeyspace extends VirtualKeyspace public final class VirtualSchemaKeyspace extends VirtualKeyspace
{ {
@ -136,9 +137,9 @@ public final class VirtualSchemaKeyspace extends VirtualKeyspace
for (ColumnMetadata column : table.columns()) for (ColumnMetadata column : table.columns())
{ {
result.row(column.ksName, column.cfName, column.name.toString()) result.row(column.ksName, column.cfName, column.name.toString())
.column(CLUSTERING_ORDER, column.clusteringOrder().toString().toLowerCase()) .column(CLUSTERING_ORDER, toLowerCaseLocalized(column.clusteringOrder().toString()))
.column(COLUMN_NAME_BYTES, column.name.bytes) .column(COLUMN_NAME_BYTES, column.name.bytes)
.column(KIND, column.kind.toString().toLowerCase()) .column(KIND, toLowerCaseLocalized(column.kind.toString()))
.column(POSITION, column.position()) .column(POSITION, column.position())
.column(TYPE, column.type.asCQL3Type().toString()); .column(TYPE, column.type.asCQL3Type().toString());
} }

View File

@ -23,6 +23,8 @@ import java.util.Locale;
import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter; import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class BasicFilters public class BasicFilters
{ {
private static final Locale DEFAULT_LOCALE = Locale.getDefault(); private static final Locale DEFAULT_LOCALE = Locale.getDefault();
@ -39,7 +41,7 @@ public class BasicFilters
@Override @Override
public String process(String input) public String process(String input)
{ {
return input.toLowerCase(locale); return toLowerCaseLocalized(input, locale);
} }
} }

View File

@ -28,6 +28,7 @@ import org.apache.cassandra.index.sai.disk.v1.vector.OptimizeFor;
import org.apache.cassandra.index.sai.utils.IndexTermType; import org.apache.cassandra.index.sai.utils.IndexTermType;
import static org.apache.cassandra.config.CassandraRelevantProperties.SAI_VECTOR_SEARCH_MAX_TOP_K; import static org.apache.cassandra.config.CassandraRelevantProperties.SAI_VECTOR_SEARCH_MAX_TOP_K;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* Per-index config for storage-attached index writers. * Per-index config for storage-attached index writers.
@ -151,7 +152,7 @@ public class IndexWriterConfig
} }
if (options.containsKey(SIMILARITY_FUNCTION)) if (options.containsKey(SIMILARITY_FUNCTION))
{ {
String option = options.get(SIMILARITY_FUNCTION).toUpperCase(); String option = toUpperCaseLocalized(options.get(SIMILARITY_FUNCTION));
try try
{ {
similarityFunction = VectorSimilarityFunction.valueOf(option); similarityFunction = VectorSimilarityFunction.valueOf(option);
@ -164,7 +165,7 @@ public class IndexWriterConfig
} }
if (options.containsKey(OPTIMIZE_FOR)) if (options.containsKey(OPTIMIZE_FOR))
{ {
String option = options.get(OPTIMIZE_FOR).toUpperCase(); String option = toUpperCaseLocalized(options.get(OPTIMIZE_FOR));
try try
{ {
optimizeFor = OptimizeFor.valueOf(option); optimizeFor = OptimizeFor.valueOf(option);

View File

@ -21,6 +21,7 @@ package org.apache.cassandra.index.sai.disk.v1.vector;
import java.util.function.Function; import java.util.function.Function;
import static java.lang.Math.pow; import static java.lang.Math.pow;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* Allows the vector index searches to be optimised for latency or recall. This is used by the * Allows the vector index searches to be optimised for latency or recall. This is used by the
@ -47,6 +48,6 @@ public enum OptimizeFor
public static OptimizeFor fromString(String value) public static OptimizeFor fromString(String value)
{ {
return valueOf(value.toUpperCase()); return valueOf(toUpperCaseLocalized(value));
} }
} }

View File

@ -19,6 +19,9 @@ package org.apache.cassandra.index.sasi.analyzer.filter;
import java.util.Locale; import java.util.Locale;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* Basic/General Token Filters * Basic/General Token Filters
*/ */
@ -42,7 +45,7 @@ public class BasicResultFilters
public String process(String input) throws Exception public String process(String input) throws Exception
{ {
return input.toLowerCase(locale); return toLowerCaseLocalized(input, locale);
} }
} }
@ -62,7 +65,7 @@ public class BasicResultFilters
public String process(String input) throws Exception public String process(String input) throws Exception
{ {
return input.toUpperCase(locale); return toUpperCaseLocalized(input, locale);
} }
} }

View File

@ -43,6 +43,8 @@ import com.google.common.annotations.VisibleForTesting;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class OnDiskIndexBuilder public class OnDiskIndexBuilder
{ {
private static final Logger logger = LoggerFactory.getLogger(OnDiskIndexBuilder.class); private static final Logger logger = LoggerFactory.getLogger(OnDiskIndexBuilder.class);
@ -62,7 +64,7 @@ public class OnDiskIndexBuilder
public static Mode mode(String mode) public static Mode mode(String mode)
{ {
return Mode.valueOf(mode.toUpperCase()); return Mode.valueOf(toUpperCaseLocalized(mode));
} }
public boolean supports(Op op) public boolean supports(Op op)

View File

@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -74,6 +73,7 @@ import static java.util.Optional.ofNullable;
import static org.apache.cassandra.db.virtual.CollectionVirtualTableAdapter.createSinglePartitionedKeyFiltered; import static org.apache.cassandra.db.virtual.CollectionVirtualTableAdapter.createSinglePartitionedKeyFiltered;
import static org.apache.cassandra.db.virtual.CollectionVirtualTableAdapter.createSinglePartitionedValueFiltered; import static org.apache.cassandra.db.virtual.CollectionVirtualTableAdapter.createSinglePartitionedValueFiltered;
import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_METRICS; import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_METRICS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Dropwizard metrics registry extension for Cassandra, as of for now uses the latest version of Dropwizard metrics * Dropwizard metrics registry extension for Cassandra, as of for now uses the latest version of Dropwizard metrics
@ -810,7 +810,7 @@ public class CassandraMetricsRegistry extends MetricRegistry
private String calculateRateUnit(TimeUnit unit) private String calculateRateUnit(TimeUnit unit)
{ {
final String s = unit.toString().toLowerCase(Locale.US); final String s = toLowerCaseLocalized(unit.toString());
return s.substring(0, s.length() - 1); return s.substring(0, s.length() - 1);
} }
} }
@ -861,7 +861,7 @@ public class CassandraMetricsRegistry extends MetricRegistry
{ {
super(metric, objectName, rateUnit); super(metric, objectName, rateUnit);
this.metric = metric; this.metric = metric;
this.durationUnit = durationUnit.toString().toLowerCase(Locale.US); this.durationUnit = toLowerCaseLocalized(durationUnit.toString());
} }
@Override @Override

View File

@ -24,6 +24,8 @@ import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.UserType; import org.apache.cassandra.db.marshal.UserType;
import static org.apache.cassandra.utils.ByteBufferUtil.bytes; import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public final class CQLTypeParser public final class CQLTypeParser
{ {
@ -33,17 +35,17 @@ public final class CQLTypeParser
{ {
ImmutableSet.Builder<String> builder = ImmutableSet.builder(); ImmutableSet.Builder<String> builder = ImmutableSet.builder();
for (CQL3Type.Native primitive : CQL3Type.Native.values()) for (CQL3Type.Native primitive : CQL3Type.Native.values())
builder.add(primitive.name().toLowerCase()); builder.add(toLowerCaseLocalized(primitive.name()));
PRIMITIVE_TYPES = builder.build(); PRIMITIVE_TYPES = builder.build();
} }
public static AbstractType<?> parse(String keyspace, String unparsed, Types userTypes) public static AbstractType<?> parse(String keyspace, String unparsed, Types userTypes)
{ {
String lowercased = unparsed.toLowerCase(); String lowercased = toLowerCaseLocalized(unparsed);
// fast path for the common case of a primitive type // fast path for the common case of a primitive type
if (PRIMITIVE_TYPES.contains(lowercased)) if (PRIMITIVE_TYPES.contains(lowercased))
return CQL3Type.Native.valueOf(unparsed.toUpperCase()).getType(); return CQL3Type.Native.valueOf(toUpperCaseLocalized(unparsed)).getType();
// special-case top-level UDTs // special-case top-level UDTs
UserType udt = userTypes.getNullable(bytes(lowercased)); UserType udt = userTypes.getNullable(bytes(lowercased));

View File

@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.ConfigurationException;
import static java.lang.String.format; import static java.lang.String.format;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
// CQL: {'keys' : 'ALL'|'NONE', 'rows_per_partition': '200'|'NONE'|'ALL'} // CQL: {'keys' : 'ALL'|'NONE', 'rows_per_partition': '200'|'NONE'|'ALL'}
public final class CachingParams public final class CachingParams
@ -40,7 +41,7 @@ public final class CachingParams
@Override @Override
public String toString() public String toString()
{ {
return name().toLowerCase(); return toLowerCaseLocalized(name());
} }
} }

View File

@ -42,6 +42,8 @@ import org.apache.cassandra.utils.FBUtilities;
import static java.lang.String.format; import static java.lang.String.format;
import static org.apache.cassandra.config.CassandraRelevantProperties.DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES; import static org.apache.cassandra.config.CassandraRelevantProperties.DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public final class CompactionParams public final class CompactionParams
{ {
@ -58,7 +60,7 @@ public final class CompactionParams
@Override @Override
public String toString() public String toString()
{ {
return name().toLowerCase(); return toLowerCaseLocalized(name());
} }
} }
@ -123,8 +125,8 @@ public final class CompactionParams
boolean isEnabled = options.containsKey(Option.ENABLED.toString()) boolean isEnabled = options.containsKey(Option.ENABLED.toString())
? Boolean.parseBoolean(options.get(Option.ENABLED.toString())) ? Boolean.parseBoolean(options.get(Option.ENABLED.toString()))
: DEFAULT_ENABLED; : DEFAULT_ENABLED;
String overlappingTombstoneParm = options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(), String overlappingTombstoneParm = toUpperCaseLocalized(options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(),
DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()).toUpperCase(); DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()));
Optional<TombstoneOption> tombstoneOptional = TombstoneOption.forName(overlappingTombstoneParm); Optional<TombstoneOption> tombstoneOptional = TombstoneOption.forName(overlappingTombstoneParm);
if (!tombstoneOptional.isPresent()) if (!tombstoneOptional.isPresent())
{ {

View File

@ -49,6 +49,7 @@ import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.UUIDSerializer; import org.apache.cassandra.utils.UUIDSerializer;
import static org.apache.cassandra.db.TypeSizes.sizeof; import static org.apache.cassandra.db.TypeSizes.sizeof;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* An immutable representation of secondary index metadata. * An immutable representation of secondary index metadata.
@ -72,7 +73,7 @@ public final class IndexMetadata
static static
{ {
indexNameAliases.put(StorageAttachedIndex.NAME, StorageAttachedIndex.class.getCanonicalName()); indexNameAliases.put(StorageAttachedIndex.NAME, StorageAttachedIndex.class.getCanonicalName());
indexNameAliases.put(StorageAttachedIndex.class.getSimpleName().toLowerCase(), StorageAttachedIndex.class.getCanonicalName()); indexNameAliases.put(toLowerCaseLocalized(StorageAttachedIndex.class.getSimpleName()), StorageAttachedIndex.class.getCanonicalName());
indexNameAliases.put(SASIIndex.class.getSimpleName(), SASIIndex.class.getCanonicalName()); indexNameAliases.put(SASIIndex.class.getSimpleName(), SASIIndex.class.getCanonicalName());
} }
@ -159,7 +160,7 @@ public final class IndexMetadata
if (isCustom()) if (isCustom())
{ {
String className = options.get(IndexTarget.CUSTOM_INDEX_OPTION_NAME); String className = options.get(IndexTarget.CUSTOM_INDEX_OPTION_NAME);
return indexNameAliases.getOrDefault(className.toLowerCase(), className); return indexNameAliases.getOrDefault(toLowerCaseLocalized(className), className);
} }
return CassandraIndex.class.getName(); return CassandraIndex.class.getName();
} }

View File

@ -32,6 +32,8 @@ import org.apache.cassandra.tcm.ClusterMetadata;
import org.apache.cassandra.tcm.serialization.MetadataSerializer; import org.apache.cassandra.tcm.serialization.MetadataSerializer;
import org.apache.cassandra.tcm.serialization.Version; import org.apache.cassandra.tcm.serialization.Version;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* An immutable class representing keyspace parameters (durability and replication). * An immutable class representing keyspace parameters (durability and replication).
*/ */
@ -57,7 +59,7 @@ public final class KeyspaceParams
@Override @Override
public String toString() public String toString()
{ {
return name().toLowerCase(); return toLowerCaseLocalized(name());
} }
} }

View File

@ -32,6 +32,8 @@ import org.apache.cassandra.db.Digest;
import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.SystemKeyspace;
import org.apache.cassandra.tracing.TraceKeyspace; import org.apache.cassandra.tracing.TraceKeyspace;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* When adding new String keyspace names here, double check if it needs to be added to PartitionDenylist.canDenylistKeyspace * When adding new String keyspace names here, double check if it needs to be added to PartitionDenylist.canDenylistKeyspace
*/ */
@ -93,7 +95,7 @@ public final class SchemaConstants
*/ */
public static boolean isLocalSystemKeyspace(String keyspaceName) public static boolean isLocalSystemKeyspace(String keyspaceName)
{ {
return LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase()) || isVirtualSystemKeyspace(keyspaceName); return LOCAL_SYSTEM_KEYSPACE_NAMES.contains(toLowerCaseLocalized(keyspaceName)) || isVirtualSystemKeyspace(keyspaceName);
} }
/** /**
@ -101,7 +103,7 @@ public final class SchemaConstants
*/ */
public static boolean isReplicatedSystemKeyspace(String keyspaceName) public static boolean isReplicatedSystemKeyspace(String keyspaceName)
{ {
return REPLICATED_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase()); return REPLICATED_SYSTEM_KEYSPACE_NAMES.contains(toLowerCaseLocalized(keyspaceName));
} }
/** /**
@ -110,7 +112,7 @@ public final class SchemaConstants
*/ */
public static boolean isVirtualSystemKeyspace(String keyspaceName) public static boolean isVirtualSystemKeyspace(String keyspaceName)
{ {
return VIRTUAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase()); return VIRTUAL_SYSTEM_KEYSPACE_NAMES.contains(toLowerCaseLocalized(keyspaceName));
} }
/** /**

View File

@ -27,7 +27,7 @@ import javax.annotation.concurrent.NotThreadSafe;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.*; import com.google.common.collect.*;
import com.google.common.collect.Maps;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -62,6 +62,8 @@ import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_FLUSH
import static org.apache.cassandra.cql3.QueryProcessor.executeInternal; import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal; import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal;
import static org.apache.cassandra.schema.SchemaKeyspaceTables.*; import static org.apache.cassandra.schema.SchemaKeyspaceTables.*;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
import static org.apache.cassandra.utils.Simulate.With.GLOBAL_CLOCK; import static org.apache.cassandra.utils.Simulate.With.GLOBAL_CLOCK;
/** /**
@ -694,9 +696,9 @@ public final class SchemaKeyspace
builder.update(Columns) builder.update(Columns)
.row(table.name, column.name.toString()) .row(table.name, column.name.toString())
.add("column_name_bytes", column.name.bytes) .add("column_name_bytes", column.name.bytes)
.add("kind", column.kind.toString().toLowerCase()) .add("kind", toLowerCaseLocalized(column.kind.toString()))
.add("position", column.position()) .add("position", column.position())
.add("clustering_order", column.clusteringOrder().toString().toLowerCase()) .add("clustering_order", toLowerCaseLocalized(column.clusteringOrder().toString()))
.add("type", type.asCQL3Type().toString()); .add("type", type.asCQL3Type().toString());
ColumnMask mask = column.getMask(); ColumnMask mask = column.getMask();
@ -758,7 +760,7 @@ public final class SchemaKeyspace
.row(table.name, column.column.name.toString()) .row(table.name, column.column.name.toString())
.add("dropped_time", new Date(TimeUnit.MICROSECONDS.toMillis(column.droppedTime))) .add("dropped_time", new Date(TimeUnit.MICROSECONDS.toMillis(column.droppedTime)))
.add("type", column.column.type.asCQL3Type().toString()) .add("type", column.column.type.asCQL3Type().toString())
.add("kind", column.column.kind.toString().toLowerCase()); .add("kind", toLowerCaseLocalized(column.column.kind.toString()));
} }
private static void dropDroppedColumnFromSchemaMutation(TableMetadata table, DroppedColumn column, Mutation.SimpleBuilder builder) private static void dropDroppedColumnFromSchemaMutation(TableMetadata table, DroppedColumn column, Mutation.SimpleBuilder builder)
@ -1075,10 +1077,10 @@ public final class SchemaKeyspace
String keyspace = row.getString("keyspace_name"); String keyspace = row.getString("keyspace_name");
String table = row.getString("table_name"); String table = row.getString("table_name");
ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase()); ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(toUpperCaseLocalized(row.getString("kind")));
int position = row.getInt("position"); int position = row.getInt("position");
ClusteringOrder order = ClusteringOrder.valueOf(row.getString("clustering_order").toUpperCase()); ClusteringOrder order = ClusteringOrder.valueOf(toUpperCaseLocalized(row.getString("clustering_order")));
AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), types); AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), types);
if (order == ClusteringOrder.DESC) if (order == ClusteringOrder.DESC)
@ -1159,7 +1161,7 @@ public final class SchemaKeyspace
*/ */
AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), org.apache.cassandra.schema.Types.none()); AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), org.apache.cassandra.schema.Types.none());
ColumnMetadata.Kind kind = row.has("kind") ColumnMetadata.Kind kind = row.has("kind")
? ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase()) ? ColumnMetadata.Kind.valueOf(toUpperCaseLocalized(row.getString("kind")))
: ColumnMetadata.Kind.REGULAR; : ColumnMetadata.Kind.REGULAR;
assert kind == ColumnMetadata.Kind.REGULAR || kind == ColumnMetadata.Kind.STATIC assert kind == ColumnMetadata.Kind.REGULAR || kind == ColumnMetadata.Kind.STATIC
: "Unexpected dropped column kind: " + kind; : "Unexpected dropped column kind: " + kind;

View File

@ -44,6 +44,7 @@ import static java.lang.String.format;
import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toMap;
import static org.apache.cassandra.schema.TableParams.Option.*; import static org.apache.cassandra.schema.TableParams.Option.*;
import static org.apache.cassandra.db.TypeSizes.sizeof; import static org.apache.cassandra.db.TypeSizes.sizeof;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class TableParams public final class TableParams
{ {
@ -73,7 +74,7 @@ public final class TableParams
@Override @Override
public String toString() public String toString()
{ {
return name().toLowerCase(); return toLowerCaseLocalized(name());
} }
} }

View File

@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.TransparentDataEncryptionOptions; import org.apache.cassandra.config.TransparentDataEncryptionOptions;
import org.apache.cassandra.io.util.File; import org.apache.cassandra.io.util.File;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A {@code KeyProvider} that retrieves keys from a java keystore. * A {@code KeyProvider} that retrieves keys from a java keystore.
*/ */
@ -64,7 +66,7 @@ public class JKSKeyProvider implements KeyProvider
{ {
// there's a lovely behavior with jceks files that all aliases are lower-cased // there's a lovely behavior with jceks files that all aliases are lower-cased
if (isJceks) if (isJceks)
keyAlias = keyAlias.toLowerCase(); keyAlias = toLowerCaseLocalized(keyAlias);
Key key; Key key;
try try

View File

@ -48,6 +48,7 @@ import org.apache.cassandra.security.ISslContextFactory.SocketType;
import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL; import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_TCACTIVE_OPENSSL;
import static org.apache.cassandra.config.EncryptionOptions.ClientAuth.REQUIRED; import static org.apache.cassandra.config.EncryptionOptions.ClientAuth.REQUIRED;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A Factory for providing and setting up client {@link SSLSocket}s. Also provides * A Factory for providing and setting up client {@link SSLSocket}s. Also provides
@ -337,7 +338,7 @@ public final class SSLFactory
if (settingDescription != null) if (settingDescription != null)
{ {
logger.warn("Dropping unsupported cipher_suite {} from {} configuration", logger.warn("Dropping unsupported cipher_suite {} from {} configuration",
c, settingDescription.toLowerCase()); c, toLowerCaseLocalized(settingDescription));
} }
} }
} }

View File

@ -23,7 +23,6 @@ import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.function.Consumer; import java.util.function.Consumer;
import com.google.common.collect.Range; import com.google.common.collect.Range;
@ -34,6 +33,8 @@ import org.apache.cassandra.db.marshal.ValueAccessor;
import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.ByteBufferUtil;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public abstract class CollectionSerializer<T> extends TypeSerializer<T> public abstract class CollectionSerializer<T> extends TypeSerializer<T>
{ {
protected abstract List<ByteBuffer> serializeValues(T value); protected abstract List<ByteBuffer> serializeValues(T value);
@ -110,7 +111,7 @@ public abstract class CollectionSerializer<T> extends TypeSerializer<T>
*/ */
private String getCollectionName() private String getCollectionName()
{ {
return getType().getSimpleName().toLowerCase(Locale.US); return toLowerCaseLocalized(getType().getSimpleName());
} }
/** /**

View File

@ -80,6 +80,7 @@ import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_KER
import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VERSION; import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VERSION;
import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VM_NAME; import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VM_NAME;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* Verifies that the system and environment is in a fit state to be started. * Verifies that the system and environment is in a fit state to be started.
@ -217,7 +218,7 @@ public class StartupChecks
{ {
try try
{ {
if (affectedFileSystemTypes.contains(Files.getFileStore(path).type().toLowerCase())) if (affectedFileSystemTypes.contains(toLowerCaseLocalized(Files.getFileStore(path).type())))
affectedPaths.add(path); affectedPaths.add(path);
} }
catch (IOException e) catch (IOException e)

View File

@ -177,6 +177,7 @@ import static org.apache.cassandra.service.paxos.v1.PrepareVerbHandler.doPrepare
import static org.apache.cassandra.service.paxos.v1.ProposeVerbHandler.doPropose; import static org.apache.cassandra.service.paxos.v1.ProposeVerbHandler.doPropose;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.Clock.Global.nanoTime; import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID; import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch; import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
import static org.apache.commons.lang3.StringUtils.join; import static org.apache.commons.lang3.StringUtils.join;
@ -2835,7 +2836,7 @@ public class StorageProxy implements StorageProxyMBean
public String setIdealConsistencyLevel(String cl) public String setIdealConsistencyLevel(String cl)
{ {
ConsistencyLevel original = DatabaseDescriptor.getIdealConsistencyLevel(); ConsistencyLevel original = DatabaseDescriptor.getIdealConsistencyLevel();
ConsistencyLevel newCL = ConsistencyLevel.valueOf(cl.trim().toUpperCase()); ConsistencyLevel newCL = ConsistencyLevel.valueOf(toUpperCaseLocalized(cl.trim()));
DatabaseDescriptor.setIdealConsistencyLevel(newCL); DatabaseDescriptor.setIdealConsistencyLevel(newCL);
return String.format("Updating ideal consistency level new value: %s old value %s", newCL, original.toString()); return String.format("Updating ideal consistency level new value: %s old value %s", newCL, original.toString());
} }

View File

@ -52,6 +52,7 @@ import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casReadMe
import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casWriteMetrics; import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casWriteMetrics;
import static org.apache.cassandra.utils.Clock.Global.nanoTime; import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.Clock.waitUntil; import static org.apache.cassandra.utils.Clock.waitUntil;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* <p>A strategy for making back-off decisions for Paxos operations that fail to make progress because of other paxos operations. * <p>A strategy for making back-off decisions for Paxos operations that fail to make progress because of other paxos operations.
@ -369,7 +370,7 @@ public class ContentionStrategy
Type(String traceTitle) Type(String traceTitle)
{ {
this.traceTitle = traceTitle; this.traceTitle = traceTitle;
this.lowercase = name().toLowerCase(); this.lowercase = toLowerCaseLocalized(name());
} }
} }

View File

@ -27,6 +27,8 @@ import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.metrics.SnapshottingTimer; import org.apache.cassandra.metrics.SnapshottingTimer;
import org.apache.cassandra.schema.TableParams; import org.apache.cassandra.schema.TableParams;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy
{ {
private static final Pattern PATTERN = private static final Pattern PATTERN =
@ -128,7 +130,7 @@ public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy
SpeculativeRetryPolicy policy1 = value1 instanceof PercentileSpeculativeRetryPolicy ? value1 : value2; SpeculativeRetryPolicy policy1 = value1 instanceof PercentileSpeculativeRetryPolicy ? value1 : value2;
SpeculativeRetryPolicy policy2 = value1 instanceof FixedSpeculativeRetryPolicy ? value1 : value2; SpeculativeRetryPolicy policy2 = value1 instanceof FixedSpeculativeRetryPolicy ? value1 : value2;
Function function = Function.valueOf(matcher.group("fun").toUpperCase()); Function function = Function.valueOf(toUpperCaseLocalized(matcher.group("fun")));
return new HybridSpeculativeRetryPolicy((PercentileSpeculativeRetryPolicy) policy1, (FixedSpeculativeRetryPolicy) policy2, function); return new HybridSpeculativeRetryPolicy((PercentileSpeculativeRetryPolicy) policy1, (FixedSpeculativeRetryPolicy) policy2, function);
} }

View File

@ -23,6 +23,8 @@ import org.apache.cassandra.locator.Endpoints;
import org.apache.cassandra.locator.ReplicaPlan; import org.apache.cassandra.locator.ReplicaPlan;
import org.apache.cassandra.transport.Dispatcher; import org.apache.cassandra.transport.Dispatcher;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum ReadRepairStrategy implements ReadRepair.Factory public enum ReadRepairStrategy implements ReadRepair.Factory
{ {
NONE NONE
@ -45,6 +47,6 @@ public enum ReadRepairStrategy implements ReadRepair.Factory
public static ReadRepairStrategy fromString(String s) public static ReadRepairStrategy fromString(String s)
{ {
return valueOf(s.toUpperCase()); return valueOf(toUpperCaseLocalized(s));
} }
} }

View File

@ -36,6 +36,7 @@ import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.streaming.StreamingChannel.Factory.Global.streamingFactory; import static org.apache.cassandra.streaming.StreamingChannel.Factory.Global.streamingFactory;
import static org.apache.cassandra.utils.Clock.Global.nanoTime; import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A future on the result ({@link StreamState}) of a streaming plan. * A future on the result ({@link StreamState}) of a streaming plan.
@ -198,7 +199,7 @@ public final class StreamResultFuture extends AsyncFuture<StreamState>
void handleSessionComplete(StreamSession session) void handleSessionComplete(StreamSession session)
{ {
logger.info("[Stream #{}] Session with {} is {}", session.planId(), session.peer, session.state().name().toLowerCase()); logger.info("[Stream #{}] Session with {} is {}", session.planId(), session.peer, toLowerCaseLocalized(session.state().name()));
fireStreamEvent(new StreamEvent.SessionCompleteEvent(session)); fireStreamEvent(new StreamEvent.SessionCompleteEvent(session));
SessionInfo sessionInfo = session.getSessionInfo(); SessionInfo sessionInfo = session.getSessionInfo();
coordinator.addSessionInfo(sessionInfo); coordinator.addSessionInfo(sessionInfo);

View File

@ -42,6 +42,7 @@ import org.apache.cassandra.utils.Clock;
import org.apache.cassandra.utils.ObjectSizes; import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.TimeUUID; import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID; import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
public class StreamingState implements StreamEventHandler, IMeasurableMemory public class StreamingState implements StreamEventHandler, IMeasurableMemory
@ -214,14 +215,14 @@ public class StreamingState implements StreamEventHandler, IMeasurableMemory
{ {
TableBuilder table = new TableBuilder(); TableBuilder table = new TableBuilder();
table.add("id", id.toString()); table.add("id", id.toString());
table.add("status", status().name().toLowerCase()); table.add("status", toLowerCaseLocalized(status().name()));
table.add("progress", (progress() * 100) + "%"); table.add("progress", (progress() * 100) + "%");
table.add("duration_ms", Long.toString(durationMillis())); table.add("duration_ms", Long.toString(durationMillis()));
table.add("last_updated_ms", Long.toString(lastUpdatedAtMillis())); table.add("last_updated_ms", Long.toString(lastUpdatedAtMillis()));
table.add("failure_cause", failureCause()); table.add("failure_cause", failureCause());
table.add("success_message", successMessage()); table.add("success_message", successMessage());
for (Map.Entry<Status, Long> e : stateTimesMillis().entrySet()) for (Map.Entry<Status, Long> e : stateTimesMillis().entrySet())
table.add("status_" + e.getKey().name().toLowerCase() + "_ms", e.toString()); table.add("status_" + toLowerCaseLocalized(e.getKey().name()) + "_ms", e.toString());
return table.toString(); return table.toString();
} }

View File

@ -29,9 +29,11 @@ import com.google.common.collect.ImmutableSet;
import org.apache.cassandra.tcm.extensions.ExtensionKey; import org.apache.cassandra.tcm.extensions.ExtensionKey;
import org.apache.cassandra.tcm.extensions.ExtensionValue; import org.apache.cassandra.tcm.extensions.ExtensionValue;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class MetadataKeys public class MetadataKeys
{ {
public static final String CORE_NS = MetadataKeys.class.getPackage().getName().toLowerCase(Locale.ROOT); public static final String CORE_NS = toLowerCaseLocalized(MetadataKeys.class.getPackage().getName(), Locale.ROOT);
public static final MetadataKey SCHEMA = make(CORE_NS, "schema", "dist_schema"); public static final MetadataKey SCHEMA = make(CORE_NS, "schema", "dist_schema");
public static final MetadataKey NODE_DIRECTORY = make(CORE_NS, "membership", "node_directory"); public static final MetadataKey NODE_DIRECTORY = make(CORE_NS, "membership", "node_directory");

View File

@ -23,6 +23,7 @@ import java.text.SimpleDateFormat;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
import org.apache.cassandra.service.StorageServiceMBean; import org.apache.cassandra.service.StorageServiceMBean;
import org.apache.cassandra.utils.concurrent.Condition; import org.apache.cassandra.utils.concurrent.Condition;
@ -32,10 +33,10 @@ import org.apache.cassandra.utils.progress.jmx.JMXNotificationProgressListener;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.FAILED; import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.FAILED;
import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.valueOf; import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.valueOf;
import static org.apache.cassandra.tools.NodeProbe.JMX_NOTIFICATION_POLL_INTERVAL_SECONDS; import static org.apache.cassandra.tools.NodeProbe.JMX_NOTIFICATION_POLL_INTERVAL_SECONDS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition; import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
import static org.apache.cassandra.utils.progress.ProgressEventType.*; import static org.apache.cassandra.utils.progress.ProgressEventType.*;
@ -165,7 +166,7 @@ public class RepairRunner extends JMXNotificationProgressListener
case FAILED: case FAILED:
printMessage(String.format("%s %s discovered repair %s.", printMessage(String.format("%s %s discovered repair %s.",
triggeringCondition, triggeringCondition,
queriedString, parentRepairStatus.name().toLowerCase())); queriedString, toLowerCaseLocalized(parentRepairStatus.name())));
if (parentRepairStatus == FAILED) if (parentRepairStatus == FAILED)
{ {
error = new IOException(messages.get(0)); error = new IOException(messages.get(0));

View File

@ -58,6 +58,8 @@ import org.apache.cassandra.utils.Pair;
import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST; import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class StandaloneScrubber public class StandaloneScrubber
{ {
@ -241,12 +243,12 @@ public class StandaloneScrubber
static HeaderFixMode fromCommandLine(String value) static HeaderFixMode fromCommandLine(String value)
{ {
return valueOf(value.replace('-', '_').toUpperCase().trim()); return valueOf(toUpperCaseLocalized(value.replace('-', '_')).trim());
} }
String asCommandLineOption() String asCommandLineOption()
{ {
return name().toLowerCase().replace('_', '-'); return toLowerCaseLocalized(name()).replace('_', '-');
} }
} }

View File

@ -41,6 +41,7 @@ import org.apache.cassandra.utils.Pair;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
import static org.apache.commons.lang3.StringUtils.join; import static org.apache.commons.lang3.StringUtils.join;
@Command(name = "profileload", description = "Low footprint profiling of activity for a period of time") @Command(name = "profileload", description = "Low footprint profiling of activity for a period of time")
@ -113,7 +114,7 @@ public class ProfileLoad extends NodeToolCmd
Set<String> available = Arrays.stream(SamplerType.values()).map(Enum::toString).collect(Collectors.toSet()); Set<String> available = Arrays.stream(SamplerType.values()).map(Enum::toString).collect(Collectors.toSet());
for (String s : samplers.split(",")) for (String s : samplers.split(","))
{ {
String sampler = s.trim().toUpperCase(); String sampler = toUpperCaseLocalized(s.trim());
checkArgument(available.contains(sampler), String.format("'%s' sampler is not available from: %s", s, Arrays.toString(SamplerType.values()))); checkArgument(available.contains(sampler), String.format("'%s' sampler is not available from: %s", s, Arrays.toString(SamplerType.values())));
targets.add(sampler); targets.add(sampler);
} }

View File

@ -47,6 +47,7 @@ import org.apache.cassandra.utils.UUIDGen;
import org.apache.cassandra.utils.memory.MemoryUtil; import org.apache.cassandra.utils.memory.MemoryUtil;
import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_NETTY_USE_HEAP_ALLOCATOR; import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_NETTY_USE_HEAP_ALLOCATOR;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* ByteBuf utility methods. * ByteBuf utility methods.
@ -285,7 +286,7 @@ public abstract class CBUtil
String value = CBUtil.readString(cb); String value = CBUtil.readString(cb);
try try
{ {
return Enum.valueOf(enumType, value.toUpperCase()); return Enum.valueOf(enumType, toUpperCaseLocalized(value));
} }
catch (IllegalArgumentException e) catch (IllegalArgumentException e)
{ {
@ -399,7 +400,7 @@ public abstract class CBUtil
Map<String, List<String>> m = new HashMap<String, List<String>>(length); Map<String, List<String>> m = new HashMap<String, List<String>>(length);
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
String k = readString(cb).toUpperCase(); String k = toUpperCaseLocalized(readString(cb));
List<String> v = readStringList(cb); List<String> v = readStringList(cb);
m.put(k, v); m.put(k, v);
} }

View File

@ -38,6 +38,9 @@ import org.apache.cassandra.utils.Hex;
import org.apache.cassandra.utils.JVMStabilityInspector; import org.apache.cassandra.utils.JVMStabilityInspector;
import org.apache.cassandra.utils.MD5Digest; import org.apache.cassandra.utils.MD5Digest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class Client extends SimpleClient public class Client extends SimpleClient
{ {
private final SimpleEventHandler eventHandler = new SimpleEventHandler(); private final SimpleEventHandler eventHandler = new SimpleEventHandler();
@ -100,7 +103,7 @@ public class Client extends SimpleClient
Iterator<String> iter = splitter.split(line).iterator(); Iterator<String> iter = splitter.split(line).iterator();
if (!iter.hasNext()) if (!iter.hasNext())
return null; return null;
String msgType = iter.next().toUpperCase(); String msgType = toUpperCaseLocalized(iter.next());
if (msgType.equals("STARTUP")) if (msgType.equals("STARTUP"))
{ {
Map<String, String> options = new HashMap<String, String>(); Map<String, String> options = new HashMap<String, String>();
@ -108,17 +111,17 @@ public class Client extends SimpleClient
while (iter.hasNext()) while (iter.hasNext())
{ {
String next = iter.next(); String next = iter.next();
if (next.toLowerCase().equals("snappy")) if (toLowerCaseLocalized(next).equals("snappy"))
{ {
options.put(StartupMessage.COMPRESSION, "snappy"); options.put(StartupMessage.COMPRESSION, "snappy");
connection.setCompressor(Compressor.SnappyCompressor.instance); connection.setCompressor(Compressor.SnappyCompressor.instance);
} }
if (next.toLowerCase().equals("lz4")) if (toLowerCaseLocalized(next).equals("lz4"))
{ {
options.put(StartupMessage.COMPRESSION, "lz4"); options.put(StartupMessage.COMPRESSION, "lz4");
connection.setCompressor(Compressor.LZ4Compressor.instance); connection.setCompressor(Compressor.LZ4Compressor.instance);
} }
if (next.toLowerCase().equals("throw_on_overload")) if (toLowerCaseLocalized(next).equals("throw_on_overload"))
{ {
options.put(StartupMessage.THROW_ON_OVERLOAD, "1"); options.put(StartupMessage.THROW_ON_OVERLOAD, "1");
connection.setThrowOnOverload(true); connection.setThrowOnOverload(true);
@ -198,7 +201,7 @@ public class Client extends SimpleClient
} }
else if (msgType.equals("REGISTER")) else if (msgType.equals("REGISTER"))
{ {
String type = line.substring(9).toUpperCase(); String type = toUpperCaseLocalized(line.substring(9));
try try
{ {
return new RegisterMessage(Collections.singletonList(Enum.valueOf(Event.Type.class, type))); return new RegisterMessage(Collections.singletonList(Enum.valueOf(Event.Type.class, type)));

View File

@ -29,6 +29,9 @@ import org.apache.cassandra.service.QueryState;
import org.apache.cassandra.transport.*; import org.apache.cassandra.transport.*;
import org.apache.cassandra.utils.CassandraVersion; import org.apache.cassandra.utils.CassandraVersion;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* The initial message of the protocol. * The initial message of the protocol.
* Sets up a number of connection options. * Sets up a number of connection options.
@ -89,7 +92,7 @@ public class StartupMessage extends Message.Request
if (options.containsKey(COMPRESSION)) if (options.containsKey(COMPRESSION))
{ {
String compression = options.get(COMPRESSION).toLowerCase(); String compression = toLowerCaseLocalized(options.get(COMPRESSION));
if (compression.equals("snappy")) if (compression.equals("snappy"))
{ {
if (Compressor.SnappyCompressor.instance == null) if (Compressor.SnappyCompressor.instance == null)
@ -158,7 +161,7 @@ public class StartupMessage extends Message.Request
{ {
Map<String, String> newMap = new HashMap<String, String>(options.size()); Map<String, String> newMap = new HashMap<String, String>(options.size());
for (Map.Entry<String, String> entry : options.entrySet()) for (Map.Entry<String, String> entry : options.entrySet())
newMap.put(entry.getKey().toUpperCase(), entry.getValue()); newMap.put(toUpperCaseLocalized(entry.getKey()), entry.getValue());
return newMap; return newMap;
} }

View File

@ -103,6 +103,7 @@ import static org.apache.cassandra.config.CassandraRelevantProperties.TRIGGERS_D
import static org.apache.cassandra.config.CassandraRelevantProperties.USER_HOME; import static org.apache.cassandra.config.CassandraRelevantProperties.USER_HOME;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.Clock.Global.nanoTime; import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class FBUtilities public class FBUtilities
{ {
@ -118,7 +119,7 @@ public class FBUtilities
public static final BigInteger TWO = new BigInteger("2"); public static final BigInteger TWO = new BigInteger("2");
private static final String DEFAULT_TRIGGER_DIR = "triggers"; private static final String DEFAULT_TRIGGER_DIR = "triggers";
private static final String OPERATING_SYSTEM = OS_NAME.getString().toLowerCase(); private static final String OPERATING_SYSTEM = toLowerCaseLocalized(OS_NAME.getString());
public static final boolean isLinux = OPERATING_SYSTEM.contains("linux"); public static final boolean isLinux = OPERATING_SYSTEM.contains("linux");
private static volatile InetAddress localInetAddress; private static volatile InetAddress localInetAddress;
@ -1364,7 +1365,7 @@ public class FBUtilities
public static String camelToSnake(String camel) public static String camelToSnake(String camel)
{ {
if (camel.chars().allMatch(Character::isUpperCase)) if (camel.chars().allMatch(Character::isUpperCase))
return camel.toLowerCase(); return toLowerCaseLocalized(camel);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (char c : camel.toCharArray()) for (char c : camel.toCharArray())
@ -1374,7 +1375,7 @@ public class FBUtilities
// if first char is uppercase, then avoid adding the _ prefix // if first char is uppercase, then avoid adding the _ prefix
if (sb.length() > 0) if (sb.length() > 0)
sb.append('_'); sb.append('_');
sb.append(Character.toLowerCase(c)); sb.append(Character.toLowerCase(c)); // checkstyle: permit this invocation
} }
else else
{ {

View File

@ -23,6 +23,7 @@ import java.util.Random;
import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_SECURITY_EGD; import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_SECURITY_EGD;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class GuidGenerator public class GuidGenerator
{ {
@ -101,7 +102,7 @@ public class GuidGenerator
private static String convertToStandardFormat(String valueAfterMD5) private static String convertToStandardFormat(String valueAfterMD5)
{ {
String raw = valueAfterMD5.toUpperCase(); String raw = toUpperCaseLocalized(valueAfterMD5);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(raw.substring(0, 8)) sb.append(raw.substring(0, 8))
.append("-") .append("-")

View File

@ -23,7 +23,6 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonFactory;
@ -38,6 +37,7 @@ import org.apache.cassandra.io.util.FileOutputStreamPlus;
import org.apache.cassandra.serializers.MarshalException; import org.apache.cassandra.serializers.MarshalException;
import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE; import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class JsonUtils public final class JsonUtils
{ {
@ -203,7 +203,7 @@ public final class JsonUtils
} }
// otherwise, lowercase it if needed // otherwise, lowercase it if needed
String lowered = mapKey.toLowerCase(Locale.US); String lowered = toLowerCaseLocalized(mapKey);
if (!mapKey.equals(lowered)) if (!mapKey.equals(lowered))
valueMap.put(lowered, valueMap.remove(mapKey)); valueMap.put(lowered, valueMap.remove(mapKey));
} }

View File

@ -0,0 +1,60 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.utils;
import java.util.Locale;
public class LocalizeString
{
/**
* Convert the String to lower case, using {@link java.util.Locale#US} by default
*/
public static String toLowerCaseLocalized(String input)
{
return toLowerCaseLocalized(input, Locale.US);
}
/**
* @param input The string to be converted to lower case.
* @param locale The locale to use for the conversion.
* @return String itself with lowercase and localized by your selection of {@link java.util.Locale}.
*/
public static String toLowerCaseLocalized(String input, Locale locale)
{
return input.toLowerCase(locale); // checkstyle: permit this invocation
}
/**
* Convert the String to upper case, using {@link java.util.Locale#US} by default
*/
public static String toUpperCaseLocalized(String input)
{
return toUpperCaseLocalized(input, Locale.US);
}
/**
* @param input The string to be converted to uppercase.
* @param locale The locale to use for the conversion. This parameter is optional.
* @return String itself with uppercase and localized by your selection of {@link java.util.Locale}.
*/
public static String toUpperCaseLocalized(String input, Locale locale)
{
return input.toUpperCase(locale); // checkstyle: permit this invocation
}
}

View File

@ -35,6 +35,7 @@ import org.apache.cassandra.io.FSWriteError;
import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS; import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS;
import static org.apache.cassandra.config.CassandraRelevantProperties.OS_ARCH; import static org.apache.cassandra.config.CassandraRelevantProperties.OS_ARCH;
import static org.apache.cassandra.config.CassandraRelevantProperties.OS_NAME; import static org.apache.cassandra.config.CassandraRelevantProperties.OS_NAME;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.NativeLibrary.OSType.LINUX; import static org.apache.cassandra.utils.NativeLibrary.OSType.LINUX;
import static org.apache.cassandra.utils.NativeLibrary.OSType.MAC; import static org.apache.cassandra.utils.NativeLibrary.OSType.MAC;
import static org.apache.cassandra.utils.NativeLibrary.OSType.AIX; import static org.apache.cassandra.utils.NativeLibrary.OSType.AIX;
@ -102,7 +103,7 @@ public final class NativeLibrary
default: wrappedLibrary = new NativeLibraryLinux(); default: wrappedLibrary = new NativeLibraryLinux();
} }
if (OS_ARCH.getString().toLowerCase().contains("ppc")) if (toLowerCaseLocalized(OS_ARCH.getString()).contains("ppc"))
{ {
if (osType == LINUX) if (osType == LINUX)
{ {
@ -134,7 +135,7 @@ public final class NativeLibrary
*/ */
private static OSType getOsType() private static OSType getOsType()
{ {
String osName = OS_NAME.getString().toLowerCase(); String osName = toLowerCaseLocalized(OS_NAME.getString());
if (osName.contains("linux")) if (osName.contains("linux"))
return LINUX; return LINUX;
else if (osName.contains("mac")) else if (osName.contains("mac"))

View File

@ -35,6 +35,8 @@ import org.apache.cassandra.dht.Token.TokenFactory;
import org.apache.cassandra.io.sstable.SSTableLoader; import org.apache.cassandra.io.sstable.SSTableLoader;
import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadata;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class NativeSSTableLoaderClient extends SSTableLoader.Client public class NativeSSTableLoaderClient extends SSTableLoader.Client
{ {
protected final Map<String, TableMetadataRef> tables; protected final Map<String, TableMetadataRef> tables;
@ -203,7 +205,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client
private static ColumnMetadata createDefinitionFromRow(Row row, String keyspace, String table, Types types) private static ColumnMetadata createDefinitionFromRow(Row row, String keyspace, String table, Types types)
{ {
ClusteringOrder order = ClusteringOrder.valueOf(row.getString("clustering_order").toUpperCase()); ClusteringOrder order = ClusteringOrder.valueOf(toUpperCaseLocalized(row.getString("clustering_order")));
AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), types); AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), types);
if (order == ClusteringOrder.DESC) if (order == ClusteringOrder.DESC)
type = ReversedType.getInstance(type); type = ReversedType.getInstance(type);
@ -211,7 +213,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client
ColumnIdentifier name = new ColumnIdentifier(row.getBytes("column_name_bytes"), row.getString("column_name")); ColumnIdentifier name = new ColumnIdentifier(row.getBytes("column_name_bytes"), row.getString("column_name"));
int position = row.getInt("position"); int position = row.getInt("position");
org.apache.cassandra.schema.ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase()); org.apache.cassandra.schema.ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(toUpperCaseLocalized(row.getString("kind")));
return new ColumnMetadata(keyspace, table, name, type, position, kind, null); return new ColumnMetadata(keyspace, table, name, type, position, kind, null);
} }
@ -219,7 +221,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client
{ {
String name = row.getString("column_name"); String name = row.getString("column_name");
AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), Types.none()); AbstractType<?> type = CQLTypeParser.parse(keyspace, row.getString("type"), Types.none());
ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase()); ColumnMetadata.Kind kind = ColumnMetadata.Kind.valueOf(toUpperCaseLocalized(row.getString("kind")));
ColumnMetadata column = new ColumnMetadata(keyspace, table, ColumnIdentifier.getInterned(name, true), type, ColumnMetadata.NO_POSITION, kind, null); ColumnMetadata column = new ColumnMetadata(keyspace, table, ColumnIdentifier.getInterned(name, true), type, ColumnMetadata.NO_POSITION, kind, null);
long droppedTime = row.getTimestamp("dropped_time").getTime(); long droppedTime = row.getTimestamp("dropped_time").getTime();
return new DroppedColumn(column, droppedTime); return new DroppedColumn(column, droppedTime);

View File

@ -54,6 +54,7 @@ import org.apache.cassandra.utils.concurrent.WeightedQueue;
import static java.lang.String.format; import static java.lang.String.format;
import static org.apache.cassandra.config.CassandraRelevantProperties.CHRONICLE_ANNOUNCER_DISABLE; import static org.apache.cassandra.config.CassandraRelevantProperties.CHRONICLE_ANNOUNCER_DISABLE;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/** /**
* Bin log is a is quick and dirty binary log that is kind of a NIH version of binary logging with a traditional logging * Bin log is a is quick and dirty binary log that is kind of a NIH version of binary logging with a traditional logging
@ -389,7 +390,7 @@ public class BinLog implements Runnable
public Builder rollCycle(String rollCycle) public Builder rollCycle(String rollCycle)
{ {
Preconditions.checkNotNull(rollCycle, "rollCycle was null"); Preconditions.checkNotNull(rollCycle, "rollCycle was null");
rollCycle = rollCycle.toUpperCase(); rollCycle = toUpperCaseLocalized(rollCycle);
Preconditions.checkNotNull(RollCycles.valueOf(rollCycle), "unrecognized roll cycle"); Preconditions.checkNotNull(RollCycles.valueOf(rollCycle), "unrecognized roll cycle");
this.rollCycle = rollCycle; this.rollCycle = rollCycle;
return this; return this;

View File

@ -29,6 +29,8 @@ import org.apache.cassandra.distributed.impl.Instance;
import org.apache.cassandra.distributed.shared.Versions; import org.apache.cassandra.distributed.shared.Versions;
import org.apache.cassandra.net.Message; import org.apache.cassandra.net.Message;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* A simple cluster supporting only the 'current' Cassandra version, offering easy access to the convenience methods * A simple cluster supporting only the 'current' Cassandra version, offering easy access to the convenience methods
* of IInvokableInstance on each node. * of IInvokableInstance on each node.
@ -81,7 +83,7 @@ public class Cluster extends AbstractCluster<IInvokableInstance>
{ {
get(1).acceptsOnInstance((IIsolatedExecutor.SerializableConsumer<IMessage>) (msgPassed) -> { get(1).acceptsOnInstance((IIsolatedExecutor.SerializableConsumer<IMessage>) (msgPassed) -> {
Message decoded = Instance.deserializeMessage(msgPassed); Message decoded = Instance.deserializeMessage(msgPassed);
if (!decoded.verb().toString().toLowerCase().contains("gossip")) if (!toLowerCaseLocalized(decoded.verb().toString()).contains("gossip"))
System.out.println(String.format("MSG %d -> %d: %s | %s", from, to, decoded, decoded.payload)); System.out.println(String.format("MSG %d -> %d: %s | %s", from, to, decoded, decoded.payload));
}).accept(msg); }).accept(msg);
} }

View File

@ -76,6 +76,8 @@ import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
import org.apache.cassandra.service.StorageService; import org.apache.cassandra.service.StorageService;
import org.awaitility.Awaitility; import org.awaitility.Awaitility;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
@RunWith(Parameterized.class) @RunWith(Parameterized.class)
public class FailingRepairTest extends TestBaseImpl implements Serializable public class FailingRepairTest extends TestBaseImpl implements Serializable
{ {
@ -132,7 +134,7 @@ public class FailingRepairTest extends TestBaseImpl implements Serializable
private static String getCfName(Verb type, RepairParallelism parallelism, boolean withTracing) private static String getCfName(Verb type, RepairParallelism parallelism, boolean withTracing)
{ {
return type.name().toLowerCase() + "_" + parallelism.name().toLowerCase() + "_" + withTracing; return toLowerCaseLocalized(type.name()) + "_" + toLowerCaseLocalized(parallelism.name()) + "_" + withTracing;
} }
@BeforeClass @BeforeClass

View File

@ -33,6 +33,8 @@ import org.apache.cassandra.exceptions.SyntaxException;
import org.apache.cassandra.utils.Throwables; import org.apache.cassandra.utils.Throwables;
import org.apache.cassandra.utils.TimeUUID; import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class ReadDigestConsistencyTest extends TestBaseImpl public class ReadDigestConsistencyTest extends TestBaseImpl
{ {
private final static Logger logger = LoggerFactory.getLogger(ReadDigestConsistencyTest.class); private final static Logger logger = LoggerFactory.getLogger(ReadDigestConsistencyTest.class);
@ -101,7 +103,7 @@ public class ReadDigestConsistencyTest extends TestBaseImpl
Arrays.toString(boundValues), Arrays.toString(boundValues),
coordinator.instance().broadcastAddress(), coordinator.instance().broadcastAddress(),
coordinator.instance().getReleaseVersionString()), coordinator.instance().getReleaseVersionString()),
activity.toLowerCase().contains("mismatch for key")); toLowerCaseLocalized(activity).contains("mismatch for key"));
} }
} }

View File

@ -35,6 +35,7 @@ import org.apache.cassandra.distributed.test.DistributedRepairUtils.RepairParall
import org.apache.cassandra.distributed.test.DistributedRepairUtils.RepairType; import org.apache.cassandra.distributed.test.DistributedRepairUtils.RepairType;
import static org.apache.cassandra.config.CassandraRelevantProperties.NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS; import static org.apache.cassandra.config.CassandraRelevantProperties.NODETOOL_JMX_NOTIFICATION_POLL_INTERVAL_SECONDS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class RepairCoordinatorBase extends TestBaseImpl public class RepairCoordinatorBase extends TestBaseImpl
{ {
@ -98,7 +99,7 @@ public class RepairCoordinatorBase extends TestBaseImpl
protected String postfix() protected String postfix()
{ {
return repairType.name().toLowerCase() + "_" + parallelism.name().toLowerCase() + "_" + withNotifications; return toLowerCaseLocalized(repairType.name()) + "_" + toLowerCaseLocalized(parallelism.name()) + "_" + withNotifications;
} }
protected NodeToolResult repair(int node, String... args) { protected NodeToolResult repair(int node, String... args) {

View File

@ -42,6 +42,7 @@ import org.apache.cassandra.net.Verb;
import static java.lang.String.format; import static java.lang.String.format;
import static org.apache.cassandra.distributed.api.IMessageFilters.Matcher.of; import static org.apache.cassandra.distributed.api.IMessageFilters.Matcher.of;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
@RunWith(Parameterized.class) @RunWith(Parameterized.class)
@Ignore("Until CASSANDRA-15566 is in these tests all time out") @Ignore("Until CASSANDRA-15566 is in these tests all time out")
@ -100,7 +101,7 @@ public class RepairCoordinatorFailingMessageTest extends TestBaseImpl implements
private String postfix() private String postfix()
{ {
return repairType.name().toLowerCase(); return toLowerCaseLocalized(repairType.name());
} }
private NodeToolResult repair(int node, String... args) { private NodeToolResult repair(int node, String... args) {

View File

@ -67,6 +67,7 @@ import static org.apache.cassandra.db.SystemKeyspace.LEGACY_SSTABLE_ACTIVITY;
import static org.apache.cassandra.db.SystemKeyspace.SSTABLE_ACTIVITY_V2; import static org.apache.cassandra.db.SystemKeyspace.SSTABLE_ACTIVITY_V2;
import static org.apache.cassandra.distributed.shared.FutureUtils.waitOn; import static org.apache.cassandra.distributed.shared.FutureUtils.waitOn;
import static org.apache.cassandra.distributed.test.ExecUtil.rethrow; import static org.apache.cassandra.distributed.test.ExecUtil.rethrow;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
public class SSTableIdGenerationTest extends TestBaseImpl public class SSTableIdGenerationTest extends TestBaseImpl
@ -176,7 +177,7 @@ public class SSTableIdGenerationTest extends TestBaseImpl
// create a table and two sstables with sequential id for each strategy, the sstables will contain overlapping partitions // create a table and two sstables with sequential id for each strategy, the sstables will contain overlapping partitions
for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses) for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses)
{ {
String tableName = "tbl_" + compactionStrategyClass.getSimpleName().toLowerCase(); String tableName = "tbl_" + toLowerCaseLocalized(compactionStrategyClass.getSimpleName());
cluster.schemaChange(createTableStmt(KEYSPACE, tableName, compactionStrategyClass)); cluster.schemaChange(createTableStmt(KEYSPACE, tableName, compactionStrategyClass));
createSSTables(cluster.get(1), KEYSPACE, tableName, 1, 2); createSSTables(cluster.get(1), KEYSPACE, tableName, 1, 2);
@ -189,7 +190,7 @@ public class SSTableIdGenerationTest extends TestBaseImpl
// create another two sstables with uuid for each previously created table // create another two sstables with uuid for each previously created table
for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses) for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses)
{ {
String tableName = "tbl_" + compactionStrategyClass.getSimpleName().toLowerCase(); String tableName = "tbl_" + toLowerCaseLocalized(compactionStrategyClass.getSimpleName());
createSSTables(cluster.get(1), KEYSPACE, tableName, 3, 4); createSSTables(cluster.get(1), KEYSPACE, tableName, 3, 4);

View File

@ -78,6 +78,8 @@ import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.ObjectSizes; import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.concurrent.Refs; import org.apache.cassandra.utils.concurrent.Refs;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class CompactionAllocationTest public class CompactionAllocationTest
{ {
private static final Logger logger = LoggerFactory.getLogger(CompactionAllocationTest.class); private static final Logger logger = LoggerFactory.getLogger(CompactionAllocationTest.class);
@ -494,7 +496,7 @@ public class CompactionAllocationTest
private static void testTinyPartitions(String name, int numSSTable, int sstablePartitions, boolean overlap) throws Throwable private static void testTinyPartitions(String name, int numSSTable, int sstablePartitions, boolean overlap) throws Throwable
{ {
String ksname = "ks_" + name.toLowerCase(); String ksname = "ks_" + toLowerCaseLocalized(name);
SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1), SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", ksname).build()); CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", ksname).build());
@ -603,7 +605,7 @@ public class CompactionAllocationTest
private static void testMediumPartitions(String name, int numSSTable, int sstablePartitions, boolean overlap, boolean overlapCK) throws Throwable private static void testMediumPartitions(String name, int numSSTable, int sstablePartitions, boolean overlap, boolean overlapCK) throws Throwable
{ {
String ksname = "ks_" + name.toLowerCase(); String ksname = "ks_" + toLowerCaseLocalized(name);
SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1), SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build()); CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build());
@ -702,7 +704,7 @@ public class CompactionAllocationTest
private static void testWidePartitions(String name, int numSSTable, int sstablePartitions, boolean overlap, boolean overlapCK) throws Throwable private static void testWidePartitions(String name, int numSSTable, int sstablePartitions, boolean overlap, boolean overlapCK) throws Throwable
{ {
String ksname = "ks_" + name.toLowerCase(); String ksname = "ks_" + toLowerCaseLocalized(name);
SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1), SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build()); CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build());
@ -806,7 +808,7 @@ public class CompactionAllocationTest
int sstablePartitions, int sstablePartitions,
IndexDef...indexes) throws Throwable IndexDef...indexes) throws Throwable
{ {
String ksname = "ks_" + name.toLowerCase(); String ksname = "ks_" + toLowerCaseLocalized(name);
SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1), SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build()); CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build());

View File

@ -897,7 +897,7 @@ public abstract class Action implements PriorityQueueNode
continue; continue;
if (!transitive.is(modifier)) builder.append(modifier.displayId); if (!transitive.is(modifier)) builder.append(modifier.displayId);
else builder.append(Character.toUpperCase(modifier.displayId)); else builder.append(Character.toUpperCase(modifier.displayId)); // checkstyle: permit this invocation
} }
boolean hasTransitiveOnly = false; boolean hasTransitiveOnly = false;

View File

@ -81,6 +81,7 @@ import static org.apache.cassandra.simulator.debug.Record.record;
import static org.apache.cassandra.simulator.debug.SelfReconcile.reconcileWithSelf; import static org.apache.cassandra.simulator.debug.SelfReconcile.reconcileWithSelf;
import static org.apache.cassandra.simulator.utils.IntRange.parseRange; import static org.apache.cassandra.simulator.utils.IntRange.parseRange;
import static org.apache.cassandra.simulator.utils.LongRange.parseNanosRange; import static org.apache.cassandra.simulator.utils.LongRange.parseNanosRange;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
@SuppressWarnings({ "ZeroLengthArrayAllocation", "CodeBlock2Expr", "SameParameterValue", "DynamicRegexReplaceableByCompiledPattern", "CallToSystemGC" }) @SuppressWarnings({ "ZeroLengthArrayAllocation", "CodeBlock2Expr", "SameParameterValue", "DynamicRegexReplaceableByCompiledPattern", "CallToSystemGC" })
public class SimulationRunner public class SimulationRunner
@ -281,7 +282,7 @@ public class SimulationRunner
Optional.ofNullable(topologyChanges).ifPresent(topologyChanges -> { Optional.ofNullable(topologyChanges).ifPresent(topologyChanges -> {
builder.topologyChanges(stream(topologyChanges.split(",")) builder.topologyChanges(stream(topologyChanges.split(","))
.filter(v -> !v.isEmpty()) .filter(v -> !v.isEmpty())
.map(v -> TopologyChange.valueOf(v.toUpperCase())) .map(v -> TopologyChange.valueOf(toUpperCaseLocalized(v)))
.toArray(TopologyChange[]::new)); .toArray(TopologyChange[]::new));
}); });
parseNanosRange(Optional.ofNullable(topologyChangeInterval)).ifPresent(builder::topologyChangeIntervalNanos); parseNanosRange(Optional.ofNullable(topologyChangeInterval)).ifPresent(builder::topologyChangeIntervalNanos);
@ -289,7 +290,7 @@ public class SimulationRunner
Optional.ofNullable(priority).ifPresent(kinds -> { Optional.ofNullable(priority).ifPresent(kinds -> {
builder.scheduler(stream(kinds.split(",")) builder.scheduler(stream(kinds.split(","))
.filter(v -> !v.isEmpty()) .filter(v -> !v.isEmpty())
.map(v -> RunnableActionScheduler.Kind.valueOf(v.toUpperCase())) .map(v -> RunnableActionScheduler.Kind.valueOf(toUpperCaseLocalized(v)))
.toArray(RunnableActionScheduler.Kind[]::new)); .toArray(RunnableActionScheduler.Kind[]::new));
}); });

View File

@ -52,6 +52,7 @@ import static org.apache.cassandra.config.CassandraRelevantProperties.ALLOW_UNSA
import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION; import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION;
import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION_ALGO; import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_COMPRESSION_ALGO;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis; import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class SchemaLoader public class SchemaLoader
{ {
@ -745,7 +746,7 @@ public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfN
private static CompressionParams compressionParams(int chunkLength) private static CompressionParams compressionParams(int chunkLength)
{ {
String algo = TEST_COMPRESSION_ALGO.getString().toLowerCase(); String algo = toLowerCaseLocalized(TEST_COMPRESSION_ALGO.getString());
switch (algo) switch (algo)
{ {
case "deflate": case "deflate":

View File

@ -41,6 +41,7 @@ import static org.apache.cassandra.auth.AuthKeyspace.NETWORK_PERMISSIONS;
import static org.apache.cassandra.auth.AuthTestUtils.auth; import static org.apache.cassandra.auth.AuthTestUtils.auth;
import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount; import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount;
import static org.apache.cassandra.schema.SchemaConstants.AUTH_KEYSPACE_NAME; import static org.apache.cassandra.schema.SchemaConstants.AUTH_KEYSPACE_NAME;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -100,7 +101,7 @@ public class CassandraNetworkAuthorizerTest extends CQLTester
private static String createName() private static String createName()
{ {
return RandomStringUtils.randomAlphabetic(8).toLowerCase(); return toLowerCaseLocalized(RandomStringUtils.randomAlphabetic(8));
} }
private static DCPermissions dcPerms(String username) private static DCPermissions dcPerms(String username)

View File

@ -28,6 +28,7 @@ import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.GIBIBYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.GIBIBYTES;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES; import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.quicktheories.QuickTheory.qt; import static org.quicktheories.QuickTheory.qt;
@ -242,7 +243,7 @@ public class DataStorageSpecTest
{ {
qt().forAll(gen()).check(there -> { qt().forAll(gen()).check(there -> {
DataStorageSpec.LongBytesBound back = new DataStorageSpec.LongBytesBound(there.toString()); DataStorageSpec.LongBytesBound back = new DataStorageSpec.LongBytesBound(there.toString());
DataStorageSpec.LongBytesBound BACK = new DataStorageSpec.LongBytesBound(there.toString().toUpperCase(Locale.ROOT).replace("I", "i")); DataStorageSpec.LongBytesBound BACK = new DataStorageSpec.LongBytesBound(toUpperCaseLocalized(there.toString(), Locale.ROOT).replace("I", "i"));
return there.equals(back) && there.equals(BACK); return there.equals(back) && there.equals(BACK);
}); });
} }

View File

@ -282,6 +282,7 @@ public class DatabaseDescriptorRefTest
"org.apache.cassandra.utils.CloseableIterator", "org.apache.cassandra.utils.CloseableIterator",
"org.apache.cassandra.utils.FBUtilities", "org.apache.cassandra.utils.FBUtilities",
"org.apache.cassandra.utils.FBUtilities$1", "org.apache.cassandra.utils.FBUtilities$1",
"org.apache.cassandra.utils.LocalizeString",
"org.apache.cassandra.utils.SystemInfo", "org.apache.cassandra.utils.SystemInfo",
"org.apache.cassandra.utils.Pair", "org.apache.cassandra.utils.Pair",
"org.apache.cassandra.utils.binlog.BinLogOptions", "org.apache.cassandra.utils.binlog.BinLogOptions",

View File

@ -39,7 +39,6 @@ import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -204,6 +203,7 @@ import static org.apache.cassandra.cql3.SchemaElement.SchemaElementType.TABLE;
import static org.apache.cassandra.cql3.SchemaElement.SchemaElementType.TYPE; import static org.apache.cassandra.cql3.SchemaElement.SchemaElementType.TYPE;
import static org.apache.cassandra.metrics.CassandraMetricsRegistry.createMetricsKeyspaceTables; import static org.apache.cassandra.metrics.CassandraMetricsRegistry.createMetricsKeyspaceTables;
import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_METRICS; import static org.apache.cassandra.schema.SchemaConstants.VIRTUAL_METRICS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -1046,7 +1046,7 @@ public abstract class CQLTester
private String createSchemaElementName(SchemaElement.SchemaElementType type, String keyspace) private String createSchemaElementName(SchemaElement.SchemaElementType type, String keyspace)
{ {
String prefix = keyspace == null ? "" : keyspace + '.'; String prefix = keyspace == null ? "" : keyspace + '.';
String typeName = type == MATERIALIZED_VIEW ? "mv" : type.name().toLowerCase(Locale.US); String typeName = type == MATERIALIZED_VIEW ? "mv" : toLowerCaseLocalized(type.name());
int sequence = seqNumber.getAndIncrement(); int sequence = seqNumber.getAndIncrement();
int usedSpaceSoFar = prefix.length() + typeName.length() + Math.max(2, numberOfDigits(sequence)) + 1; int usedSpaceSoFar = prefix.length() + typeName.length() + Math.max(2, numberOfDigits(sequence)) + 1;
String testMethodName = StringUtils.truncate(getTestMethodName(), SchemaConstants.NAME_LENGTH - usedSpaceSoFar); String testMethodName = StringUtils.truncate(getTestMethodName(), SchemaConstants.NAME_LENGTH - usedSpaceSoFar);
@ -1329,7 +1329,7 @@ public abstract class CQLTester
index = ParseUtils.isQuoted(index, '\"') index = ParseUtils.isQuoted(index, '\"')
? ParseUtils.unDoubleQuote(index) ? ParseUtils.unDoubleQuote(index)
: index.toLowerCase(); : toLowerCaseLocalized(index);
return Pair.create(keyspace, index); return Pair.create(keyspace, index);
} }
@ -2738,7 +2738,7 @@ public abstract class CQLTester
private String getTestMethodName() private String getTestMethodName()
{ {
return decorateCQLWithTestNames && testName.getMethodName() != null ? '_' + testName.getMethodName().toLowerCase().replaceAll("[^\\w]", "_") return decorateCQLWithTestNames && testName.getMethodName() != null ? '_' + toLowerCaseLocalized(testName.getMethodName()).replaceAll("[^\\w]", "_")
: ""; : "";
} }

View File

@ -31,6 +31,8 @@ import org.junit.Test;
import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.exceptions.SyntaxException;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/** /**
* This class tests all keywords which took a long time. Hence it was split into multiple * This class tests all keywords which took a long time. Hence it was split into multiple
* KeywordTestSplitN to prevent CI timing out. If timeouts reappear split it further * KeywordTestSplitN to prevent CI timing out. If timeouts reappear split it further
@ -105,7 +107,7 @@ public abstract class KeywordTestBase extends CQLTester
logger.info(selectStatement); logger.info(selectStatement);
rs = execute(selectStatement); rs = execute(selectStatement);
row = rs.one(); row = rs.one();
String value = row.getString(keyword.toLowerCase()); String value = row.getString(toLowerCaseLocalized(keyword));
Assert.assertEquals(keyword, value); Assert.assertEquals(keyword, value);
/* Make a materialized view using the fields (cannot re-use the name as MV must be in same keyspace). /* Make a materialized view using the fields (cannot re-use the name as MV must be in same keyspace).

View File

@ -29,6 +29,8 @@ import org.apache.cassandra.schema.SchemaConstants;
import org.apache.cassandra.schema.UserFunctions; import org.apache.cassandra.schema.UserFunctions;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class NativeFunctionsTest public class NativeFunctionsTest
{ {
/** /**
@ -154,7 +156,7 @@ public class NativeFunctionsTest
Assertions.assertThat(function.argTypes()).isEqualTo(newFunction.argTypes()); Assertions.assertThat(function.argTypes()).isEqualTo(newFunction.argTypes());
Assertions.assertThat(function.returnType()).isEqualTo(newFunction.returnType()); Assertions.assertThat(function.returnType()).isEqualTo(newFunction.returnType());
Assertions.assertThat(function.getClass()).isEqualTo(newFunction.getClass()); Assertions.assertThat(function.getClass()).isEqualTo(newFunction.getClass());
Assertions.assertThat(function.name().name.toLowerCase()) Assertions.assertThat(toLowerCaseLocalized(function.name().name))
.isEqualTo(StringUtils.remove(newFunction.name().name, '_')); .isEqualTo(StringUtils.remove(newFunction.name().name, '_'));
} }
} }
@ -190,7 +192,7 @@ public class NativeFunctionsTest
Assertions.assertThat(factory.name).isNotEqualTo(newFactory.name); Assertions.assertThat(factory.name).isNotEqualTo(newFactory.name);
Assertions.assertThat(factory.parameters).isEqualTo(newFactory.parameters); Assertions.assertThat(factory.parameters).isEqualTo(newFactory.parameters);
Assertions.assertThat(factory.getClass()).isEqualTo(newFactory.getClass()); Assertions.assertThat(factory.getClass()).isEqualTo(newFactory.getClass());
Assertions.assertThat(factory.name().name.toLowerCase()) Assertions.assertThat(toLowerCaseLocalized(factory.name().name))
.isEqualTo(StringUtils.remove(newFactory.name().name, '_')); .isEqualTo(StringUtils.remove(newFactory.name().name, '_'));
} }
} }
@ -198,7 +200,7 @@ public class NativeFunctionsTest
private static boolean satisfiesConventions(FunctionName functionName) private static boolean satisfiesConventions(FunctionName functionName)
{ {
String name = functionName.name; String name = functionName.name;
return name.equals(name.toLowerCase()) && return name.equals(toLowerCaseLocalized(name)) &&
!LEGACY_FUNCTION_NAMES.containsKey(name); !LEGACY_FUNCTION_NAMES.containsKey(name);
} }
} }

Some files were not shown because too many files have changed in this diff Show More