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

@ -63,6 +63,12 @@
<property name="influenceFormat" value="0"/>
</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">
<!-- block system time -->
<property name="id" value="blockSystemClock"/>
@ -151,6 +157,14 @@
<property name="message" value="Avoid Short() and use Short.valueOf()" />
</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">
<property name="offCommentFormat" value="checkstyle: suppress below '([\w\|]+)'"/>
<property name="idFormat" value="$1"/>

View File

@ -1,4 +1,5 @@
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)
* Fix type check for referenced duration type for nested types (CASSANDRA-19890)
* 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.schema.ColumnMetadata;
import org.apache.cassandra.utils.Pair;
import org.apache.cassandra.utils.LocalizeString;
}
@members {

View File

@ -722,7 +722,7 @@ createFunctionStatement returns [CreateFunctionStatement.Raw stmt]
K_LANGUAGE language = IDENT
K_AS body = STRING_LITERAL
{ $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]
: 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]
@ -1642,7 +1642,7 @@ functionName returns [FunctionName s]
;
allowedFunctionName returns [String s]
: f=IDENT { $s = $f.text.toLowerCase(); }
: f=IDENT { $s = LocalizeString.toLowerCaseLocalized($f.text); }
| f=QUOTED_NAME { $s = $f.text; }
| u=unreserved_function_keyword { $s = u; }
| 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.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).
*
@ -387,7 +389,7 @@ public class AuditLogManager implements QueryEvents.Listener, AuthEvents.Listene
{
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.";
}
}

View File

@ -34,6 +34,8 @@ import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.io.util.File;
import org.apache.cassandra.utils.binlog.BinLogOptions;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class AuditLogOptions extends BinLogOptions
{
public volatile boolean enabled = false;
@ -143,13 +145,13 @@ public class AuditLogOptions extends BinLogOptions
public Builder withIncludedCategories(final String includedCategories)
{
sanitise(includedCategories).map(v -> this.includedCategories = v.toUpperCase());
sanitise(includedCategories).map(v -> this.includedCategories = toUpperCaseLocalized(v));
return this;
}
public Builder withExcludedCategories(final String excludedCategories)
{
sanitise(excludedCategories).map(v -> this.excludedCategories = v.toUpperCase());
sanitise(excludedCategories).map(v -> this.excludedCategories = toUpperCaseLocalized(v));
return this;
}
@ -173,7 +175,7 @@ public class AuditLogOptions extends BinLogOptions
public Builder withRollCycle(final String rollCycle)
{
sanitise(rollCycle).map(v -> this.rollCycle = v.toUpperCase());
sanitise(rollCycle).map(v -> this.rollCycle = toUpperCaseLocalized(v));
return this;
}
@ -230,8 +232,8 @@ public class AuditLogOptions extends BinLogOptions
opts.logger = this.logger;
sanitise(this.includedKeyspaces).map(v -> opts.included_keyspaces = v);
sanitise(this.excludedKeyspaces).map(v -> opts.excluded_keyspaces = v);
sanitise(this.includedCategories).map(v -> opts.included_categories = v.toUpperCase());
sanitise(this.excludedCategories).map(v -> opts.excluded_categories = v.toUpperCase());
sanitise(this.includedCategories).map(v -> opts.included_categories = toUpperCaseLocalized(v));
sanitise(this.excludedCategories).map(v -> opts.excluded_categories = toUpperCaseLocalized(v));
sanitise(this.includedUsers).map(v -> opts.included_users = v);
sanitise(this.excludedUsers).map(v -> opts.excluded_users = v);
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 org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum Stage
{
@ -79,7 +80,7 @@ public enum Stage
private static String normalizeName(String stageName)
{
// Handle discrepancy between JMX names and actual pool names
String upperStageName = stageName.toUpperCase();
String upperStageName = toUpperCaseLocalized(stageName);
if (upperStageName.endsWith("STAGE"))
{
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.StorageCompatibilityMode;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
// checkstyle: suppress below 'blockSystemPropertyUsage'
/** 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 <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 defaultValue to return when not defined
@ -942,11 +944,11 @@ public enum CassandraRelevantProperties
String value = System.getProperty(key);
if (value == null)
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
*
* @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)
{
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 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
@ -76,7 +77,7 @@ public abstract class DataRateSpec
// negatives are not allowed by the regex pattern
if (minUnit.convert(quantity, unit) >= max)
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)
@ -86,8 +87,8 @@ public abstract class DataRateSpec
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",
quantity, unit.name().toLowerCase(),
max - 1, minUnit.name().toLowerCase()));
quantity, toLowerCaseLocalized(unit.name()),
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

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.KIBIBYTES;
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
@ -99,7 +100,7 @@ public abstract class DataStorageSpec
if (minUnit.convert(quantity, sourceUnit) >= max)
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)
@ -109,8 +110,8 @@ public abstract class DataStorageSpec
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",
quantity, sourceUnit.name().toLowerCase(),
max - 1, minUnit.name().toLowerCase()));
quantity, toLowerCaseLocalized(sourceUnit.name()),
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

View File

@ -62,7 +62,7 @@ import com.google.common.collect.Sets;
import com.google.common.primitives.Ints;
import com.google.common.primitives.Longs;
import com.google.common.util.concurrent.RateLimiter;
import org.apache.cassandra.utils.Pair;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
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.utils.FBUtilities;
import org.apache.cassandra.utils.MBeanWrapper;
import org.apache.cassandra.utils.Pair;
import org.apache.cassandra.utils.StorageCompatibilityMode;
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_MIB;
import static org.apache.cassandra.utils.Clock.Global.logInitializationOutcome;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class DatabaseDescriptor
{
@ -1785,7 +1787,7 @@ public class DatabaseDescriptor
if (cidrAuthorizerMode == null || cidrAuthorizerMode.isEmpty())
return defaultCidrAuthorizerMode;
return ICIDRAuthorizer.CIDRAuthorizerMode.valueOf(cidrAuthorizerMode.toUpperCase());
return ICIDRAuthorizer.CIDRAuthorizerMode.valueOf(toUpperCaseLocalized(cidrAuthorizerMode));
}
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.SECONDS;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* 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
@ -108,7 +110,7 @@ public abstract class DurationSpec
if (minUnit.convert(quantity, sourceUnit) >= max)
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)
@ -118,8 +120,8 @@ public abstract class DurationSpec
if (minUnit.convert(quantity, sourceUnit) >= max)
throw new IllegalArgumentException(String.format("Invalid duration: %d %s. It shouldn't be more than %d in %s",
quantity, sourceUnit.name().toLowerCase(),
max - 1, minUnit.name().toLowerCase()));
quantity, toLowerCaseLocalized(sourceUnit.name()),
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
@ -141,7 +143,7 @@ public abstract class DurationSpec
*/
static TimeUnit fromSymbol(String symbol)
{
switch (symbol.toLowerCase())
switch (toLowerCaseLocalized(symbol))
{
case "d": return DAYS;
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.utils.FBUtilities;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* 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
@ -78,7 +80,7 @@ public class EncryptionOptions
for (ClientAuth clientAuth : ClientAuth.values())
{
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)
{
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");
}
@ -183,7 +185,7 @@ public class EncryptionOptions
Set<String> valueSet = new HashSet<>();
ConfigKey[] values = values();
for(ConfigKey key: values) {
valueSet.add(key.getKeyName().toLowerCase());
valueSet.add(toLowerCaseLocalized(key.getKeyName()));
}
return valueSet;
}
@ -302,7 +304,7 @@ public class EncryptionOptions
Set<String> configKeys = ConfigKey.asSet();
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 " +
"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 static java.util.stream.Collectors.toList;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public interface CQL3Type
{
@ -139,7 +140,7 @@ public interface CQL3Type
@Override
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.util.List;
import java.util.Locale;
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Matcher;
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.memory.ByteBufferCloner;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* Represents an identifer for a CQL column definition.
* 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)
{
this.text = keepCase ? rawText : rawText.toLowerCase(Locale.US);
this.text = keepCase ? rawText : toLowerCaseLocalized(rawText);
this.bytes = ByteBufferUtil.bytes(this.text);
this.prefixComparison = prefixComparison(bytes);
this.interned = false;
@ -140,7 +141,7 @@ public class ColumnIdentifier implements IMeasurableMemory, Comparable<ColumnIde
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);
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.checkTrue;
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 io.netty.util.concurrent.FastThreadLocal;
@ -251,7 +252,7 @@ public final class Duration
private static Builder add(Builder builder, long number, String symbol)
{
switch (symbol.toLowerCase())
switch (toLowerCaseLocalized(symbol))
{
case "y": return builder.addYears(number);
case "mo": return builder.addMonths(number);

View File

@ -17,13 +17,14 @@
*/
package org.apache.cassandra.cql3;
import java.util.Locale;
import java.nio.ByteBuffer;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.exceptions.SyntaxException;
import org.apache.cassandra.serializers.MarshalException;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* Identifies a field in a UDT.
*/
@ -41,7 +42,7 @@ public class FieldIdentifier
*/
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.RoleOptions;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* Obfuscates passwords in a given string
*/
public class PasswordObfuscator
{
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
@ -42,7 +44,7 @@ public class PasswordObfuscator
if (null == sourceString)
return null;
int passwordTokenStartIndex = sourceString.toLowerCase().indexOf(PASSWORD_TOKEN);
int passwordTokenStartIndex = toLowerCaseLocalized(sourceString).indexOf(PASSWORD_TOKEN);
if (passwordTokenStartIndex < 0)
return sourceString;

View File

@ -17,9 +17,10 @@
*/
package org.apache.cassandra.cql3;
import java.util.Locale;
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)
*/
@ -123,6 +124,6 @@ public class QualifiedName
*/
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 static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public final class ReservedKeywords
{
private static final String FILE_NAME = "reserved_keywords.txt";
@ -58,6 +60,6 @@ public final class ReservedKeywords
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;
import java.util.Locale;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class RoleName
{
@ -25,7 +25,7 @@ public class RoleName
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()

View File

@ -18,7 +18,8 @@
package org.apache.cassandra.cql3;
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).
@ -43,7 +44,7 @@ public interface SchemaElement
@Override
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 static org.apache.cassandra.cql3.functions.TimeFcts.*;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import org.apache.commons.lang3.StringUtils;
@ -196,7 +197,7 @@ public final class CastFcts
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 org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class FunctionResolver
{
@ -46,7 +47,7 @@ public final class FunctionResolver
{
return new ColumnSpecification(receiverKeyspace,
receiverTable,
new ColumnIdentifier("arg" + i + '(' + fun.name().toString().toLowerCase() + ')', true),
new ColumnIdentifier("arg" + i + '(' + toLowerCaseLocalized(fun.name().toString()) + ')', true),
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.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,
* 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)
{
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 static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* Data types supported by cassandra.
*/
@ -122,7 +124,7 @@ public abstract class DataType
@Override
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 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
@ -237,7 +238,7 @@ public final class Duration
private static Builder add(Builder builder, long number, String symbol)
{
String s = symbol.toLowerCase();
String s = toLowerCaseLocalized(symbol);
if (s.equals("y"))
{
return builder.addYears(number);

View File

@ -19,6 +19,8 @@ package org.apache.cassandra.cql3.functions.types;
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.
*/
@ -65,7 +67,7 @@ public class Metadata
}
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

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.statements.RequestValidations.invalidRequest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public interface Selectable extends AssignmentTestable
{
@ -447,7 +448,7 @@ public interface Selectable extends AssignmentTestable
@Override
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)

View File

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

View File

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

View File

@ -17,9 +17,6 @@
*/
package org.apache.cassandra.db;
import java.util.Locale;
import com.carrotsearch.hppc.ObjectIntHashMap;
import org.apache.cassandra.locator.Endpoints;
import org.apache.cassandra.locator.InOurDc;
@ -31,6 +28,7 @@ import org.apache.cassandra.locator.NetworkTopologyStrategy;
import org.apache.cassandra.transport.ProtocolException;
import static org.apache.cassandra.locator.Replicas.addToCountPerDc;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum ConsistencyLevel
{
@ -85,7 +83,7 @@ public enum ConsistencyLevel
public static ConsistencyLevel fromString(String str)
{
return valueOf(str.toUpperCase(Locale.US));
return valueOf(toUpperCaseLocalized(str));
}
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.Pair;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* Encapsulate handling of paths to the data files.
*
@ -755,11 +757,11 @@ public class Directories
*/
public static boolean isStoredInLocalSystemKeyspacesDataLocation(String keyspace, String table)
{
String keyspaceName = keyspace.toLowerCase();
String keyspaceName = toLowerCaseLocalized(keyspace);
return SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES.contains(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

View File

@ -17,6 +17,8 @@
*/
package org.apache.cassandra.db.compaction;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public enum OperationType
{
/** 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)
{
this.type = type;
this.fileName = type.toLowerCase().replace(" ", "");
this.fileName = toLowerCaseLocalized(type).replace(" ", "");
this.writesData = writesData;
this.priority = priority;
}

View File

@ -25,18 +25,19 @@ import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import org.apache.cassandra.config.CassandraRelevantProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.CassandraRelevantProperties;
import org.apache.cassandra.db.ColumnFamilyStore;
import org.apache.cassandra.db.compaction.UnifiedCompactionStrategy;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.utils.Overlaps;
import org.apache.cassandra.utils.FBUtilities;
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
*/
@ -442,7 +443,7 @@ public class Controller
sstableGrowthModifier = FBUtilities.parsePercent(options.get(SSTABLE_GROWTH_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;
return new Controller(cfs,
@ -583,7 +584,7 @@ public class Controller
{
try
{
Overlaps.InclusionMethod.valueOf(s.toUpperCase());
Overlaps.InclusionMethod.valueOf(toUpperCaseLocalized(s));
}
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.utils.FBUtilities;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/**
* A decoded line in a transaction log file replica.
*
@ -63,7 +65,7 @@ final class LogRecord
public static Type fromPrefix(String prefix)
{
return valueOf(prefix.toUpperCase());
return valueOf(toUpperCaseLocalized(prefix));
}
public boolean hasFile()

View File

@ -25,7 +25,6 @@ import java.util.List;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.Locale;
import org.apache.cassandra.cql3.CQL3Type;
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.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).
*
@ -85,7 +86,7 @@ public abstract class CollectionType<T> extends MultiElementType<T>
@Override
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
{
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);
}

View File

@ -39,6 +39,7 @@ import org.apache.cassandra.utils.bytecomparable.ByteSource;
import org.apache.cassandra.utils.NoSpamLogger;
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.
@ -59,7 +60,7 @@ public class EmptyType extends AbstractType<Void>
return NonEmptyWriteBehavior.FAIL;
try
{
return NonEmptyWriteBehavior.valueOf(value.toUpperCase().trim());
return NonEmptyWriteBehavior.valueOf(toUpperCaseLocalized(value).trim());
}
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 org.apache.cassandra.config.CassandraRelevantProperties.TYPE_UDT_CONFLICT_BEHAVIOR;
import static org.apache.cassandra.cql3.ColumnIdentifier.maybeQuote;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* A user defined type.
@ -274,7 +275,7 @@ public class UserType extends TupleType implements SchemaElement
sb.append(", ");
String name = stringFieldNames.get(i);
if (!name.equals(name.toLowerCase(Locale.US)))
if (!name.equals(toLowerCaseLocalized(name)))
name = "\"" + name + "\"";
sb.append('"');

View File

@ -32,6 +32,8 @@ import org.apache.cassandra.metrics.ClientMetrics;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.transport.ConnectedClient;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
final class ClientsTable extends AbstractVirtualTable
{
private static final String ADDRESS = "address";
@ -88,7 +90,7 @@ final class ClientsTable extends AbstractVirtualTable
result.row(remoteAddress.getAddress(), remoteAddress.getPort())
.column(HOSTNAME, remoteAddress.getHostName())
.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(CLIENT_OPTIONS, client.clientOptions().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.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.
@ -255,7 +256,7 @@ public class CollectionVirtualTableAdapter<R> implements VirtualTable
Pattern pattern = Pattern.compile("^[A-Z1-9_]+$");
// Contains only uppercase letters, numbers and underscores, so it's already snake case.
if (pattern.matcher(camel).matches())
return camel.toLowerCase();
return toLowerCaseLocalized(camel);
// Some special cases must be handled manually.
String modifiedCamel = camel;

View File

@ -35,6 +35,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.schema.TableMetadata;
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.
@ -101,10 +102,10 @@ final class GossipInfoTable extends AbstractVirtualTable
.column(HEARTBEAT, getHeartBeat(localState));
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)
dataSet.column(state.name().toLowerCase() + "_version", getVersion(localState, state));
dataSet.column(toLowerCaseLocalized(state.name()) + "_version", getVersion(localState, state));
}
return result;
}
@ -178,10 +179,10 @@ final class GossipInfoTable extends AbstractVirtualTable
.addRegularColumn(HEARTBEAT, Int32Type.instance);
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)
builder.addRegularColumn(state.name().toLowerCase() + "_version", Int32Type.instance);
builder.addRegularColumn(toLowerCaseLocalized(state.name()) + "_version", Int32Type.instance);
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.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class LocalRepairTables
{
private LocalRepairTables()
@ -385,7 +387,7 @@ public class LocalRepairTables
private static String timestampColumnName(Enum<?> e)
{
return timestampColumnName(e.name().toLowerCase());
return timestampColumnName(toLowerCaseLocalized(e.name()));
}
private static String timestampColumnName(String e)
@ -431,7 +433,7 @@ public class LocalRepairTables
T currentState = state.getStatus();
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())
{
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.schema.TableMetadata;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
final class SSTableTasksTable extends AbstractVirtualTable
{
private final static String KEYSPACE_NAME = "keyspace_name";
@ -74,11 +76,11 @@ final class SSTableTasksTable extends AbstractVirtualTable
task.getTable().orElse("*"),
task.getTaskId())
.column(COMPLETION_RATIO, completionRatio)
.column(KIND, task.getTaskType().toString().toLowerCase())
.column(KIND, toLowerCaseLocalized(task.getTaskType().toString()))
.column(PROGRESS, completed)
.column(SSTABLES, task.getSSTables().size())
.column(TOTAL, total)
.column(UNIT, task.getUnit().toString().toLowerCase())
.column(UNIT, toLowerCaseLocalized(task.getUnit().toString()))
.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.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.cql3.statements.schema.CreateTableStatement.parse;
public class StreamingVirtualTable extends AbstractVirtualTable
@ -60,7 +62,7 @@ public class StreamingVirtualTable extends AbstractVirtualTable
{
StringBuilder sb = new StringBuilder();
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();
}
@ -91,13 +93,13 @@ public class StreamingVirtualTable extends AbstractVirtualTable
ds.column("follower", state.follower());
ds.column("operation", state.operation().getDescription());
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("duration_millis", state.durationMillis());
ds.column("failure_cause", state.failureCause());
ds.column("success_message", state.successMessage());
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);
}

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.TableMetadata.builder;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class VirtualSchemaKeyspace extends VirtualKeyspace
{
@ -136,9 +137,9 @@ public final class VirtualSchemaKeyspace extends VirtualKeyspace
for (ColumnMetadata column : table.columns())
{
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(KIND, column.kind.toString().toLowerCase())
.column(KIND, toLowerCaseLocalized(column.kind.toString()))
.column(POSITION, column.position())
.column(TYPE, column.type.asCQL3Type().toString());
}

View File

@ -23,6 +23,8 @@ import java.util.Locale;
import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilter;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class BasicFilters
{
private static final Locale DEFAULT_LOCALE = Locale.getDefault();
@ -39,7 +41,7 @@ public class BasicFilters
@Override
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 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.
@ -151,7 +152,7 @@ public class IndexWriterConfig
}
if (options.containsKey(SIMILARITY_FUNCTION))
{
String option = options.get(SIMILARITY_FUNCTION).toUpperCase();
String option = toUpperCaseLocalized(options.get(SIMILARITY_FUNCTION));
try
{
similarityFunction = VectorSimilarityFunction.valueOf(option);
@ -164,7 +165,7 @@ public class IndexWriterConfig
}
if (options.containsKey(OPTIMIZE_FOR))
{
String option = options.get(OPTIMIZE_FOR).toUpperCase();
String option = toUpperCaseLocalized(options.get(OPTIMIZE_FOR));
try
{
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 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
@ -47,6 +48,6 @@ public enum OptimizeFor
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 static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/**
* Basic/General Token Filters
*/
@ -42,7 +45,7 @@ public class BasicResultFilters
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
{
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.LoggerFactory;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class OnDiskIndexBuilder
{
private static final Logger logger = LoggerFactory.getLogger(OnDiskIndexBuilder.class);
@ -62,7 +64,7 @@ public class OnDiskIndexBuilder
public static Mode mode(String mode)
{
return Mode.valueOf(mode.toUpperCase());
return Mode.valueOf(toUpperCaseLocalized(mode));
}
public boolean supports(Op op)

View File

@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
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.createSinglePartitionedValueFiltered;
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
@ -810,7 +810,7 @@ public class CassandraMetricsRegistry extends MetricRegistry
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);
}
}
@ -861,7 +861,7 @@ public class CassandraMetricsRegistry extends MetricRegistry
{
super(metric, objectName, rateUnit);
this.metric = metric;
this.durationUnit = durationUnit.toString().toLowerCase(Locale.US);
this.durationUnit = toLowerCaseLocalized(durationUnit.toString());
}
@Override

View File

@ -24,6 +24,8 @@ import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.UserType;
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
{
@ -33,17 +35,17 @@ public final class CQLTypeParser
{
ImmutableSet.Builder<String> builder = ImmutableSet.builder();
for (CQL3Type.Native primitive : CQL3Type.Native.values())
builder.add(primitive.name().toLowerCase());
builder.add(toLowerCaseLocalized(primitive.name()));
PRIMITIVE_TYPES = builder.build();
}
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
if (PRIMITIVE_TYPES.contains(lowercased))
return CQL3Type.Native.valueOf(unparsed.toUpperCase()).getType();
return CQL3Type.Native.valueOf(toUpperCaseLocalized(unparsed)).getType();
// special-case top-level UDTs
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 static java.lang.String.format;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
// CQL: {'keys' : 'ALL'|'NONE', 'rows_per_partition': '200'|'NONE'|'ALL'}
public final class CachingParams
@ -40,7 +41,7 @@ public final class CachingParams
@Override
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 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
{
@ -58,7 +60,7 @@ public final class CompactionParams
@Override
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.parseBoolean(options.get(Option.ENABLED.toString()))
: DEFAULT_ENABLED;
String overlappingTombstoneParm = options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(),
DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()).toUpperCase();
String overlappingTombstoneParm = toUpperCaseLocalized(options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(),
DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()));
Optional<TombstoneOption> tombstoneOptional = TombstoneOption.forName(overlappingTombstoneParm);
if (!tombstoneOptional.isPresent())
{

View File

@ -49,6 +49,7 @@ import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.UUIDSerializer;
import static org.apache.cassandra.db.TypeSizes.sizeof;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* An immutable representation of secondary index metadata.
@ -72,7 +73,7 @@ public final class IndexMetadata
static
{
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());
}
@ -159,7 +160,7 @@ public final class IndexMetadata
if (isCustom())
{
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();
}

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.Version;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* An immutable class representing keyspace parameters (durability and replication).
*/
@ -57,7 +59,7 @@ public final class KeyspaceParams
@Override
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.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
*/
@ -93,7 +95,7 @@ public final class SchemaConstants
*/
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)
{
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)
{
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.collect.*;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
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.executeOnceInternal;
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;
/**
@ -694,9 +696,9 @@ public final class SchemaKeyspace
builder.update(Columns)
.row(table.name, column.name.toString())
.add("column_name_bytes", column.name.bytes)
.add("kind", column.kind.toString().toLowerCase())
.add("kind", toLowerCaseLocalized(column.kind.toString()))
.add("position", column.position())
.add("clustering_order", column.clusteringOrder().toString().toLowerCase())
.add("clustering_order", toLowerCaseLocalized(column.clusteringOrder().toString()))
.add("type", type.asCQL3Type().toString());
ColumnMask mask = column.getMask();
@ -758,7 +760,7 @@ public final class SchemaKeyspace
.row(table.name, column.column.name.toString())
.add("dropped_time", new Date(TimeUnit.MICROSECONDS.toMillis(column.droppedTime)))
.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)
@ -1075,10 +1077,10 @@ public final class SchemaKeyspace
String keyspace = row.getString("keyspace_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");
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);
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());
ColumnMetadata.Kind kind = row.has("kind")
? ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase())
? ColumnMetadata.Kind.valueOf(toUpperCaseLocalized(row.getString("kind")))
: ColumnMetadata.Kind.REGULAR;
assert kind == ColumnMetadata.Kind.REGULAR || kind == ColumnMetadata.Kind.STATIC
: "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 org.apache.cassandra.schema.TableParams.Option.*;
import static org.apache.cassandra.db.TypeSizes.sizeof;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class TableParams
{
@ -73,7 +74,7 @@ public final class TableParams
@Override
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.io.util.File;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* 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
if (isJceks)
keyAlias = keyAlias.toLowerCase();
keyAlias = toLowerCaseLocalized(keyAlias);
Key key;
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.EncryptionOptions.ClientAuth.REQUIRED;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* A Factory for providing and setting up client {@link SSLSocket}s. Also provides
@ -337,7 +338,7 @@ public final class SSLFactory
if (settingDescription != null)
{
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.Collection;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
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.utils.ByteBufferUtil;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public abstract class CollectionSerializer<T> extends TypeSerializer<T>
{
protected abstract List<ByteBuffer> serializeValues(T value);
@ -110,7 +111,7 @@ public abstract class CollectionSerializer<T> extends TypeSerializer<T>
*/
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_VM_NAME;
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.
@ -217,7 +218,7 @@ public class StartupChecks
{
try
{
if (affectedFileSystemTypes.contains(Files.getFileStore(path).type().toLowerCase()))
if (affectedFileSystemTypes.contains(toLowerCaseLocalized(Files.getFileStore(path).type())))
affectedPaths.add(path);
}
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.utils.Clock.Global.currentTimeMillis;
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.concurrent.CountDownLatch.newCountDownLatch;
import static org.apache.commons.lang3.StringUtils.join;
@ -2835,7 +2836,7 @@ public class StorageProxy implements StorageProxyMBean
public String setIdealConsistencyLevel(String cl)
{
ConsistencyLevel original = DatabaseDescriptor.getIdealConsistencyLevel();
ConsistencyLevel newCL = ConsistencyLevel.valueOf(cl.trim().toUpperCase());
ConsistencyLevel newCL = ConsistencyLevel.valueOf(toUpperCaseLocalized(cl.trim()));
DatabaseDescriptor.setIdealConsistencyLevel(newCL);
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.utils.Clock.Global.nanoTime;
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.
@ -369,7 +370,7 @@ public class ContentionStrategy
Type(String 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.schema.TableParams;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy
{
private static final Pattern PATTERN =
@ -128,7 +130,7 @@ public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy
SpeculativeRetryPolicy policy1 = value1 instanceof PercentileSpeculativeRetryPolicy ? 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);
}

View File

@ -23,6 +23,8 @@ import org.apache.cassandra.locator.Endpoints;
import org.apache.cassandra.locator.ReplicaPlan;
import org.apache.cassandra.transport.Dispatcher;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public enum ReadRepairStrategy implements ReadRepair.Factory
{
NONE
@ -45,6 +47,6 @@ public enum ReadRepairStrategy implements ReadRepair.Factory
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.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* 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)
{
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));
SessionInfo sessionInfo = session.getSessionInfo();
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.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
public class StreamingState implements StreamEventHandler, IMeasurableMemory
@ -214,14 +215,14 @@ public class StreamingState implements StreamEventHandler, IMeasurableMemory
{
TableBuilder table = new TableBuilder();
table.add("id", id.toString());
table.add("status", status().name().toLowerCase());
table.add("status", toLowerCaseLocalized(status().name()));
table.add("progress", (progress() * 100) + "%");
table.add("duration_ms", Long.toString(durationMillis()));
table.add("last_updated_ms", Long.toString(lastUpdatedAtMillis()));
table.add("failure_cause", failureCause());
table.add("success_message", successMessage());
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();
}

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.ExtensionValue;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
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 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.Map;
import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
import org.apache.cassandra.service.StorageServiceMBean;
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 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.valueOf;
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.progress.ProgressEventType.*;
@ -165,7 +166,7 @@ public class RepairRunner extends JMXNotificationProgressListener
case FAILED:
printMessage(String.format("%s %s discovered repair %s.",
triggeringCondition,
queriedString, parentRepairStatus.name().toLowerCase()));
queriedString, toLowerCaseLocalized(parentRepairStatus.name())));
if (parentRepairStatus == FAILED)
{
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.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class StandaloneScrubber
{
@ -241,12 +243,12 @@ public class StandaloneScrubber
static HeaderFixMode fromCommandLine(String value)
{
return valueOf(value.replace('-', '_').toUpperCase().trim());
return valueOf(toUpperCaseLocalized(value.replace('-', '_')).trim());
}
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.checkState;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
import static org.apache.commons.lang3.StringUtils.join;
@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());
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())));
targets.add(sampler);
}

View File

@ -47,6 +47,7 @@ import org.apache.cassandra.utils.UUIDGen;
import org.apache.cassandra.utils.memory.MemoryUtil;
import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_NETTY_USE_HEAP_ALLOCATOR;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/**
* ByteBuf utility methods.
@ -285,7 +286,7 @@ public abstract class CBUtil
String value = CBUtil.readString(cb);
try
{
return Enum.valueOf(enumType, value.toUpperCase());
return Enum.valueOf(enumType, toUpperCaseLocalized(value));
}
catch (IllegalArgumentException e)
{
@ -399,7 +400,7 @@ public abstract class CBUtil
Map<String, List<String>> m = new HashMap<String, List<String>>(length);
for (int i = 0; i < length; i++)
{
String k = readString(cb).toUpperCase();
String k = toUpperCaseLocalized(readString(cb));
List<String> v = readStringList(cb);
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.MD5Digest;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class Client extends SimpleClient
{
private final SimpleEventHandler eventHandler = new SimpleEventHandler();
@ -100,7 +103,7 @@ public class Client extends SimpleClient
Iterator<String> iter = splitter.split(line).iterator();
if (!iter.hasNext())
return null;
String msgType = iter.next().toUpperCase();
String msgType = toUpperCaseLocalized(iter.next());
if (msgType.equals("STARTUP"))
{
Map<String, String> options = new HashMap<String, String>();
@ -108,17 +111,17 @@ public class Client extends SimpleClient
while (iter.hasNext())
{
String next = iter.next();
if (next.toLowerCase().equals("snappy"))
if (toLowerCaseLocalized(next).equals("snappy"))
{
options.put(StartupMessage.COMPRESSION, "snappy");
connection.setCompressor(Compressor.SnappyCompressor.instance);
}
if (next.toLowerCase().equals("lz4"))
if (toLowerCaseLocalized(next).equals("lz4"))
{
options.put(StartupMessage.COMPRESSION, "lz4");
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");
connection.setThrowOnOverload(true);
@ -198,7 +201,7 @@ public class Client extends SimpleClient
}
else if (msgType.equals("REGISTER"))
{
String type = line.substring(9).toUpperCase();
String type = toUpperCaseLocalized(line.substring(9));
try
{
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.utils.CassandraVersion;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
/**
* The initial message of the protocol.
* Sets up a number of connection options.
@ -89,7 +92,7 @@ public class StartupMessage extends Message.Request
if (options.containsKey(COMPRESSION))
{
String compression = options.get(COMPRESSION).toLowerCase();
String compression = toLowerCaseLocalized(options.get(COMPRESSION));
if (compression.equals("snappy"))
{
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());
for (Map.Entry<String, String> entry : options.entrySet())
newMap.put(entry.getKey().toUpperCase(), entry.getValue());
newMap.put(toUpperCaseLocalized(entry.getKey()), entry.getValue());
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.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.Clock.Global.nanoTime;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class FBUtilities
{
@ -118,7 +119,7 @@ public class FBUtilities
public static final BigInteger TWO = new BigInteger("2");
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");
private static volatile InetAddress localInetAddress;
@ -1364,7 +1365,7 @@ public class FBUtilities
public static String camelToSnake(String camel)
{
if (camel.chars().allMatch(Character::isUpperCase))
return camel.toLowerCase();
return toLowerCaseLocalized(camel);
StringBuilder sb = new StringBuilder();
for (char c : camel.toCharArray())
@ -1374,7 +1375,7 @@ public class FBUtilities
// if first char is uppercase, then avoid adding the _ prefix
if (sb.length() > 0)
sb.append('_');
sb.append(Character.toLowerCase(c));
sb.append(Character.toLowerCase(c)); // checkstyle: permit this invocation
}
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.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class GuidGenerator
{
@ -101,7 +102,7 @@ public class GuidGenerator
private static String convertToStandardFormat(String valueAfterMD5)
{
String raw = valueAfterMD5.toUpperCase();
String raw = toUpperCaseLocalized(valueAfterMD5);
StringBuilder sb = new StringBuilder();
sb.append(raw.substring(0, 8))
.append("-")

View File

@ -23,7 +23,6 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.fasterxml.jackson.core.JsonFactory;
@ -38,6 +37,7 @@ import org.apache.cassandra.io.util.FileOutputStreamPlus;
import org.apache.cassandra.serializers.MarshalException;
import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public final class JsonUtils
{
@ -203,7 +203,7 @@ public final class JsonUtils
}
// otherwise, lowercase it if needed
String lowered = mapKey.toLowerCase(Locale.US);
String lowered = toLowerCaseLocalized(mapKey);
if (!mapKey.equals(lowered))
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.OS_ARCH;
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.MAC;
import static org.apache.cassandra.utils.NativeLibrary.OSType.AIX;
@ -102,7 +103,7 @@ public final class NativeLibrary
default: wrappedLibrary = new NativeLibraryLinux();
}
if (OS_ARCH.getString().toLowerCase().contains("ppc"))
if (toLowerCaseLocalized(OS_ARCH.getString()).contains("ppc"))
{
if (osType == LINUX)
{
@ -134,7 +135,7 @@ public final class NativeLibrary
*/
private static OSType getOsType()
{
String osName = OS_NAME.getString().toLowerCase();
String osName = toLowerCaseLocalized(OS_NAME.getString());
if (osName.contains("linux"))
return LINUX;
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.schema.TableMetadata;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
public class NativeSSTableLoaderClient extends SSTableLoader.Client
{
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)
{
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);
if (order == ClusteringOrder.DESC)
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"));
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);
}
@ -219,7 +221,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client
{
String name = row.getString("column_name");
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);
long droppedTime = row.getTimestamp("dropped_time").getTime();
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 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
@ -389,7 +390,7 @@ public class BinLog implements Runnable
public Builder rollCycle(String rollCycle)
{
Preconditions.checkNotNull(rollCycle, "rollCycle was null");
rollCycle = rollCycle.toUpperCase();
rollCycle = toUpperCaseLocalized(rollCycle);
Preconditions.checkNotNull(RollCycles.valueOf(rollCycle), "unrecognized roll cycle");
this.rollCycle = rollCycle;
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.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
* of IInvokableInstance on each node.
@ -81,7 +83,7 @@ public class Cluster extends AbstractCluster<IInvokableInstance>
{
get(1).acceptsOnInstance((IIsolatedExecutor.SerializableConsumer<IMessage>) (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));
}).accept(msg);
}

View File

@ -76,6 +76,8 @@ import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
import org.apache.cassandra.service.StorageService;
import org.awaitility.Awaitility;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
@RunWith(Parameterized.class)
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)
{
return type.name().toLowerCase() + "_" + parallelism.name().toLowerCase() + "_" + withTracing;
return toLowerCaseLocalized(type.name()) + "_" + toLowerCaseLocalized(parallelism.name()) + "_" + withTracing;
}
@BeforeClass

View File

@ -33,6 +33,8 @@ import org.apache.cassandra.exceptions.SyntaxException;
import org.apache.cassandra.utils.Throwables;
import org.apache.cassandra.utils.TimeUUID;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class ReadDigestConsistencyTest extends TestBaseImpl
{
private final static Logger logger = LoggerFactory.getLogger(ReadDigestConsistencyTest.class);
@ -101,7 +103,7 @@ public class ReadDigestConsistencyTest extends TestBaseImpl
Arrays.toString(boundValues),
coordinator.instance().broadcastAddress(),
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 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
{
@ -98,7 +99,7 @@ public class RepairCoordinatorBase extends TestBaseImpl
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) {

View File

@ -42,6 +42,7 @@ import org.apache.cassandra.net.Verb;
import static java.lang.String.format;
import static org.apache.cassandra.distributed.api.IMessageFilters.Matcher.of;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
@RunWith(Parameterized.class)
@Ignore("Until CASSANDRA-15566 is in these tests all time out")
@ -100,7 +101,7 @@ public class RepairCoordinatorFailingMessageTest extends TestBaseImpl implements
private String postfix()
{
return repairType.name().toLowerCase();
return toLowerCaseLocalized(repairType.name());
}
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.distributed.shared.FutureUtils.waitOn;
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;
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
for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses)
{
String tableName = "tbl_" + compactionStrategyClass.getSimpleName().toLowerCase();
String tableName = "tbl_" + toLowerCaseLocalized(compactionStrategyClass.getSimpleName());
cluster.schemaChange(createTableStmt(KEYSPACE, tableName, compactionStrategyClass));
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
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);

View File

@ -78,6 +78,8 @@ import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.concurrent.Refs;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class CompactionAllocationTest
{
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
{
String ksname = "ks_" + name.toLowerCase();
String ksname = "ks_" + toLowerCaseLocalized(name);
SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
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
{
String ksname = "ks_" + name.toLowerCase();
String ksname = "ks_" + toLowerCaseLocalized(name);
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());
@ -702,7 +704,7 @@ public class CompactionAllocationTest
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),
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,
IndexDef...indexes) throws Throwable
{
String ksname = "ks_" + name.toLowerCase();
String ksname = "ks_" + toLowerCaseLocalized(name);
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());

View File

@ -897,7 +897,7 @@ public abstract class Action implements PriorityQueueNode
continue;
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;

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.utils.IntRange.parseRange;
import static org.apache.cassandra.simulator.utils.LongRange.parseNanosRange;
import static org.apache.cassandra.utils.LocalizeString.toUpperCaseLocalized;
@SuppressWarnings({ "ZeroLengthArrayAllocation", "CodeBlock2Expr", "SameParameterValue", "DynamicRegexReplaceableByCompiledPattern", "CallToSystemGC" })
public class SimulationRunner
@ -281,7 +282,7 @@ public class SimulationRunner
Optional.ofNullable(topologyChanges).ifPresent(topologyChanges -> {
builder.topologyChanges(stream(topologyChanges.split(","))
.filter(v -> !v.isEmpty())
.map(v -> TopologyChange.valueOf(v.toUpperCase()))
.map(v -> TopologyChange.valueOf(toUpperCaseLocalized(v)))
.toArray(TopologyChange[]::new));
});
parseNanosRange(Optional.ofNullable(topologyChangeInterval)).ifPresent(builder::topologyChangeIntervalNanos);
@ -289,7 +290,7 @@ public class SimulationRunner
Optional.ofNullable(priority).ifPresent(kinds -> {
builder.scheduler(stream(kinds.split(","))
.filter(v -> !v.isEmpty())
.map(v -> RunnableActionScheduler.Kind.valueOf(v.toUpperCase()))
.map(v -> RunnableActionScheduler.Kind.valueOf(toUpperCaseLocalized(v)))
.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_ALGO;
import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class SchemaLoader
{
@ -745,7 +746,7 @@ public static TableMetadata.Builder clusteringSASICFMD(String ksName, String cfN
private static CompressionParams compressionParams(int chunkLength)
{
String algo = TEST_COMPRESSION_ALGO.getString().toLowerCase();
String algo = toLowerCaseLocalized(TEST_COMPRESSION_ALGO.getString());
switch (algo)
{
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.getRolesReadCount;
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.assertTrue;
@ -100,7 +101,7 @@ public class CassandraNetworkAuthorizerTest extends CQLTester
private static String createName()
{
return RandomStringUtils.randomAlphabetic(8).toLowerCase();
return toLowerCaseLocalized(RandomStringUtils.randomAlphabetic(8));
}
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.KIBIBYTES;
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.junit.Assert.*;
import static org.quicktheories.QuickTheory.qt;
@ -242,7 +243,7 @@ public class DataStorageSpecTest
{
qt().forAll(gen()).check(there -> {
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);
});
}

View File

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

View File

@ -39,7 +39,6 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
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.metrics.CassandraMetricsRegistry.createMetricsKeyspaceTables;
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.assertNotNull;
import static org.junit.Assert.assertTrue;
@ -1046,7 +1046,7 @@ public abstract class CQLTester
private String createSchemaElementName(SchemaElement.SchemaElementType type, String 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 usedSpaceSoFar = prefix.length() + typeName.length() + Math.max(2, numberOfDigits(sequence)) + 1;
String testMethodName = StringUtils.truncate(getTestMethodName(), SchemaConstants.NAME_LENGTH - usedSpaceSoFar);
@ -1329,7 +1329,7 @@ public abstract class CQLTester
index = ParseUtils.isQuoted(index, '\"')
? ParseUtils.unDoubleQuote(index)
: index.toLowerCase();
: toLowerCaseLocalized(index);
return Pair.create(keyspace, index);
}
@ -2738,7 +2738,7 @@ public abstract class CQLTester
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 static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
/**
* 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
@ -105,7 +107,7 @@ public abstract class KeywordTestBase extends CQLTester
logger.info(selectStatement);
rs = execute(selectStatement);
row = rs.one();
String value = row.getString(keyword.toLowerCase());
String value = row.getString(toLowerCaseLocalized(keyword));
Assert.assertEquals(keyword, value);
/* 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.assertj.core.api.Assertions;
import static org.apache.cassandra.utils.LocalizeString.toLowerCaseLocalized;
public class NativeFunctionsTest
{
/**
@ -154,7 +156,7 @@ public class NativeFunctionsTest
Assertions.assertThat(function.argTypes()).isEqualTo(newFunction.argTypes());
Assertions.assertThat(function.returnType()).isEqualTo(newFunction.returnType());
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, '_'));
}
}
@ -190,7 +192,7 @@ public class NativeFunctionsTest
Assertions.assertThat(factory.name).isNotEqualTo(newFactory.name);
Assertions.assertThat(factory.parameters).isEqualTo(newFactory.parameters);
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, '_'));
}
}
@ -198,7 +200,7 @@ public class NativeFunctionsTest
private static boolean satisfiesConventions(FunctionName functionName)
{
String name = functionName.name;
return name.equals(name.toLowerCase()) &&
return name.equals(toLowerCaseLocalized(name)) &&
!LEGACY_FUNCTION_NAMES.containsKey(name);
}
}

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