http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/DiffTestCase.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/DiffTestCase.java b/core/src/test/java/org/apache/calcite/test/DiffTestCase.java index 7e3adee..c8a9a89 100644 --- a/core/src/test/java/org/apache/calcite/test/DiffTestCase.java +++ b/core/src/test/java/org/apache/calcite/test/DiffTestCase.java @@ -17,6 +17,7 @@ package org.apache.calcite.test; import org.apache.calcite.util.ReflectUtil; +import org.apache.calcite.util.Util; import org.incava.util.diff.Diff; import org.incava.util.diff.Difference; @@ -24,15 +25,18 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -71,8 +75,6 @@ public abstract class DiffTestCase { private String ignorePatterns; Matcher compiledIgnoreMatcher; - int gcInterval; - /** * Whether to give verbose message if diff fails. */ @@ -92,7 +94,6 @@ public abstract class DiffTestCase { ignorePatterns = ""; compiledIgnoreMatcher = null; compiledDiffMatcher = null; - gcInterval = 0; String verboseVal = System.getProperty(DiffTestCase.class.getName() + ".verbose"); if (verboseVal != null) { @@ -109,7 +110,6 @@ public abstract class DiffTestCase { ignorePatterns = ""; compiledIgnoreMatcher = null; compiledDiffMatcher = null; - gcInterval = 0; } @After @@ -142,7 +142,8 @@ public abstract class DiffTestCase { new File( testClassDir, testCaseName); - return new OutputStreamWriter(openTestLogOutputStream(testLogFile)); + return new OutputStreamWriter( + openTestLogOutputStream(testLogFile), StandardCharsets.UTF_8); } /** @@ -206,19 +207,9 @@ public abstract class DiffTestCase { */ protected void diffFile(File logFile, File refFile) throws IOException { int n = 0; - FileReader logReader = null; - FileReader refReader = null; + BufferedReader logReader = null; + BufferedReader refReader = null; try { - if (compiledIgnoreMatcher != null) { - if (gcInterval != 0) { - n++; - if (n == gcInterval) { - n = 0; - System.gc(); - } - } - } - // NOTE: Use of diff.mask is deprecated, use diff_mask. String diffMask = System.getProperty("diff.mask", null); if (diffMask != null) { @@ -230,8 +221,8 @@ public abstract class DiffTestCase { addDiffMask(diffMask); } - logReader = new FileReader(logFile); - refReader = new FileReader(refFile); + logReader = Util.reader(logFile); + refReader = Util.reader(refFile); LineNumberReader logLineReader = new LineNumberReader(logReader); LineNumberReader refLineReader = new LineNumberReader(refReader); for (;;) { @@ -280,16 +271,6 @@ public abstract class DiffTestCase { } /** - * set the number of lines for garbage collection. - * - * @param n an integer, the number of line for garbage collection, 0 means - * no garbage collection. - */ - protected void setGC(int n) { - gcInterval = n; - } - - /** * Adds a diff mask. Strings matching the given regular expression will be * masked before diffing. This can be used to suppress spurious diffs on a * case-by-case basis. @@ -471,9 +452,8 @@ public abstract class DiffTestCase { * @return List of lines */ private static List<String> fileLines(File file) { - List<String> lines = new ArrayList<String>(); - try { - LineNumberReader r = new LineNumberReader(new FileReader(file)); + List<String> lines = new ArrayList<>(); + try (LineNumberReader r = new LineNumberReader(Util.reader(file))) { String line; while ((line = r.readLine()) != null) { lines.add(line); @@ -492,15 +472,14 @@ public abstract class DiffTestCase { * @return Contents of the file */ protected static String fileContents(File file) { - try { - char[] buf = new char[2048]; - final FileReader reader = new FileReader(file); + byte[] buf = new byte[2048]; + try (final FileInputStream reader = new FileInputStream(file)) { int readCount; - final StringWriter writer = new StringWriter(); + final ByteArrayOutputStream writer = new ByteArrayOutputStream(); while ((readCount = reader.read(buf)) >= 0) { writer.write(buf, 0, readCount); } - return writer.toString(); + return writer.toString(StandardCharsets.UTF_8.name()); } catch (IOException e) { throw new RuntimeException(e); }
http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/JdbcTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java index 5196732..2fcbb0a 100644 --- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java +++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java @@ -108,7 +108,6 @@ import org.junit.Ignore; import org.junit.Test; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.Reader; @@ -132,6 +131,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; @@ -5233,8 +5233,7 @@ public class JdbcTest { private void checkCustomSchemaInFileInPwd(String fileName) throws SQLException { final File file = new File(fileName); - try (final FileWriter fw = new FileWriter(file); - final PrintWriter pw = new PrintWriter(fw)) { + try (final PrintWriter pw = Util.printWriter(file)) { file.deleteOnExit(); pw.println("{\n" + " version: '1.0',\n" @@ -5673,6 +5672,8 @@ public class JdbcTest { @Test public void testGetTimestamp() throws Exception { CalciteAssert.that() .with("timezone", "GMT+1:00") + // Workaround, until [CALCITE-1667] is fixed in Avatica + .with("TIME_ZONE", "GMT+1:00") .doWithConnection( new Function<CalciteConnection, Void>() { public Void apply(CalciteConnection connection) { @@ -5707,10 +5708,10 @@ public class JdbcTest { TimeZone tzGmt05 = TimeZone.getTimeZone("GMT-05"); // -0500 always TimeZone tzGmt13 = TimeZone.getTimeZone("GMT+13"); // +1000 always - Calendar cUtc = Calendar.getInstance(tzUtc); - Calendar cGmt03 = Calendar.getInstance(tzGmt03); - Calendar cGmt05 = Calendar.getInstance(tzGmt05); - Calendar cGmt13 = Calendar.getInstance(tzGmt13); + Calendar cUtc = Calendar.getInstance(tzUtc, Locale.ROOT); + Calendar cGmt03 = Calendar.getInstance(tzGmt03, Locale.ROOT); + Calendar cGmt05 = Calendar.getInstance(tzGmt05, Locale.ROOT); + Calendar cGmt13 = Calendar.getInstance(tzGmt13, Locale.ROOT); Timestamp ts; String s; http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/QuidemTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/QuidemTest.java b/core/src/test/java/org/apache/calcite/test/QuidemTest.java index f15fe13..40a3266 100644 --- a/core/src/test/java/org/apache/calcite/test/QuidemTest.java +++ b/core/src/test/java/org/apache/calcite/test/QuidemTest.java @@ -42,11 +42,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.io.FilenameFilter; +import java.io.Reader; +import java.io.Writer; import java.lang.reflect.Method; import java.net.URL; import java.sql.Connection; @@ -148,11 +147,10 @@ public class QuidemTest { outFile = new File(base, u2n("/surefire/") + path); } Util.discard(outFile.getParentFile().mkdirs()); - try (final FileReader fileReader = new FileReader(inFile); - final BufferedReader bufferedReader = new BufferedReader(fileReader); - final FileWriter writer = new FileWriter(outFile); + try (final Reader reader = Util.reader(inFile); + final Writer writer = Util.printWriter(outFile); final Closer closer = new Closer()) { - new Quidem(bufferedReader, writer, env(), new QuidemConnectionFactory()) + new Quidem(reader, writer, env(), new QuidemConnectionFactory()) .withPropertyHandler(new Quidem.PropertyHandler() { public void onSet(String propertyName, Object value) { if (propertyName.equals("bindable")) { http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/RexImplicationCheckerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RexImplicationCheckerTest.java b/core/src/test/java/org/apache/calcite/test/RexImplicationCheckerTest.java index 69cccd0..84deb87 100644 --- a/core/src/test/java/org/apache/calcite/test/RexImplicationCheckerTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexImplicationCheckerTest.java @@ -37,6 +37,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.util.Holder; import org.apache.calcite.util.NlsString; +import org.apache.calcite.util.Util; import org.junit.Ignore; import org.junit.Test; @@ -177,7 +178,7 @@ public class RexImplicationCheckerTest { @Ignore("work in progress") @Test public void testSimpleDate() { final Fixture f = new Fixture(); - final Calendar instance = Calendar.getInstance(); + final Calendar instance = Util.calendar(); final RexNode node1 = f.ge(f.dt, f.rexBuilder.makeDateLiteral(instance)); final RexNode node2 = f.eq(f.dt, f.rexBuilder.makeDateLiteral(instance)); @@ -188,7 +189,7 @@ public class RexImplicationCheckerTest { @Ignore("work in progress") @Test public void testSimpleTimeStamp() { final Fixture f = new Fixture(); - final Calendar calendar = Calendar.getInstance(); + final Calendar calendar = Util.calendar(); final RexNode node1 = f.le(f.ts, f.timestampLiteral(calendar)); final RexNode node2 = f.le(f.ts, f.timestampLiteral(calendar)); @@ -199,7 +200,7 @@ public class RexImplicationCheckerTest { @Ignore("work in progress") @Test public void testSimpleTime() { final Fixture f = new Fixture(); - final Calendar calendar = Calendar.getInstance(); + final Calendar calendar = Util.calendar(); final RexNode node1 = f.le(f.ts, f.timeLiteral(calendar)); final RexNode node2 = f.le(f.ts, f.timeLiteral(calendar)); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java index 090f3ba..9ce8017 100644 --- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java @@ -18,7 +18,6 @@ package org.apache.calcite.test; import org.apache.calcite.adapter.java.JavaTypeFactory; import org.apache.calcite.avatica.util.ByteString; -import org.apache.calcite.avatica.util.DateTimeUtils; import org.apache.calcite.jdbc.JavaTypeFactoryImpl; import org.apache.calcite.plan.Strong; import org.apache.calcite.rel.type.RelDataType; @@ -1310,7 +1309,7 @@ public class RexProgramTest { } private Calendar cal(int y, int m, int d, int h, int mm, int s) { - final Calendar c = Calendar.getInstance(DateTimeUtils.GMT_ZONE); + final Calendar c = Util.calendar(); c.set(Calendar.YEAR, y); c.set(Calendar.MONTH, m); c.set(Calendar.DAY_OF_MONTH, d); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java b/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java index 00e789d..12ef35b 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlFunctionsTest.java @@ -88,11 +88,11 @@ public class SqlFunctionsTest { } @Test public void testLower() { - assertEquals("a bcd", lower("A bCd")); + assertEquals("a bcd iijk", lower("A bCd Iijk")); } @Test public void testUpper() { - assertEquals("A BCD", upper("A bCd")); + assertEquals("A BCD IIJK", upper("A bCd iIjk")); } @Test public void testInitcap() { http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/SqlLimitsTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlLimitsTest.java b/core/src/test/java/org/apache/calcite/test/SqlLimitsTest.java index c8d44ce..298830b 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlLimitsTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlLimitsTest.java @@ -211,11 +211,11 @@ public class SqlLimitsTest { private DateFormat getDateFormat(SqlTypeName typeName) { switch (typeName) { case DATE: - return new SimpleDateFormat("MMM d, yyyy"); + return new SimpleDateFormat("MMM d, yyyy", Locale.ROOT); case TIME: - return new SimpleDateFormat("hh:mm:ss a"); + return new SimpleDateFormat("hh:mm:ss a", Locale.ROOT); default: - return new SimpleDateFormat("MMM d, yyyy hh:mm:ss a"); + return new SimpleDateFormat("MMM d, yyyy hh:mm:ss a", Locale.ROOT); } } } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/SqlLineTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlLineTest.java b/core/src/test/java/org/apache/calcite/test/SqlLineTest.java index 241df75..9530e06 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlLineTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlLineTest.java @@ -18,6 +18,7 @@ package org.apache.calcite.test; import org.apache.calcite.util.Bug; import org.apache.calcite.util.Pair; +import org.apache.calcite.util.Util; import org.hamcrest.Matcher; @@ -25,8 +26,9 @@ import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.PrintStream; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -52,7 +54,8 @@ public class SqlLineTest { throws Throwable { SqlLine sqlline = new SqlLine(); ByteArrayOutputStream os = new ByteArrayOutputStream(); - PrintStream sqllineOutputStream = new PrintStream(os); + PrintStream sqllineOutputStream = + new PrintStream(os, false, StandardCharsets.UTF_8.name()); sqlline.setOutputStream(sqllineOutputStream); sqlline.setErrorStream(sqllineOutputStream); SqlLine.Status status = SqlLine.Status.OK; @@ -92,9 +95,9 @@ public class SqlLineTest { // Put the script content in a temp file File scriptFile = File.createTempFile("foo", "temp"); scriptFile.deleteOnExit(); - PrintStream os = new PrintStream(new FileOutputStream(scriptFile)); - os.print(scriptText); - os.close(); + try (PrintWriter w = Util.printWriter(scriptFile)) { + w.print(scriptText); + } Pair<SqlLine.Status, String> pair = runScript(scriptFile, flag); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/SqlTestGen.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlTestGen.java b/core/src/test/java/org/apache/calcite/test/SqlTestGen.java index e330efc..95ab005 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlTestGen.java +++ b/core/src/test/java/org/apache/calcite/test/SqlTestGen.java @@ -24,9 +24,9 @@ import org.apache.calcite.sql.test.SqlTester; import org.apache.calcite.sql.test.SqlTesterImpl; import org.apache.calcite.sql.validate.SqlValidator; import org.apache.calcite.util.BarfingInvocationHandler; +import org.apache.calcite.util.Util; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; @@ -51,8 +51,7 @@ public class SqlTestGen { private void genValidatorTest() { final File file = new File("validatorTest.sql"); - try (FileOutputStream fos = new FileOutputStream(file); - PrintWriter pw = new PrintWriter(fos)) { + try (PrintWriter pw = Util.printWriter(file)) { Method[] methods = getJunitMethods(SqlValidatorSpooler.class); for (Method method : methods) { final SqlValidatorSpooler test = new SqlValidatorSpooler(pw); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java index 8c0f268..938d4c7 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java @@ -3637,7 +3637,7 @@ public class SqlValidatorTest extends SqlValidatorTestCase { for (String interval : tsi) { for (String function : functions) { - checkExp(String.format(function, interval)); + checkExp(String.format(Locale.ROOT, function, interval)); } } @@ -7844,7 +7844,7 @@ public class SqlValidatorTest extends SqlValidatorTestCase { case INTERNAL: break; default: - assertThat(name.toUpperCase(), equalTo(name)); + assertThat(name.toUpperCase(Locale.ROOT), equalTo(name)); break; } } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java index 25d89eb..62e2b1c 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandExecutor.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.test.concurrent; +import org.apache.calcite.util.Unsafe; + import java.io.PrintStream; import java.sql.Connection; import java.sql.DriverManager; @@ -288,13 +290,13 @@ class ConcurrentTestCommandExecutor extends Thread { synchronized void waitForOthers() throws InterruptedException { if (++numWaiting == numThreads) { numWaiting = 0; - notifyAll(); + Unsafe.notifyAll(this); } else { // REVIEW: SZ 6/17/2004: Need a timeout here -- // otherwise a test case will hang forever if there's // a deadlock. The question is, how long should the // timeout be to avoid falsely detecting deadlocks? - wait(); + Unsafe.wait(this); } } } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java index eebb79c..ab3f7b1 100644 --- a/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java +++ b/core/src/test/java/org/apache/calcite/test/concurrent/ConcurrentTestCommandScript.java @@ -17,14 +17,13 @@ package org.apache.calcite.test.concurrent; import org.apache.calcite.jdbc.SqlTimeoutException; +import org.apache.calcite.util.Unsafe; import org.apache.calcite.util.Util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; import java.io.IOException; -import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; @@ -43,6 +42,7 @@ import java.util.Arrays; import java.util.Deque; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; @@ -440,12 +440,13 @@ public class ConcurrentTestCommandScript * translates argument of !set force etc. */ private boolean asBoolValue(String s) { - s = s.toLowerCase(); - return s.equals("true") || s.equals("yes") || s.equals("on"); + return s.equalsIgnoreCase("true") + || s.equalsIgnoreCase("yes") + || s.equalsIgnoreCase("on"); } /** - * Determines if a block of SQL is a select statment or not. + * Determines whether a block of SQL is a SELECT statement. */ private boolean isSelect(String sql) { BufferedReader rdr = new BufferedReader(new StringReader(sql)); @@ -453,7 +454,7 @@ public class ConcurrentTestCommandScript try { String line; while ((line = rdr.readLine()) != null) { - line = line.trim().toLowerCase(); + line = line.trim().toLowerCase(Locale.ROOT); if (isComment(line)) { continue; } @@ -520,11 +521,11 @@ public class ConcurrentTestCommandScript } } - public void printResults(BufferedWriter out) throws IOException { + public void printResults(PrintWriter out) throws IOException { final Map<Integer, String[]> results = collectResults(); if (verbose) { out.write( - String.format( + String.format(Locale.ROOT, "script execution started at %tc (%d)%n", new Timestamp(scriptStartTime), scriptStartTime)); } @@ -538,18 +539,18 @@ public class ConcurrentTestCommandScript printThreadResults(out, results.get(CLEANUP_THREAD_ID)); } - private void printThreadResults(BufferedWriter out, String[] threadResult) + private void printThreadResults(PrintWriter out, String[] threadResult) throws IOException { if (threadResult == null) { return; } String threadName = threadResult[0]; out.write("-- " + threadName); - out.newLine(); + out.println(); out.write(threadResult[1]); out.write("-- end of " + threadName); - out.newLine(); - out.newLine(); + out.println(); + out.println(); out.flush(); } @@ -848,7 +849,7 @@ public class ConcurrentTestCommandScript private void load(String scriptFileName) throws IOException { File scriptFile = new File(currentDirectory.peek(), scriptFileName); currentDirectory.push(scriptDirectory = scriptFile.getParentFile()); - try (BufferedReader in = new BufferedReader(new FileReader(scriptFile))) { + try (BufferedReader in = Util.reader(scriptFile)) { String line; while ((line = in.readLine()) != null) { line = line.trim(); @@ -1891,8 +1892,7 @@ public class ConcurrentTestCommandScript out.println(); } if (verbose) { - out.printf( - "fetch started at %tc %d, %s at %tc %d%n", + out.printf(Locale.ROOT, "fetch started at %tc %d, %s at %tc %d%n", startTime, startTime, timedOut ? "timeout" : "eos", endTime, endTime); @@ -1903,20 +1903,19 @@ public class ConcurrentTestCommandScript dt -= timeout; } assert dt >= 0; - out.printf( - "fetched %d rows in %d msecs %s%n", + out.printf(Locale.ROOT, "fetched %d rows in %d msecs %s%n", rowCount, dt, timedOut ? "(timeout)" : "(end)"); } } } private void printRowCount(int count) { - out.printf("(%06d) ", count); + out.printf(Locale.ROOT, "(%06d) ", count); } private void printTimestamp(long time) { time -= baseTime; - out.printf("(% 4d.%03d) ", time / 1000, time % 1000); + out.printf(Locale.ROOT, "(% 4d.%03d) ", time / 1000, time % 1000); } // indent a heading or separator line to match a row-values line @@ -2003,7 +2002,7 @@ public class ConcurrentTestCommandScript // returns 0 on success, 1 on error, 2 on bad invocation. public int run(String[] args) { - try { + try (final PrintWriter w = Util.printWriter(System.out)) { if (!parseCommand(args)) { usage(); return 2; @@ -2018,8 +2017,6 @@ public class ConcurrentTestCommandScript jdbcProps.setProperty("password", password); } - BufferedWriter cout = - new BufferedWriter(new OutputStreamWriter(System.out)); for (String file : files) { ConcurrentTestCommandScript script = new ConcurrentTestCommandScript(); @@ -2032,7 +2029,7 @@ public class ConcurrentTestCommandScript script.execute(); } finally { if (!quiet) { - script.printResults(cout); + script.printResults(w); } } } @@ -2109,7 +2106,7 @@ public class ConcurrentTestCommandScript */ public static void main(String[] args) { int status = new Tool().run(args); - System.exit(status); + Unsafe.systemExit(status); } } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/util/Smalls.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/util/Smalls.java b/core/src/test/java/org/apache/calcite/util/Smalls.java index c37f320..a2ac470 100644 --- a/core/src/test/java/org/apache/calcite/util/Smalls.java +++ b/core/src/test/java/org/apache/calcite/util/Smalls.java @@ -49,6 +49,7 @@ import java.lang.reflect.Method; import java.util.AbstractList; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import static org.hamcrest.CoreMatchers.is; @@ -427,7 +428,7 @@ public class Smalls { private MultipleFunction() {} // Three overloads - public static String fun1(String x) { return x.toLowerCase(); } + public static String fun1(String x) { return x.toLowerCase(Locale.ROOT); } public static int fun1(int x) { return x * 2; } public static int fun1(int x, int y) { return x + y; } @@ -615,19 +616,24 @@ public class Smalls { } public static ScannableTable generate(int width, int height, int seed) { - return new MazeTable(String.format("generate(w=%d, h=%d, s=%d)", width, height, seed)); + return new MazeTable( + String.format(Locale.ROOT, "generate(w=%d, h=%d, s=%d)", width, + height, seed)); } public static ScannableTable generate2( @Parameter(name = "WIDTH") int width, @Parameter(name = "HEIGHT") int height, @Parameter(name = "SEED", optional = true) Integer seed) { - return new MazeTable(String.format("generate2(w=%d, h=%d, s=%d)", width, height, seed)); + return new MazeTable( + String.format(Locale.ROOT, "generate2(w=%d, h=%d, s=%d)", width, + height, seed)); } public static ScannableTable generate3( @Parameter(name = "FOO") String foo) { - return new MazeTable(String.format("generate3(foo=%s)", foo)); + return new MazeTable( + String.format(Locale.ROOT, "generate3(foo=%s)", foo)); } public RelDataType getRowType(RelDataTypeFactory typeFactory) { http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/core/src/test/java/org/apache/calcite/util/UtilTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java b/core/src/test/java/org/apache/calcite/util/UtilTest.java index 8afc09b..2f48d64 100644 --- a/core/src/test/java/org/apache/calcite/util/UtilTest.java +++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java @@ -762,10 +762,10 @@ public class UtilTest { */ @Test public void testTemplate() { // Regular java message format. - assertEquals( - "Hello, world, what a nice day.", - MessageFormat.format( - "Hello, {0}, what a nice {1}.", "world", "day")); + assertThat( + new MessageFormat("Hello, {0}, what a nice {1}.", Locale.ROOT) + .format(new Object[]{"world", "day"}), + is("Hello, world, what a nice day.")); // Our extended message format. First, just strings. final HashMap<Object, Object> map = new HashMap<>(); @@ -1513,8 +1513,8 @@ public class UtilTest { final Comparator<String> comparator = new Comparator<String>() { public int compare(String o1, String o2) { - String u1 = o1.toUpperCase(); - String u2 = o2.toUpperCase(); + String u1 = o1.toUpperCase(Locale.ROOT); + String u2 = o2.toUpperCase(Locale.ROOT); int c = u1.compareTo(u2); if (c == 0) { c = o1.compareTo(o2); @@ -1545,7 +1545,8 @@ public class UtilTest { } private NavigableSet<String> checkNav(NavigableSet<String> set, String s) { - return set.subSet(s.toUpperCase(), true, s.toLowerCase(), true); + return set.subSet(s.toUpperCase(Locale.ROOT), true, + s.toLowerCase(Locale.ROOT), true); } /** Test for {@link org.apache.calcite.util.ImmutableNullableList}. */ @@ -1741,7 +1742,7 @@ public class UtilTest { final Map<String, String> map = Util.asIndexMap(values, new Function<String, String>() { public String apply(@Nullable String input) { - return input.toUpperCase(); + return input.toUpperCase(Locale.ROOT); } }); assertThat(map.size(), equalTo(values.size())); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java ---------------------------------------------------------------------- diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java index d7f54fa..036a2e1 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidConnectionImpl.java @@ -45,11 +45,13 @@ import com.google.common.collect.ImmutableSet; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; @@ -71,7 +73,8 @@ class DruidConnectionImpl implements DruidConnection { static { final TimeZone utc = DateTimeUtils.GMT_ZONE; - UTC_TIMESTAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + UTC_TIMESTAMP_FORMAT = + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT); UTC_TIMESTAMP_FORMAT.setTimeZone(utc); } @@ -117,7 +120,8 @@ class DruidConnectionImpl implements DruidConnection { if (CalcitePrepareImpl.DEBUG) { try { final byte[] bytes = AvaticaUtils.readFullyToBytes(in); - System.out.println("Response: " + new String(bytes)); + System.out.println("Response: " + + new String(bytes, StandardCharsets.UTF_8)); in = new ByteArrayInputStream(bytes); } catch (IOException e) { throw new RuntimeException(e); @@ -516,7 +520,8 @@ class DruidConnectionImpl implements DruidConnection { try { final byte[] bytes = AvaticaUtils.readFullyToBytes(in); in.close(); - System.out.println("Response: " + new String(bytes)); + System.out.println("Response: " + + new String(bytes, StandardCharsets.UTF_8)); in = new ByteArrayInputStream(bytes); } catch (IOException e) { throw new RuntimeException(e); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java ---------------------------------------------------------------------- diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java index 17ddd05..694f9c7 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java @@ -962,7 +962,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel { case OR: case NOT: call = (RexCall) e; - return new JsonCompositeFilter(e.getKind().toString().toLowerCase(), + return new JsonCompositeFilter(e.getKind().lowerName, translateFilters(call.getOperands())); } throw new AssertionError("cannot translate filter: " + e); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/druid/src/main/java/org/apache/calcite/adapter/druid/Granularity.java ---------------------------------------------------------------------- diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/Granularity.java b/druid/src/main/java/org/apache/calcite/adapter/druid/Granularity.java index b3f1e85..0ee2e20 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/Granularity.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/Granularity.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.adapter.druid; +import java.util.Locale; + /** Granularity of a Druid query. */ public enum Granularity { ALL, @@ -30,7 +32,7 @@ public enum Granularity { NONE; /** JSON attribute value in a Druid query. */ - public final String value = name().toLowerCase(); + public final String value = name().toLowerCase(Locale.ROOT); } // End Granularity.java http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java ---------------------------------------------------------------------- diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java index f11a7b5..ef22fa2 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java @@ -39,6 +39,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; @@ -93,7 +94,8 @@ public class ElasticsearchFilter extends Filter implements ElasticsearchRel { final Map<String, Object> map = builder.map(); map.put("constant_score", filterMap); - return "\"query\" : " + builder.toJsonString(map).replaceAll("\\s+", "").toLowerCase(); + return "\"query\" : " + builder.toJsonString(map).replaceAll("\\s+", "") + .toLowerCase(Locale.ROOT); } private Object translateOr(RexNode condition) { http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java ---------------------------------------------------------------------- diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java index 44520c1..b544b16 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java @@ -22,6 +22,7 @@ import org.apache.calcite.schema.SchemaFactory; import org.apache.calcite.schema.SchemaPlus; import java.io.File; +import java.util.Locale; import java.util.Map; /** @@ -56,7 +57,7 @@ public class CsvSchemaFactory implements SchemaFactory { if (flavorName == null) { flavor = CsvTable.Flavor.SCANNABLE; } else { - flavor = CsvTable.Flavor.valueOf(flavorName.toUpperCase()); + flavor = CsvTable.Flavor.valueOf(flavorName.toUpperCase(Locale.ROOT)); } return new CsvSchema(directoryFile, flavor); } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java ---------------------------------------------------------------------- diff --git a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java index 38693ce..47c9213 100644 --- a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java +++ b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java @@ -31,7 +31,6 @@ import org.junit.Ignore; import org.junit.Test; import java.io.File; -import java.io.FileWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.net.URL; @@ -582,7 +581,7 @@ public class CsvTest { try (final Connection connection = DriverManager.getConnection("jdbc:calcite:model=inline:" + model); - final PrintWriter pw = new PrintWriter(new FileWriter(file)); + final PrintWriter pw = Util.printWriter(file); final Worker<Void> worker = new Worker<>()) { final Thread thread = new Thread(worker); thread.start(); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java ---------------------------------------------------------------------- diff --git a/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java b/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java index 3a2dc02..a08b366 100644 --- a/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java +++ b/example/function/src/main/java/org/apache/calcite/example/maze/MazeTable.java @@ -27,6 +27,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.schema.ScannableTable; import org.apache.calcite.schema.impl.AbstractTable; import org.apache.calcite.sql.type.SqlTypeName; +import org.apache.calcite.util.Util; import java.io.PrintWriter; import java.util.Random; @@ -88,7 +89,7 @@ public class MazeTable extends AbstractTable implements ScannableTable { public Enumerable<Object[]> scan(DataContext root) { final Random random = seed >= 0 ? new Random(seed) : new Random(); final Maze maze = new Maze(width, height); - final PrintWriter pw = new PrintWriter(System.out); + final PrintWriter pw = Util.printWriter(System.out); maze.layout(random, pw); if (Maze.DEBUG) { maze.print(pw, true); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java ---------------------------------------------------------------------- diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java b/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java index fc6904b..6eecce4 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileReader.java @@ -24,6 +24,8 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Iterator; /** @@ -31,12 +33,10 @@ import java.util.Iterator; */ public class FileReader implements Iterable<Elements> { - private static final String DEFAULT_CHARSET = "UTF-8"; - private final Source source; private final String selector; private final Integer index; - private final String charset = DEFAULT_CHARSET; + private final Charset charset = StandardCharsets.UTF_8; private Element tableElement; private Elements headings; @@ -63,7 +63,7 @@ public class FileReader implements Iterable<Elements> { try { String proto = source.protocol(); if (proto.equals("file")) { - doc = Jsoup.parse(source.file(), this.charset); + doc = Jsoup.parse(source.file(), this.charset.name()); } else { doc = Jsoup.connect(source.path()).get(); } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java ---------------------------------------------------------------------- diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java b/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java index a6c1bcc..827bf59 100644 --- a/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java +++ b/file/src/main/java/org/apache/calcite/adapter/file/FileRowConverter.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -55,6 +56,16 @@ class FileRowConverter { // row parser configuration private final List<FieldDef> fields = new ArrayList<>(); + /** Format for parsing numbers. Not thread-safe, but we assume that only + * one thread uses this converter at a time. */ + private final NumberFormat numberFormat = + NumberFormat.getInstance(Locale.ROOT); + + /** Format for parsing integers. Not thread-safe, but we assume that only + * one thread uses this converter at a time. */ + private final NumberFormat integerFormat = + NumberFormat.getIntegerInstance(Locale.ROOT); + /** Creates a FileRowConverter. */ FileRowConverter(FileReader fileReader, List<Map<String, Object>> fieldConfigs) { @@ -340,43 +351,36 @@ class FileRowConverter { return Byte.parseByte(string); case SHORT: - try { - return NumberFormat.getIntegerInstance().parse(string) - .shortValue(); + return integerFormat.parse(string).shortValue(); } catch (ParseException e) { return null; } case INT: - try { - return NumberFormat.getIntegerInstance().parse(string) - .intValue(); + return integerFormat.parse(string).intValue(); } catch (ParseException e) { return null; } case LONG: - try { - return NumberFormat.getInstance().parse(string).longValue(); + return numberFormat.parse(string).longValue(); } catch (ParseException e) { return null; } case FLOAT: - try { - return NumberFormat.getInstance().parse(string).floatValue(); + return numberFormat.parse(string).floatValue(); } catch (ParseException e) { return null; } case DOUBLE: - try { - return NumberFormat.getInstance().parse(string).doubleValue(); + return numberFormat.parse(string).doubleValue(); } catch (ParseException e) { return null; } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/linq4j/src/test/java/org/apache/calcite/linq4j/test/Linq4jTest.java ---------------------------------------------------------------------- diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/Linq4jTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/Linq4jTest.java index f19bdd0..e55a025 100644 --- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/Linq4jTest.java +++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/Linq4jTest.java @@ -52,6 +52,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; @@ -338,7 +339,8 @@ public class Linq4jTest { return String.CASE_INSENSITIVE_ORDER.compare(v1, v2) == 0; } public int hashCode(String s) { - return s == null ? Objects.hashCode(null) : s.toLowerCase().hashCode(); + return s == null ? Objects.hashCode(null) + : s.toLowerCase(Locale.ROOT).hashCode(); } }); assertEquals(3, map.size()); @@ -361,7 +363,7 @@ public class Linq4jTest { .toMap(Functions.<String>identitySelector(), new Function1<String, String>() { public String apply(String x) { - return x == null ? null : x.toUpperCase(); + return x == null ? null : x.toUpperCase(Locale.ROOT); } }, new EqualityComparer<String>() { @@ -369,7 +371,8 @@ public class Linq4jTest { return String.CASE_INSENSITIVE_ORDER.compare(v1, v2) == 0; } public int hashCode(String s) { - return s == null ? Objects.hashCode(null) : s.toLowerCase().hashCode(); + return s == null ? Objects.hashCode(null) + : s.toLowerCase(Locale.ROOT).hashCode(); } }); assertEquals(3, map.size()); @@ -2161,8 +2164,7 @@ public class Linq4jTest { .groupBy(EMP_DEPTNO_SELECTOR) .select(new Function1<Grouping<Integer, Employee>, String>() { public String apply(Grouping<Integer, Employee> group) { - return String.format("%s: %s", - group.getKey(), + return String.format(Locale.ROOT, "%s: %s", group.getKey(), stringJoin("+", group.select(new Function1<Employee, String>() { public String apply(Employee element) { return element.name; @@ -2190,8 +2192,7 @@ public class Linq4jTest { }) .select(new Function1<Grouping<Integer, Employee>, String>() { public String apply(Grouping<Integer, Employee> group) { - return String.format("%s: %s", - group.getKey(), + return String.format(Locale.ROOT, "%s: %s", group.getKey(), stringJoin("+", group.select(new Function1<Employee, String>() { public String apply(Employee element) { return element.name; @@ -2212,7 +2213,8 @@ public class Linq4jTest { .groupBy(EMP_DEPTNO_SELECTOR, EMP_NAME_SELECTOR) .select(new Function1<Grouping<Integer, String>, String>() { public String apply(Grouping<Integer, String> group) { - return String.format("%s: %s", group.getKey(), stringJoin("+", group)); + return String.format(Locale.ROOT, "%s: %s", group.getKey(), + stringJoin("+", group)); } }) .toList() @@ -2249,7 +2251,8 @@ public class Linq4jTest { }) .select(new Function1<Grouping<Integer, String>, String>() { public String apply(Grouping<Integer, String> group) { - return String.format("%s: %s", group.getKey(), stringJoin("+", group)); + return String.format(Locale.ROOT, "%s: %s", group.getKey(), + stringJoin("+", group)); } }) .toList() @@ -2264,8 +2267,7 @@ public class Linq4jTest { Linq4j.asEnumerable(emps) .groupBy(EMP_DEPTNO_SELECTOR, new Function2<Integer, Enumerable<Employee>, String>() { public String apply(Integer key, Enumerable<Employee> group) { - return String.format("%s: %s", - key, + return String.format(Locale.ROOT, "%s: %s", key, stringJoin("+", group.select(new Function1<Employee, String>() { public String apply(Employee element) { return element.name; @@ -2285,8 +2287,7 @@ public class Linq4jTest { Linq4j.asEnumerable(emps) .groupBy(EMP_DEPTNO_SELECTOR, new Function2<Integer, Enumerable<Employee>, String>() { public String apply(Integer key, Enumerable<Employee> group) { - return String.format("%s: %s", - key, + return String.format(Locale.ROOT, "%s: %s", key, stringJoin("+", group.select(new Function1<Employee, String>() { public String apply(Employee element) { return element.name; @@ -2314,7 +2315,8 @@ public class Linq4jTest { .groupBy(EMP_DEPTNO_SELECTOR, EMP_NAME_SELECTOR, new Function2<Integer, Enumerable<String>, String>() { public String apply(Integer key, Enumerable<String> group) { - return String.format("%s: %s", key, stringJoin("+", group)); + return String.format(Locale.ROOT, "%s: %s", key, + stringJoin("+", group)); } }) .toList() @@ -2330,7 +2332,8 @@ public class Linq4jTest { .groupBy(EMP_DEPTNO_SELECTOR, EMP_NAME_SELECTOR, new Function2<Integer, Enumerable<String>, String>() { public String apply(Integer key, Enumerable<String> group) { - return String.format("%s: %s", key, stringJoin("+", group)); + return String.format(Locale.ROOT, "%s: %s", key, + stringJoin("+", group)); } }, new EqualityComparer<Integer>() { http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java ---------------------------------------------------------------------- diff --git a/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java b/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java index 5f240e3..9a430b2 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java +++ b/plus/src/main/java/org/apache/calcite/adapter/tpcds/TpcdsSchema.java @@ -41,6 +41,7 @@ import net.hydromatic.tpcds.TpcdsTable; import java.sql.Date; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; /** Schema that provides TPC-DS tables, populated according to a @@ -88,7 +89,7 @@ public class TpcdsSchema extends AbstractSchema { final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder(); for (TpcdsTable<?> tpcdsTable : TpcdsTable.getTables()) { //noinspection unchecked - builder.put(tpcdsTable.getTableName().toUpperCase(), + builder.put(tpcdsTable.getTableName().toUpperCase(Locale.ROOT), new TpcdsQueryableTable(tpcdsTable)); } this.tableMap = builder.build(); @@ -166,7 +167,7 @@ public class TpcdsSchema extends AbstractSchema { public RelDataType getRowType(RelDataTypeFactory typeFactory) { final RelDataTypeFactory.FieldInfoBuilder builder = typeFactory.builder(); for (TpcdsColumn<E> column : tpcdsTable.getColumns()) { - builder.add(column.getColumnName().toUpperCase(), + builder.add(column.getColumnName().toUpperCase(Locale.ROOT), typeFactory.createJavaType(realType(column))); } return builder.build(); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/plus/src/main/java/org/apache/calcite/adapter/tpch/TpchSchema.java ---------------------------------------------------------------------- diff --git a/plus/src/main/java/org/apache/calcite/adapter/tpch/TpchSchema.java b/plus/src/main/java/org/apache/calcite/adapter/tpch/TpchSchema.java index 68e1c31..451c344 100644 --- a/plus/src/main/java/org/apache/calcite/adapter/tpch/TpchSchema.java +++ b/plus/src/main/java/org/apache/calcite/adapter/tpch/TpchSchema.java @@ -36,6 +36,7 @@ import io.airlift.tpch.TpchTable; import java.sql.Date; import java.util.List; +import java.util.Locale; import java.util.Map; /** Schema that provides TPC-H tables, populated according to a @@ -57,7 +58,7 @@ public class TpchSchema extends AbstractSchema { final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder(); for (TpchTable<?> tpchTable : TpchTable.getTables()) { - builder.put(tpchTable.getTableName().toUpperCase(), + builder.put(tpchTable.getTableName().toUpperCase(Locale.ROOT), new TpchQueryableTable(tpchTable)); } this.tableMap = builder.build(); @@ -140,12 +141,14 @@ public class TpchSchema extends AbstractSchema { final RelDataTypeFactory.FieldInfoBuilder builder = typeFactory.builder(); String prefix = ""; if (columnPrefix) { - prefix = columnPrefixes.get(tpchTable.getTableName().toUpperCase()); - assert prefix != null : tpchTable.getTableName().toUpperCase(); + final String t = tpchTable.getTableName().toUpperCase(Locale.ROOT); + prefix = columnPrefixes.get(t); + assert prefix != null : t; } for (TpchColumn<E> column : tpchTable.getColumns()) { - builder.add((prefix + column.getColumnName()).toUpperCase(), - typeFactory.createJavaType(realType(column))); + final String c = (prefix + column.getColumnName()) + .toUpperCase(Locale.ROOT); + builder.add(c, typeFactory.createJavaType(realType(column))); } return builder.build(); } http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 6cda20f..2340596 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,7 @@ limitations under the License. <fmpp-maven-plugin.version>1.0</fmpp-maven-plugin.version> <foodmart-data-hsqldb.version>0.3</foodmart-data-hsqldb.version> <foodmart-queries.version>0.4.1</foodmart-queries.version> + <forbiddenapis.version>2.3</forbiddenapis.version> <freemarker.version>2.3.25-incubating</freemarker.version> <git-commit-id-plugin.version>2.1.9</git-commit-id-plugin.version> @@ -461,6 +462,43 @@ limitations under the License. <build> <plugins> <plugin> + <groupId>de.thetaphi</groupId> + <artifactId>forbiddenapis</artifactId> + <configuration> + <!-- if the used Java version is too new, don't fail, just do nothing: --> + <failOnUnsupportedJava>false</failOnUnsupportedJava> + <bundledSignatures> + <!-- + This will automatically choose the right + signatures based on 'maven.compiler.target': + --> + <bundledSignature>jdk-unsafe</bundledSignature> + <bundledSignature>jdk-deprecated</bundledSignature> + <!-- disallow undocumented classes like sun.misc.Unsafe: --> + <bundledSignature>jdk-non-portable</bundledSignature> + </bundledSignatures> + <signaturesFiles> + <signaturesFile>${top.dir}/src/main/config/forbidden-apis/signatures.txt</signaturesFile> + </signaturesFiles> + <excludes> + <exclude>**/ParseException.class</exclude> + <exclude>**/SimpleCharStream.class</exclude> + <exclude>**/*TokenManager.class</exclude> + <exclude>**/TokenMgrError.class</exclude> + <exclude>**/org/apache/calcite/runtime/Resources$Inst.class</exclude> + <exclude>**/org/apache/calcite/util/Unsafe.class</exclude> + </excludes> + </configuration> + <executions> + <execution> + <goals> + <goal>check</goal> + <goal>testCheck</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> <groupId>org.apache.rat</groupId> <artifactId>apache-rat-plugin</artifactId> <configuration> @@ -674,6 +712,11 @@ limitations under the License. </dependencies> </plugin> <plugin> + <groupId>de.thetaphi</groupId> + <artifactId>forbiddenapis</artifactId> + <version>${forbiddenapis.version}</version> + </plugin> + <plugin> <groupId>net.hydromatic</groupId> <artifactId>hydromatic-resource-maven-plugin</artifactId> <version>${hydromatic-resource.version}</version> @@ -749,7 +792,19 @@ limitations under the License. <threadCount>1</threadCount> <perCoreThreadCount>true</perCoreThreadCount> <parallel>both</parallel> - <argLine>-Xmx1536m -XX:MaxPermSize=256m -Duser.timezone=${user.timezone}</argLine> + <forkMode>once</forkMode> + <systemProperties> + <systemProperty> + <name>user.language</name> + <value>TR</value> + </systemProperty> + <systemProperty> + <name>user.country</name> + <value>tr</value> + </systemProperty> + </systemProperties> + <!--<argLine>-Xmx1536m -XX:MaxPermSize=256m -Duser.timezone=${user.timezone} -Duser.country=${user.country} -Duser.language=${user.language}</argLine>--> + <argLine>-Xmx1536m -XX:MaxPermSize=256m</argLine> </configuration> </plugin> <plugin> http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkHandlerImpl.java ---------------------------------------------------------------------- diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkHandlerImpl.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkHandlerImpl.java index b67f096..a580912 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkHandlerImpl.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkHandlerImpl.java @@ -23,14 +23,15 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.rel.RelNode; import org.apache.calcite.runtime.ArrayBindable; +import org.apache.calcite.util.Util; import org.apache.calcite.util.javac.JaninoCompiler; import org.apache.spark.api.java.JavaSparkContext; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.Serializable; +import java.io.Writer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Calendar; @@ -63,7 +64,7 @@ public class SparkHandlerImpl implements CalcitePrepare.SparkHandler { // Generate a starting point for class names that is unlikely to clash with // previous classes. A better solution would be to clear the class directory // on startup. - final Calendar calendar = Calendar.getInstance(); + final Calendar calendar = Util.calendar(); classId = new AtomicInteger( calendar.get(Calendar.HOUR_OF_DAY) * 10000 + calendar.get(Calendar.MINUTE) * 100 @@ -104,10 +105,9 @@ public class SparkHandlerImpl implements CalcitePrepare.SparkHandler { } public ArrayBindable compile(ClassDeclaration expr, String s) { - try { - String className = "CalciteProgram" + classId.getAndIncrement(); - File file = new File(SRC_DIR, className + ".java"); - FileWriter fileWriter = new FileWriter(file, false); + final String className = "CalciteProgram" + classId.getAndIncrement(); + final File file = new File(SRC_DIR, className + ".java"); + try (Writer w = Util.printWriter(file)) { String source = "public class " + className + "\n" + " implements " + ArrayBindable.class.getName() + ", " + Serializable.class.getName() @@ -119,8 +119,8 @@ public class SparkHandlerImpl implements CalcitePrepare.SparkHandler { System.out.println(source); System.out.println("======================"); - fileWriter.write(source); - fileWriter.close(); + w.write(source); + w.close(); JaninoCompiler compiler = new JaninoCompiler(); compiler.getArgs().setDestdir(CLASS_DIR.getAbsolutePath()); compiler.getArgs().setSource(source, file.getAbsolutePath()); http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java ---------------------------------------------------------------------- diff --git a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java index 3adfcd9..8b355a2 100644 --- a/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java +++ b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java @@ -72,6 +72,7 @@ import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Random; /** @@ -445,7 +446,7 @@ public abstract class SparkRules { return Collections.emptyList(); } return Collections.singletonList( - Pair.of(x.toUpperCase(), x.length())); + Pair.of(x.toUpperCase(Locale.ROOT), x.length())); } }) .take(5) http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java ---------------------------------------------------------------------- diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java index aeb4a91..8f08e23 100644 --- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java +++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java @@ -19,6 +19,8 @@ package org.apache.calcite.adapter.splunk.search; import org.apache.calcite.adapter.splunk.util.StringUtils; import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.Linq4j; +import org.apache.calcite.util.Unsafe; +import org.apache.calcite.util.Util; import au.com.bytecode.opencsv.CSVReader; @@ -34,10 +36,12 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -87,7 +91,7 @@ public class SplunkConnectionImpl implements SplunkConnection { try { String loginUrl = - String.format( + String.format(Locale.ROOT, "%s://%s:%d/services/auth/login", url.getProtocol(), url.getHost(), @@ -97,12 +101,7 @@ public class SplunkConnectionImpl implements SplunkConnection { appendURLEncodedArgs( data, "username", username, "password", password); - rd = new BufferedReader( - new InputStreamReader( - post( - loginUrl, - data, - requestHeaders))); + rd = Util.reader(post(loginUrl, data, requestHeaders)); String line; StringBuilder reply = new StringBuilder(); @@ -141,7 +140,7 @@ public class SplunkConnectionImpl implements SplunkConnection { List<String> wantedFields, SearchResultListener srl) { String searchUrl = - String.format( + String.format(Locale.ROOT, "%s://%s:%d/services/search/jobs/export", url.getProtocol(), url.getHost(), @@ -182,7 +181,9 @@ public class SplunkConnectionImpl implements SplunkConnection { } private static void parseResults(InputStream in, SearchResultListener srl) { - try (CSVReader r = new CSVReader(new InputStreamReader(in))) { + try (CSVReader r = new CSVReader( + new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8)))) { String[] header = r.readNext(); if (header != null && header.length > 0 @@ -237,7 +238,7 @@ public class SplunkConnectionImpl implements SplunkConnection { for (String s : strings) { System.err.println(s); } - System.exit(1); + Unsafe.systemExit(1); } public static void main(String[] args) throws MalformedURLException { @@ -283,8 +284,7 @@ public class SplunkConnectionImpl implements SplunkConnection { long start = System.currentTimeMillis(); c.getSearchResults(search, searchArgs, null, dummy); - System.out.printf( - "received %d results in %dms\n", + System.out.printf(Locale.ROOT, "received %d results in %dms\n", dummy.getResultCount(), System.currentTimeMillis() - start); } @@ -310,7 +310,8 @@ public class SplunkConnectionImpl implements SplunkConnection { resultCount++; if (print) { for (int i = 0; i < this.fieldNames.length; ++i) { - System.out.printf("%s=%s\n", this.fieldNames[i], values[i]); + System.out.printf(Locale.ROOT, "%s=%s\n", this.fieldNames[i], + values[i]); } System.out.println(); } @@ -346,7 +347,10 @@ public class SplunkConnectionImpl implements SplunkConnection { private int source; public SplunkResultEnumerator(InputStream in, List<String> wantedFields) { - csvReader = new CSVReader(new InputStreamReader(in)); + csvReader = + new CSVReader( + new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8))); try { fieldNames = csvReader.readNext(); if (fieldNames == null http://git-wip-us.apache.org/repos/asf/calcite/blob/75152c5b/src/main/config/forbidden-apis/signatures.txt ---------------------------------------------------------------------- diff --git a/src/main/config/forbidden-apis/signatures.txt b/src/main/config/forbidden-apis/signatures.txt new file mode 100644 index 0000000..a0eb429 --- /dev/null +++ b/src/main/config/forbidden-apis/signatures.txt @@ -0,0 +1,42 @@ +# 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. +# +# Signatures of APIs to avoid. +# Cribbed from Elasticsearch + +java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars +java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars + +@defaultMessage Only use wait / notify when really needed try to use concurrency primitives, latches or callbacks instead. +java.lang.Object#wait() +java.lang.Object#wait(long) +java.lang.Object#wait(long,int) +java.lang.Object#notify() +java.lang.Object#notifyAll() + +@defaultMessage Use StringBuilder; it is more efficient +java.lang.StringBuffer + +@defaultMessage Please do not try to stop the world +java.lang.System#gc() + +@defaultMessage Please do not try to kill the world +java.lang.System#exit(int) +java.lang.Runtime#exit(int) + +@defaultMessage Don't interrupt threads use FutureUtils#cancel(Future<T>) instead +java.util.concurrent.Future#cancel(boolean) + +# End signatures.txt
