Skip to content

Commit bc7796e

Browse files
kriegaexslachiewicz
authored andcommitted
Recognise javac.msg.io error header
"An input/output error occurred. Consult the following stack trace for details."
1 parent a1ad21d commit bc7796e

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,19 @@ protected static class Messages {
187187
"\n\n系统资源不足。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
188188
"\n\nDas System hat keine Ressourcen mehr.\nDetails finden Sie im folgenden Stacktrace.\n"
189189
};
190+
191+
// javac.properties-> javac.msg.io
192+
// (en JDK-8, ja JDK-8, zh_CN JDK-8, en JDK-21, ja JDK-21, zh_CN JDK-21, de JDK-21)
193+
protected static final String[] IO_ERROR_HEADERS = {
194+
"\n\nAn input/output error occurred.\nConsult the following stack trace for details.\n",
195+
"\n\n入出力エラーが発生しました。\n詳細は次のスタック・トレースで調査してください。\n",
196+
"\n\n发生输入/输出错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
197+
"\n\nAn input/output error occurred.\nConsult the following stack trace for details.\n",
198+
"\n\n入出力エラーが発生しました。\n詳細は次のスタックトレースで調査してください。\n",
199+
"\n\n发生输入/输出错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n",
200+
"\n\nEin Eingabe-/Ausgabefehler ist aufgetreten.\nDetails finden Sie im folgenden Stacktrace.\n"
201+
};
202+
190203
}
191204

192205
private static final Object LOCK = new Object();
@@ -755,7 +768,8 @@ static List<CompilerMessage> parseModernStream(int exitCode, BufferedReader inpu
755768
|| (cleanedUpMessage = getVMInitError(bufferContent)) != null
756769
|| (cleanedUpMessage = getFileABugError(bufferContent)) != null
757770
|| (cleanedUpMessage = getAnnotationProcessingError(bufferContent)) != null
758-
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null) {
771+
|| (cleanedUpMessage = getSystemOutOfResourcesError(bufferContent)) != null
772+
|| (cleanedUpMessage = getIOError(bufferContent)) != null) {
759773
errors.add(new CompilerMessage(cleanedUpMessage, ERROR));
760774
} else if (hasPointer) {
761775
// A compiler message remains in buffer at end of parse stream
@@ -820,6 +834,10 @@ private static String getSystemOutOfResourcesError(String message) {
820834
return getTextStartingWithPrefix(message, SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS);
821835
}
822836

837+
private static String getIOError(String message) {
838+
return getTextStartingWithPrefix(message, IO_ERROR_HEADERS);
839+
}
840+
823841
private static boolean startsWithPrefix(String text, String[] prefixes) {
824842
for (String prefix : prefixes) {
825843
if (text.startsWith(prefix)) {

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,8 @@ private static Stream<Arguments> testStackTraceWithUnknownHeader_args() {
811811
ANNOTATION_PROCESSING_ERROR_HEADERS[0].replaceAll("uncaught", "undandled")),
812812
Arguments.of(
813813
"modified out of resources error header",
814-
SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0].replaceAll("resources", "memory")));
814+
SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0].replaceAll("resources", "memory")),
815+
Arguments.of("modified I/O error header", IO_ERROR_HEADERS[0].replaceAll("input/output", "I/O")));
815816
}
816817

817818
@ParameterizedTest(name = "{0}")
@@ -929,6 +930,53 @@ private static Stream<Arguments> testSystemOutOfResourcesError_args() {
929930
Arguments.of("JDK 21 German", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[6]));
930931
}
931932

933+
@ParameterizedTest(name = "{0}")
934+
@MethodSource("testIOError_args")
935+
public void testIOError(String jdkAndLocale, String stackTraceHeader) throws Exception {
936+
String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTraceIOError;
937+
938+
List<CompilerMessage> compilerMessages =
939+
JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
940+
941+
assertThat(compilerMessages, notNullValue());
942+
assertThat(compilerMessages, hasSize(1));
943+
944+
String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
945+
// Parser retains stack trace header
946+
assertThat(message, startsWith(stackTraceHeader));
947+
assertThat(message, endsWith(stackTraceIOError));
948+
}
949+
950+
private static final String stackTraceIOError =
951+
"An input/output error occurred.\n" + "Consult the following stack trace for details.\n"
952+
+ "java.nio.charset.MalformedInputException: Input length = 1\n"
953+
+ "\tat java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)\n"
954+
+ "\tat java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)\n"
955+
+ "\tat java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)\n"
956+
+ "\tat java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)\n"
957+
+ "\tat java.base/java.io.BufferedReader.fill(BufferedReader.java:161)\n"
958+
+ "\tat java.base/java.io.BufferedReader.read(BufferedReader.java:182)\n"
959+
+ "\tat jdk.compiler/com.sun.tools.javac.main.CommandLine$Tokenizer.<init>(CommandLine.java:143)\n"
960+
+ "\tat jdk.compiler/com.sun.tools.javac.main.CommandLine.loadCmdFile(CommandLine.java:129)\n"
961+
+ "\tat jdk.compiler/com.sun.tools.javac.main.CommandLine.appendParsedCommandArgs(CommandLine.java:71)\n"
962+
+ "\tat jdk.compiler/com.sun.tools.javac.main.CommandLine.parse(CommandLine.java:102)\n"
963+
+ "\tat jdk.compiler/com.sun.tools.javac.main.CommandLine.parse(CommandLine.java:123)\n"
964+
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:215)\n"
965+
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170)\n"
966+
+ "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)\n"
967+
+ "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)\n";
968+
969+
private static Stream<Arguments> testIOError_args() {
970+
return Stream.of(
971+
Arguments.of("JDK 8 English", IO_ERROR_HEADERS[0]),
972+
Arguments.of("JDK 8 Japanese", IO_ERROR_HEADERS[1]),
973+
Arguments.of("JDK 8 Chinese", IO_ERROR_HEADERS[2]),
974+
Arguments.of("JDK 21 English", IO_ERROR_HEADERS[3]),
975+
Arguments.of("JDK 21 Japanese", IO_ERROR_HEADERS[4]),
976+
Arguments.of("JDK 21 Chinese", IO_ERROR_HEADERS[5]),
977+
Arguments.of("JDK 21 German", IO_ERROR_HEADERS[6]));
978+
}
979+
932980
@Test
933981
public void testNonAnchoredWarning() throws IOException {
934982
final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL

0 commit comments

Comments
 (0)