Skip to content

Commit

Permalink
Issue #12101: move global locale to localized message
Browse files Browse the repository at this point in the history
  • Loading branch information
rnveach authored and nrmancuso committed Oct 10, 2022
1 parent 0e10310 commit 65655da
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 122 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1279,7 +1279,7 @@
<fileName>checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/LocalizedMessage.java</fileName>
<specifier>argument</specifier>
<message>incompatible argument for parameter loader of getBundle.</message>
<lineContent>return ResourceBundle.getBundle(bundle, locale, sourceClass.getClassLoader(),</lineContent>
<lineContent>return ResourceBundle.getBundle(bundle, sLocale, sourceClass.getClassLoader(),</lineContent>
<details>
found : @Initialized @Nullable ClassLoader
required: @Initialized @NonNull ClassLoader
Expand Down Expand Up @@ -1323,17 +1323,6 @@
</details>
</checkerFrameworkError>

<checkerFrameworkError unstable="false">
<fileName>checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/api/Violation.java</fileName>
<specifier>return</specifier>
<message>incompatible types in return.</message>
<lineContent>return violation;</lineContent>
<details>
type of expression: @Initialized @Nullable String
method return type: @Initialized @NonNull String
</details>
</checkerFrameworkError>

<checkerFrameworkError unstable="false">
<fileName>checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/checks/AvoidEscapedUnicodeCharactersCheck.java</fileName>
<specifier>initialization.field.uninitialized</specifier>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<fileName>checkstyle/src/main/java/com/puppycrawl/tools/checkstyle/LocalizedMessage.java</fileName>
<specifier>argument</specifier>
<message>incompatible argument for parameter baseName of getBundle.</message>
<lineContent>return ResourceBundle.getBundle(bundle, locale, sourceClass.getClassLoader(),</lineContent>
<lineContent>return ResourceBundle.getBundle(bundle, sLocale, sourceClass.getClassLoader(),</lineContent>
<details>
found : @SignatureUnknown String
required: @BinaryName String
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/puppycrawl/tools/checkstyle/Checker.java
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ public void fireFileFinished(String fileName) {
@Override
protected void finishLocalSetup() throws CheckstyleException {
final Locale locale = new Locale(localeLanguage, localeCountry);
Violation.setLocale(locale);
LocalizedMessage.setLocale(locale);

if (moduleFactory == null) {
if (moduleClassLoader == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import java.io.PrintWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Locale;

import com.puppycrawl.tools.checkstyle.api.AuditEvent;
import com.puppycrawl.tools.checkstyle.api.AuditListener;
Expand Down Expand Up @@ -161,7 +160,7 @@ public void addError(AuditEvent event) {
public void addException(AuditEvent event, Throwable throwable) {
synchronized (errorWriter) {
final LocalizedMessage exceptionMessage = new LocalizedMessage(
Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(), DefaultLogger.class,
Definitions.CHECKSTYLE_BUNDLE, DefaultLogger.class,
ADD_EXCEPTION_MESSAGE, event.getFileName());
errorWriter.println(exceptionMessage.getMessage());
throwable.printStackTrace(errorWriter);
Expand All @@ -171,7 +170,7 @@ public void addException(AuditEvent event, Throwable throwable) {
@Override
public void auditStarted(AuditEvent event) {
final LocalizedMessage auditStartMessage = new LocalizedMessage(
Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(), DefaultLogger.class,
Definitions.CHECKSTYLE_BUNDLE, DefaultLogger.class,
AUDIT_STARTED_MESSAGE);
infoWriter.println(auditStartMessage.getMessage());
infoWriter.flush();
Expand All @@ -180,7 +179,7 @@ public void auditStarted(AuditEvent event) {
@Override
public void auditFinished(AuditEvent event) {
final LocalizedMessage auditFinishMessage = new LocalizedMessage(
Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(), DefaultLogger.class,
Definitions.CHECKSTYLE_BUNDLE, DefaultLogger.class,
AUDIT_FINISHED_MESSAGE);
infoWriter.println(auditFinishMessage.getMessage());
closeStreams();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,12 @@
*/
public class LocalizedMessage {

/** The locale to localise messages to. **/
private static Locale sLocale = Locale.getDefault();

/** Name of the resource bundle to get messages from. **/
private final String bundle;

/**
* The locale to localise messages to.
**/
private final Locale locale;

/** Class of the source for this message. */
private final Class<?> sourceClass;

Expand All @@ -65,15 +63,13 @@ public class LocalizedMessage {
* Creates a new {@code LocalizedMessage} instance.
*
* @param bundle resource bundle name
* @param locale The locale to localise messages to.
* @param sourceClass the Class that is the source of the message
* @param key the key to locate the translation.
* @param args arguments for the translation.
*/
public LocalizedMessage(String bundle, Locale locale, Class<?> sourceClass, String key,
public LocalizedMessage(String bundle, Class<?> sourceClass, String key,
Object... args) {
this.bundle = bundle;
this.locale = locale;
this.sourceClass = sourceClass;
this.key = key;
if (args == null) {
Expand All @@ -84,6 +80,20 @@ public LocalizedMessage(String bundle, Locale locale, Class<?> sourceClass, Stri
}
}

/**
* Sets a locale to use for localization.
*
* @param locale the locale to use for localization
*/
public static void setLocale(Locale locale) {
if (Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
sLocale = Locale.ROOT;
}
else {
sLocale = locale;
}
}

/**
* Gets the translated message.
*
Expand Down Expand Up @@ -119,7 +129,7 @@ public String getMessage() {
* @return a ResourceBundle.
*/
private ResourceBundle getBundle() {
return ResourceBundle.getBundle(bundle, locale, sourceClass.getClassLoader(),
return ResourceBundle.getBundle(bundle, sLocale, sourceClass.getClassLoader(),
new Utf8Control());
}

Expand Down
19 changes: 1 addition & 18 deletions src/main/java/com/puppycrawl/tools/checkstyle/api/Violation.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ public final class Violation
/** The default severity level if one is not specified. */
private static final SeverityLevel DEFAULT_SEVERITY = SeverityLevel.ERROR;

/** The locale to localise violations to. **/
private static Locale sLocale = Locale.getDefault();

/** The line number. **/
private final int lineNo;
/** The column number. **/
Expand Down Expand Up @@ -358,20 +355,6 @@ public String getSourceName() {
return sourceClass.getName();
}

/**
* Sets a locale to use for localization.
*
* @param locale the locale to use for localization
*/
public static void setLocale(Locale locale) {
if (Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
sLocale = Locale.ROOT;
}
else {
sLocale = locale;
}
}

/**
* Indicates whether some other object is "equal to" this one.
* Suppression on enumeration is needed so code stays consistent.
Expand Down Expand Up @@ -451,7 +434,7 @@ public String getViolation() {
String violation = getCustomViolation();

if (violation == null) {
violation = new LocalizedMessage(bundle, sLocale, sourceClass, key, args).getMessage();
violation = new LocalizedMessage(bundle, sourceClass, key, args).getMessage();
}
return violation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ public void testFinishLocalSetupFullyInitialized() throws Exception {
.that(context.get("basedir"))
.isEqualTo("testBaseDir");

final Field sLocale = Violation.class.getDeclaredField("sLocale");
final Field sLocale = LocalizedMessage.class.getDeclaredField("sLocale");
sLocale.setAccessible(true);
final Locale locale = (Locale) sLocale.get(null);
assertWithMessage("Locale is set to unexpected value")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,17 +307,17 @@ public void testStreamsNotClosedByLogger() throws IOException {
}

private static LocalizedMessage getAuditStartMessageClass() {
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(),
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE,
DefaultLogger.class, "DefaultLogger.auditStarted");
}

private static LocalizedMessage getAuditFinishMessageClass() {
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(),
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE,
DefaultLogger.class, "DefaultLogger.auditFinished");
}

private static LocalizedMessage getAddExceptionMessageClass(Object... arguments) {
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE, Locale.getDefault(),
return new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE,
DefaultLogger.class, "DefaultLogger.addException", arguments);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package com.puppycrawl.tools.checkstyle;

import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.jupiter.api.Assumptions.assumeFalse;

import java.io.IOException;
import java.io.InputStream;
Expand All @@ -30,7 +31,9 @@
import java.util.ResourceBundle;
import java.util.concurrent.atomic.AtomicBoolean;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junitpioneer.jupiter.DefaultLocale;

import com.puppycrawl.tools.checkstyle.LocalizedMessage.Utf8Control;

Expand All @@ -45,16 +48,18 @@
*/
public class LocalizedMessageTest {

private static final Locale DEFAULT_LOCALE = Locale.getDefault();

@Test
public void testNullArgs() {
final LocalizedMessage messageClass = new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE,
Locale.getDefault(), DefaultLogger.class, "DefaultLogger.addException", "myfile");
DefaultLogger.class, "DefaultLogger.addException", "myfile");
assertWithMessage("Violation should contain exception info")
.that(messageClass.getMessage())
.contains("Error auditing myfile");

final LocalizedMessage nullClass = new LocalizedMessage(Definitions.CHECKSTYLE_BUNDLE,
Locale.getDefault(), DefaultLogger.class, "DefaultLogger.addException");
DefaultLogger.class, "DefaultLogger.addException");
final String outputForNullArgs = nullClass.getMessage();
assertWithMessage("Violation should contain exception info")
.that(outputForNullArgs)
Expand Down Expand Up @@ -206,6 +211,74 @@ protected URLConnection openConnection(URL ignore) {
.isNull();
}

/**
* Verifies that the language specified with the system property {@code user.language} exists.
*/
@Test
public void testLanguageIsValid() {
final String language = DEFAULT_LOCALE.getLanguage();
assumeFalse(language.isEmpty(), "Locale not set");
assertWithMessage("Invalid language")
.that(Locale.getISOLanguages())
.asList()
.contains(language);
}

/**
* Verifies that the country specified with the system property {@code user.country} exists.
*/
@Test
public void testCountryIsValid() {
final String country = DEFAULT_LOCALE.getCountry();
assumeFalse(country.isEmpty(), "Locale not set");
assertWithMessage("Invalid country")
.that(Locale.getISOCountries())
.asList()
.contains(country);
}

@Test
public void testMessageInFrench() {
final LocalizedMessage violation = createSampleViolation();
LocalizedMessage.setLocale(Locale.FRENCH);

assertWithMessage("Invalid violation")
.that(violation.getMessage())
.isEqualTo("Instruction vide.");
}

@DefaultLocale("fr")
@Test
public void testEnforceEnglishLanguageBySettingUnitedStatesLocale() {
LocalizedMessage.setLocale(Locale.US);
final LocalizedMessage violation = createSampleViolation();

assertWithMessage("Invalid violation")
.that(violation.getMessage())
.isEqualTo("Empty statement.");
}

@DefaultLocale("fr")
@Test
public void testEnforceEnglishLanguageBySettingRootLocale() {
LocalizedMessage.setLocale(Locale.ROOT);
final LocalizedMessage violation = createSampleViolation();

assertWithMessage("Invalid violation")
.that(violation.getMessage())
.isEqualTo("Empty statement.");
}

private static LocalizedMessage createSampleViolation() {
return new LocalizedMessage("com.puppycrawl.tools.checkstyle.checks.coding.messages",
LocalizedMessage.class, "empty.statement");
}

@AfterEach
public void tearDown() {
LocalizedMessage.setLocale(DEFAULT_LOCALE);
}

/**
* Mocked ClassLoader for testing URL loading.
*
Expand Down

0 comments on commit 65655da

Please sign in to comment.