View Javadoc
1   package org.codehaus.plexus.compiler.javac;
2   
3   /**
4    * The MIT License
5    *
6    * Copyright (c) 2005, The Codehaus
7    *
8    * Permission is hereby granted, free of charge, to any person obtaining a copy of
9    * this software and associated documentation files (the "Software"), to deal in
10   * the Software without restriction, including without limitation the rights to
11   * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12   * of the Software, and to permit persons to whom the Software is furnished to do
13   * so, subject to the following conditions:
14   *
15   * The above copyright notice and this permission notice shall be included in all
16   * copies or substantial portions of the Software.
17   *
18   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24   * SOFTWARE.
25   */
26  import java.io.BufferedReader;
27  import java.io.IOException;
28  import java.io.StringReader;
29  import java.util.ArrayList;
30  import java.util.List;
31  import java.util.stream.Stream;
32  
33  import org.codehaus.plexus.compiler.CompilerMessage;
34  import org.codehaus.plexus.util.Os;
35  import org.junit.jupiter.api.Test;
36  import org.junit.jupiter.params.ParameterizedTest;
37  import org.junit.jupiter.params.provider.Arguments;
38  import org.junit.jupiter.params.provider.MethodSource;
39  
40  import static org.codehaus.plexus.compiler.javac.JavacCompiler.Messages.*;
41  import static org.hamcrest.CoreMatchers.*;
42  import static org.hamcrest.MatcherAssert.assertThat;
43  import static org.hamcrest.Matchers.hasSize;
44  import static org.hamcrest.Matchers.is;
45  import static org.hamcrest.Matchers.notNullValue;
46  
47  /**
48   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
49   * @author Alexander Kriegisch
50   */
51  public class ErrorMessageParserTest {
52      private static final String EOL = System.getProperty("line.separator");
53      private static final String UNIDENTIFIED_LOG_LINES =
54              "These log lines should be cut off\n" + "when preceding known error message headers\n";
55  
56      @Test
57      public void testDeprecationMessage() throws Exception {
58          String error =
59                  "target/compiler-src/testDeprecation/Foo.java:1: warning: Date(java.lang.String) in java.util.Date has been deprecated"
60                          + EOL + "import java.util.Date;public class Foo{    private Date date = new Date( \"foo\");}"
61                          + EOL + "                                                               ^"
62                          + EOL;
63  
64          CompilerMessage compilerError = JavacCompiler.parseModernError(0, error);
65  
66          assertThat(compilerError, notNullValue());
67  
68          assertThat(compilerError.isError(), is(false));
69  
70          assertThat(compilerError.getMessage(), is("Date(java.lang.String) in java.util.Date has been deprecated"));
71  
72          assertThat(compilerError.getStartColumn(), is(63));
73  
74          assertThat(compilerError.getEndColumn(), is(66));
75  
76          assertThat(compilerError.getStartLine(), is(1));
77  
78          assertThat(compilerError.getEndLine(), is(1));
79      }
80  
81      @Test
82      public void testWarningMessage() {
83          String error = "target/compiler-src/testWarning/Foo.java:8: warning: finally clause cannot complete normally"
84                  + EOL + "        finally { return; }"
85                  + EOL + "                          ^"
86                  + EOL;
87  
88          CompilerMessage compilerError = JavacCompiler.parseModernError(0, error);
89  
90          assertThat(compilerError, notNullValue());
91  
92          assertThat(compilerError.isError(), is(false));
93  
94          assertThat(compilerError.getMessage(), is("finally clause cannot complete normally"));
95  
96          assertThat(compilerError.getStartColumn(), is(26));
97  
98          assertThat(compilerError.getEndColumn(), is(27));
99  
100         assertThat(compilerError.getStartLine(), is(8));
101 
102         assertThat(compilerError.getEndLine(), is(8));
103     }
104 
105     @Test
106     public void testErrorMessage() {
107         String error = "Foo.java:7: not a statement" + EOL + "         i;" + EOL + "         ^" + EOL;
108 
109         CompilerMessage compilerError = JavacCompiler.parseModernError(1, error);
110 
111         assertThat(compilerError, notNullValue());
112 
113         assertThat(compilerError.isError(), is(true));
114 
115         assertThat(compilerError.getMessage(), is("not a statement"));
116 
117         assertThat(compilerError.getStartColumn(), is(9));
118 
119         assertThat(compilerError.getEndColumn(), is(11));
120 
121         assertThat(compilerError.getStartLine(), is(7));
122 
123         assertThat(compilerError.getEndLine(), is(7));
124     }
125 
126     @Test
127     public void testUnknownSymbolError() {
128         String error = "./org/codehaus/foo/UnknownSymbol.java:7: cannot find symbol" + EOL + "symbol  : method foo()"
129                 + EOL + "location: class org.codehaus.foo.UnknownSymbol"
130                 + EOL + "        foo();"
131                 + EOL + "        ^"
132                 + EOL;
133 
134         CompilerMessage compilerError = JavacCompiler.parseModernError(1, error);
135 
136         assertThat(compilerError, notNullValue());
137 
138         assertThat(compilerError.isError(), is(true));
139 
140         assertThat(
141                 compilerError.getMessage(),
142                 is("cannot find symbol" + EOL + "symbol  : method foo()" + EOL
143                         + "location: class org.codehaus.foo.UnknownSymbol"));
144 
145         assertThat(compilerError.getStartColumn(), is(8));
146 
147         assertThat(compilerError.getEndColumn(), is(14));
148 
149         assertThat(compilerError.getStartLine(), is(7));
150 
151         assertThat(compilerError.getEndLine(), is(7));
152     }
153 
154     @Test
155     public void testTwoErrors() throws IOException {
156         String errors = "./org/codehaus/foo/ExternalDeps.java:4: package org.apache.commons.lang does not exist" + EOL
157                 + "import org.apache.commons.lang.StringUtils;"
158                 + EOL + "                               ^"
159                 + EOL + "./org/codehaus/foo/ExternalDeps.java:12: cannot find symbol"
160                 + EOL + "symbol  : variable StringUtils"
161                 + EOL + "location: class org.codehaus.foo.ExternalDeps"
162                 + EOL + "          System.out.println( StringUtils.upperCase( str)  );"
163                 + EOL + "                              ^"
164                 + EOL + "2 errors"
165                 + EOL;
166 
167         List<CompilerMessage> messages =
168                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(errors)));
169 
170         assertThat(messages.size(), is(2));
171     }
172 
173     @Test
174     public void testAnotherTwoErrors() throws IOException {
175         String errors = "./org/codehaus/foo/ExternalDeps.java:4: package org.apache.commons.lang does not exist" + EOL
176                 + "import org.apache.commons.lang.StringUtils;"
177                 + EOL + "                               ^"
178                 + EOL + "./org/codehaus/foo/ExternalDeps.java:12: cannot find symbol"
179                 + EOL + "symbol  : variable StringUtils"
180                 + EOL + "location: class org.codehaus.foo.ExternalDeps"
181                 + EOL + "          System.out.println( StringUtils.upperCase( str)  );"
182                 + EOL + "                              ^"
183                 + EOL + "2 errors"
184                 + EOL;
185 
186         List<CompilerMessage> messages =
187                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(errors)));
188 
189         assertThat(messages.size(), is(2));
190     }
191 
192     @Test
193     public void testAssertError() throws IOException {
194         String errors =
195                 "./org/codehaus/foo/ReservedWord.java:5: as of release 1.4, 'assert' is a keyword, and may not be used as an identifier"
196                         + EOL + "(try -source 1.3 or lower to use 'assert' as an identifier)"
197                         + EOL + "        String assert;"
198                         + EOL + "               ^"
199                         + EOL + "1 error"
200                         + EOL;
201 
202         List<CompilerMessage> messages =
203                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(errors)));
204 
205         assertThat(messages.size(), is(1));
206     }
207 
208     @Test
209     public void testLocalizedWarningNotTreatedAsError() throws IOException {
210         String errors =
211                 "./src/main/java/Main.java:9: \u8b66\u544a:[deprecation] java.io.File \u306e toURL() \u306f\u63a8\u5968\u3055\u308c\u307e\u305b\u3093\u3002"
212                         + EOL + "    new File( path ).toURL()"
213                         + EOL + "                    ^"
214                         + EOL + "\u8b66\u544a 1 \u500b"
215                         + EOL;
216 
217         List<CompilerMessage> messages =
218                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(errors)));
219 
220         assertThat(messages.size(), is(1));
221         assertThat(messages.get(0).isError(), is(false));
222     }
223 
224     @Test
225     public void testUnixFileNames() {
226         String error = "/my/prj/src/main/java/test/prj/App.java:11: not a statement" + EOL
227                 + "        System.out.println( \"Hello World!\" );x"
228                 + EOL + "                                             ^"
229                 + EOL;
230 
231         CompilerMessage compilerError = JavacCompiler.parseModernError(1, error);
232 
233         assertThat(
234                 String.valueOf(compilerError), is("/my/prj/src/main/java/test/prj/App.java:[11,45] not a statement"));
235     }
236 
237     @Test
238     public void testWindowsDriveLettersMCOMPILER140() {
239         String error =
240                 "c:\\Documents and Settings\\My Self\\Documents\\prj\\src\\main\\java\\test\\prj\\App.java:11: not a statement"
241                         + EOL + "        System.out.println( \"Hello World!\" );x"
242                         + EOL + "                                             ^"
243                         + EOL;
244 
245         CompilerMessage compilerError = JavacCompiler.parseModernError(1, error);
246 
247         assertThat(
248                 String.valueOf(compilerError),
249                 is(
250                         "c:\\Documents and Settings\\My Self\\Documents\\prj\\src\\main\\java\\test\\prj\\App.java:[11,45] not a statement"));
251     }
252 
253     /**
254      * Test that CRLF is parsed correctly wrt. the filename in warnings.
255      *
256      * @throws Exception
257      */
258     @Test
259     public void testCRLF_windows() throws Exception {
260         // This test is only relevant on windows (test hardcodes EOL)
261         if (!Os.isFamily("windows")) {
262             return;
263         }
264 
265         String CRLF = new String(new byte[] {(byte) 0x0D, (byte) 0x0A});
266         String errors = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + CRLF
267                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpServerImpl.java]]"
268                 + CRLF + "[parsing completed 19ms]"
269                 + CRLF
270                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpServer.java]]"
271                 + CRLF + "[parsing completed 1ms]"
272                 + CRLF
273                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpServerAware.java]]"
274                 + CRLF + "[parsing completed 1ms]"
275                 + CRLF
276                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java]]"
277                 + CRLF + "[parsing completed 3ms]"
278                 + CRLF
279                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpThreadPool.java]]"
280                 + CRLF + "[parsing completed 3ms]"
281                 + CRLF
282                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpQueueAware.java]]"
283                 + CRLF + "[parsing completed 0ms]"
284                 + CRLF
285                 + "[parsing started RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpThreadPoolAware.java]]"
286                 + CRLF + "[parsing completed 1ms]"
287                 + CRLF + "[search path for source files: C:\\commander\\pre\\ec\\ec-http\\src\\main\\java]"
288                 + CRLF
289                 + "[search path for class files: C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\resources.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\rt.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\sunrsasign.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\jsse.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\jce.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\charsets.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\jfr.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\classes,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\dnsns.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\localedata.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\sunec.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\sunjce_provider.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\sunmscapi.jar,C:\\Program Files\\Java\\jdk1.7.0_04\\jre\\lib\\ext\\zipfs.jar,C:\\commander\\pre\\ec\\ec-http\\target\\classes,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-lock\\1.0.0-SNAPSHOT\\ec-lock-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-timer\\1.0.0-SNAPSHOT\\ec-timer-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\org\\apache\\commons\\commons-math\\2.2\\commons-math-2.2.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-validation\\1.0.0-SNAPSHOT\\ec-validation-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-xml\\1.0.0-SNAPSHOT\\ec-xml-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\commons-beanutils\\commons-beanutils\\1.8.3-PATCH1\\commons-beanutils-1.8.3-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\commons-collections\\commons-collections\\3.2.1\\commons-collections-3.2.1.jar,C:\\Users\\anders\\.m2\\repository\\dom4j\\dom4j\\1.6.1-PATCH1\\dom4j-1.6.1-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\javax\\validation\\validation-api\\1.0.0.GA\\validation-api-1.0.0.GA.jar,C:\\Users\\anders\\.m2\\repository\\org\\codehaus\\jackson\\jackson-core-asl\\1.9.7\\jackson-core-asl-1.9.7.jar,C:\\Users\\anders\\.m2\\repository\\org\\codehaus\\jackson\\jackson-mapper-asl\\1.9.7\\jackson-mapper-asl-1.9.7.jar,C:\\Users\\anders\\.m2\\repository\\org\\hibernate\\hibernate-core\\3.6.7-PATCH14\\hibernate-core-3.6.7-PATCH14.jar,C:\\Users\\anders\\.m2\\repository\\antlr\\antlr\\2.7.6\\antlr-2.7.6.jar,C:\\Users\\anders\\.m2\\repository\\org\\hibernate\\hibernate-commons-annotations\\3.2.0.Final\\hibernate-commons-annotations-3.2.0.Final.jar,C:\\Users\\anders\\.m2\\repository\\javax\\transaction\\jta\\1.1\\jta-1.1.jar,C:\\Users\\anders\\.m2\\repository\\org\\hibernate\\javax\\persistence\\hibernate-jpa-2.0-api\\1.0.1.Final\\hibernate-jpa-2.0-api-1.0.1.Final.jar,C:\\Users\\anders\\.m2\\repository\\org\\hyperic\\sigar\\1.6.5.132\\sigar-1.6.5.132.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-context\\3.1.1.RELEASE-PATCH1\\spring-context-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-expression\\3.1.1.RELEASE-PATCH1\\spring-expression-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-core\\3.1.1.RELEASE-PATCH1\\spring-core-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\tanukisoft\\wrapper\\3.5.14\\wrapper-3.5.14.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-log\\1.0.0-SNAPSHOT\\ec-log-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\ch\\qos\\logback\\logback-classic\\1.0.3-PATCH4\\logback-classic-1.0.3-PATCH4.jar,C:\\Users\\anders\\.m2\\repository\\ch\\qos\\logback\\logback-core\\1.0.3-PATCH4\\logback-core-1.0.3-PATCH4.jar,C:\\Users\\anders\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.6.4\\slf4j-api-1.6.4.jar,C:\\Users\\anders\\.m2\\repository\\org\\slf4j\\jul-to-slf4j\\1.6.4\\jul-to-slf4j-1.6.4.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-queue\\1.0.0-SNAPSHOT\\ec-queue-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-security\\1.0.0-SNAPSHOT\\ec-security-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-acl\\1.0.0-SNAPSHOT\\ec-acl-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-transaction\\1.0.0-SNAPSHOT\\ec-transaction-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\org\\aspectj\\aspectjrt\\1.7.0.M1-PATCH1\\aspectjrt-1.7.0.M1-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-crypto\\1.0.0-SNAPSHOT\\ec-crypto-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\org\\bouncycastle\\bcprov-jdk16\\1.46\\bcprov-jdk16-1.46.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-property\\1.0.0-SNAPSHOT\\ec-property-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.1\\commons-lang3-3.1.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-tx\\3.1.1.RELEASE-PATCH1\\spring-tx-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\org\\aopalliance\\com.springsource.org.aopalliance\\1.0.0\\com.springsource.org.aopalliance-1.0.0.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\ldap\\spring-ldap-core\\1.3.1.RELEASE\\spring-ldap-core-1.3.1.RELEASE.jar,C:\\Users\\anders\\.m2\\repository\\commons-lang\\commons-lang\\2.5\\commons-lang-2.5.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\security\\spring-security-core\\2.0.6.PATCH1\\spring-security-core-2.0.6.PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar,C:\\Users\\anders\\.m2\\repository\\cglib\\cglib-nodep\\2.2.2\\cglib-nodep-2.2.2.jar,C:\\Users\\anders\\.m2\\repository\\org\\apache\\commons\\commons-digester3\\3.2-PATCH5\\commons-digester3-3.2-PATCH5.jar,C:\\Users\\anders\\.m2\\repository\\cglib\\cglib\\2.2.2\\cglib-2.2.2.jar,C:\\Users\\anders\\.m2\\repository\\asm\\asm\\3.3.1\\asm-3.3.1.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-aop\\3.1.1.RELEASE-PATCH1\\spring-aop-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\com\\google\\guava\\guava\\12.0\\guava-12.0.jar,C:\\Users\\anders\\.m2\\repository\\com\\google\\code\\findbugs\\jsr305\\2.0.0\\jsr305-2.0.0.jar,C:\\Users\\anders\\.m2\\repository\\com\\intellij\\annotations\\116.108\\annotations-116.108.jar,C:\\Users\\anders\\.m2\\repository\\commons-io\\commons-io\\2.3\\commons-io-2.3.jar,C:\\Users\\anders\\.m2\\repository\\net\\jcip\\jcip-annotations\\1.0\\jcip-annotations-1.0.jar,C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar,C:\\Users\\anders\\.m2\\repository\\commons-codec\\commons-codec\\1.6\\commons-codec-1.6.jar,C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\orbit\\javax.servlet\\3.0.0.v201112011016\\javax.servlet-3.0.0.v201112011016.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-continuation\\8.1.4.v20120524\\jetty-continuation-8.1.4.v20120524.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-http\\8.1.4.v20120524\\jetty-http-8.1.4.v20120524.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-io\\8.1.4.v20120524\\jetty-io-8.1.4.v20120524.jar,C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar,C:\\Users\\anders\\.m2\\repository\\org\\mortbay\\jetty\\servlet-api\\3.0.20100224\\servlet-api-3.0.20100224.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-beans\\3.1.1.RELEASE-PATCH1\\spring-beans-3.1.1.RELEASE-PATCH1.jar,C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-asm\\3.1.1.RELEASE-PATCH1\\spring-asm-3.1.1.RELEASE-PATCH1.jar,.]"
290                 + CRLF
291                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/net/BindException.class)]]"
292                 + CRLF
293                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/ArrayList.class)]]"
294                 + CRLF
295                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/Collection.class)]]"
296                 + CRLF
297                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/Collections.class)]]"
298                 + CRLF
299                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/HashSet.class)]]"
300                 + CRLF
301                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/concurrent/TimeUnit.class)]]"
302                 + CRLF
303                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/Handler.class)]]"
304                 + CRLF
305                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/Server.class)]]"
306                 + CRLF
307                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/nio/SelectChannelConnector.class)]]"
308                 + CRLF
309                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/ssl/SslSelectChannelConnector.class)]]"
310                 + CRLF
311                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/ssl/SslContextFactory.class)]]"
312                 + CRLF
313                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\intellij\\annotations\\116.108\\annotations-116.108.jar(org/jetbrains/annotations/NonNls.class)]]"
314                 + CRLF
315                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\intellij\\annotations\\116.108\\annotations-116.108.jar(org/jetbrains/annotations/NotNull.class)]]"
316                 + CRLF
317                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\intellij\\annotations\\116.108\\annotations-116.108.jar(org/jetbrains/annotations/TestOnly.class)]]"
318                 + CRLF
319                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-beans\\3.1.1.RELEASE-PATCH1\\spring-beans-3.1.1.RELEASE-PATCH1.jar(org/springframework/beans/factory/BeanNameAware.class)]]"
320                 + CRLF
321                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-beans\\3.1.1.RELEASE-PATCH1\\spring-beans-3.1.1.RELEASE-PATCH1.jar(org/springframework/beans/factory/annotation/Autowired.class)]]"
322                 + CRLF
323                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\google\\guava\\guava\\12.0\\guava-12.0.jar(com/google/common/collect/Iterables.class)]]"
324                 + CRLF
325                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-log\\1.0.0-SNAPSHOT\\ec-log-1.0.0-SNAPSHOT.jar(com/electriccloud/log/Log.class)]]"
326                 + CRLF
327                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-log\\1.0.0-SNAPSHOT\\ec-log-1.0.0-SNAPSHOT.jar(com/electriccloud/log/LogFactory.class)]]"
328                 + CRLF
329                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar(com/electriccloud/service/ServiceManager.class)]]"
330                 + CRLF
331                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar(com/electriccloud/service/ServiceState.class)]]"
332                 + CRLF
333                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/ExceptionUtil.class)]]"
334                 + CRLF
335                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/SystemUtil.class)]]"
336                 + CRLF
337                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/ToString.class)]]"
338                 + CRLF
339                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/ToStringSupport.class)]]"
340                 + CRLF
341                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]"
342                 + CRLF
343                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]"
344                 + CRLF
345                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]"
346                 + CRLF
347                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]"
348                 + CRLF
349                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]"
350                 + CRLF
351                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Enum.class)]]"
352                 + CRLF
353                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/ToStringAware.class)]]"
354                 + CRLF
355                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\springframework\\spring-beans\\3.1.1.RELEASE-PATCH1\\spring-beans-3.1.1.RELEASE-PATCH1.jar(org/springframework/beans/factory/Aware.class)]]"
356                 + CRLF
357                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar(com/electriccloud/service/Service.class)]]"
358                 + CRLF
359                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Integer.class)]]"
360                 + CRLF
361                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/concurrent/RejectedExecutionException.class)]]"
362                 + CRLF
363                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/component/AbstractLifeCycle.class)]]"
364                 + CRLF
365                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/thread/ThreadPool.class)]]"
366                 + CRLF
367                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-queue\\1.0.0-SNAPSHOT\\ec-queue-1.0.0-SNAPSHOT.jar(com/electriccloud/queue/ExecuteQueue.class)]]"
368                 + CRLF
369                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar(com/electriccloud/service/ServiceManagerAware.class)]]"
370                 + CRLF
371                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-util\\1.0.0-SNAPSHOT\\ec-util-1.0.0-SNAPSHOT.jar(com/electriccloud/util/ToStringImpl.class)]]"
372                 + CRLF
373                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/component/LifeCycle.class)]]"
374                 + CRLF
375                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/InterruptedException.class)]]"
376                 + CRLF
377                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Runnable.class)]]"
378                 + CRLF
379                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Exception.class)]]"
380                 + CRLF
381                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/io/IOException.class)]]"
382                 + CRLF
383                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/KeyManagementException.class)]]"
384                 + CRLF
385                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/NoSuchAlgorithmException.class)]]"
386                 + CRLF
387                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/SecureRandom.class)]]"
388                 + CRLF
389                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/SSLContext.class)]]"
390                 + CRLF
391                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/TrustManager.class)]]"
392                 + CRLF
393                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/HttpResponse.class)]]"
394                 + CRLF
395                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/HttpClient.class)]]"
396                 + CRLF
397                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/methods/HttpGet.class)]]"
398                 + CRLF
399                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/methods/HttpPost.class)]]"
400                 + CRLF
401                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/methods/HttpUriRequest.class)]]"
402                 + CRLF
403                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/Scheme.class)]]"
404                 + CRLF
405                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/ssl/SSLSocketFactory.class)]]"
406                 + CRLF
407                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/entity/StringEntity.class)]]"
408                 + CRLF
409                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy.class)]]"
410                 + CRLF
411                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/impl/client/DefaultHttpClient.class)]]"
412                 + CRLF
413                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/impl/client/DefaultHttpRequestRetryHandler.class)]]"
414                 + CRLF
415                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.class)]]"
416                 + CRLF
417                 + "C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java:31: warning: [deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"
418                 + CRLF + "import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;"
419                 + CRLF + "                                      ^"
420                 + CRLF
421                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/params/HttpParams.class)]]"
422                 + CRLF
423                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/protocol/HttpContext.class)]]"
424                 + CRLF
425                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/util/EntityUtils.class)]]"
426                 + CRLF
427                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-security\\1.0.0-SNAPSHOT\\ec-security-1.0.0-SNAPSHOT.jar(com/electriccloud/security/DummyX509TrustManager.class)]]"
428                 + CRLF
429                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/SchemeLayeredSocketFactory.class)]]"
430                 + CRLF
431                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/SchemeSocketFactory.class)]]"
432                 + CRLF
433                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/LayeredSchemeSocketFactory.class)]]"
434                 + CRLF
435                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/LayeredSocketFactory.class)]]"
436                 + CRLF
437                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/SocketFactory.class)]]"
438                 + CRLF
439                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/params/CoreConnectionPNames.class)]]"
440                 + CRLF
441                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/SuppressWarnings.class)]]"
442                 + CRLF
443                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Retention.class)]]"
444                 + CRLF
445                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/RetentionPolicy.class)]]"
446                 + CRLF
447                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Target.class)]]"
448                 + CRLF
449                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/ElementType.class)]]"
450                 + CRLF
451                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\google\\guava\\guava\\12.0\\guava-12.0.jar(com/google/common/annotations/GwtCompatible.class)]]"
452                 + CRLF
453                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\google\\guava\\guava\\12.0\\guava-12.0.jar(com/google/common/annotations/GwtIncompatible.class)]]"
454                 + CRLF
455                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\com\\electriccloud\\ec-core\\1.0.0-SNAPSHOT\\ec-core-1.0.0-SNAPSHOT.jar(com/electriccloud/infoset/InfosetType.class)]]"
456                 + CRLF
457                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Annotation.class)]]"
458                 + CRLF
459                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Override.class)]]"
460                 + CRLF + "[checking com.electriccloud.http.HttpServerImpl]"
461                 + CRLF
462                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Error.class)]]"
463                 + CRLF
464                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]]"
465                 + CRLF
466                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/RuntimeException.class)]]"
467                 + CRLF
468                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]"
469                 + CRLF
470                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Class.class)]]"
471                 + CRLF
472                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Number.class)]]"
473                 + CRLF
474                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/AbstractList.class)]]"
475                 + CRLF
476                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/AbstractCollection.class)]]"
477                 + CRLF
478                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Iterable.class)]]"
479                 + CRLF
480                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Byte.class)]]"
481                 + CRLF
482                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Character.class)]]"
483                 + CRLF
484                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Short.class)]]"
485                 + CRLF
486                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/nio/AbstractNIOConnector.class)]]"
487                 + CRLF
488                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/AbstractConnector.class)]]"
489                 + CRLF
490                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/component/AggregateLifeCycle.class)]]"
491                 + CRLF
492                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/Connector.class)]]"
493                 + CRLF
494                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/component/Destroyable.class)]]"
495                 + CRLF
496                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-util\\8.1.4.v20120524\\jetty-util-8.1.4.v20120524.jar(org/eclipse/jetty/util/component/Dumpable.class)]]"
497                 + CRLF
498                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-http\\8.1.4.v20120524\\jetty-http-8.1.4.v20120524.jar(org/eclipse/jetty/http/HttpBuffers.class)]]"
499                 + CRLF
500                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/handler/HandlerWrapper.class)]]"
501                 + CRLF
502                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/handler/AbstractHandlerContainer.class)]]"
503                 + CRLF
504                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\eclipse\\jetty\\jetty-server\\8.1.4.v20120524\\jetty-server-8.1.4.v20120524.jar(org/eclipse/jetty/server/handler/AbstractHandler.class)]]"
505                 + CRLF
506                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/net/SocketException.class)]]"
507                 + CRLF
508                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Thread.class)]]"
509                 + CRLF
510                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/IllegalStateException.class)]]"
511                 + CRLF
512                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/AbstractSet.class)]]"
513                 + CRLF
514                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/Iterator.class)]]"
515                 + CRLF
516                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/IllegalArgumentException.class)]]"
517                 + CRLF
518                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/Locale.class)]]"
519                 + CRLF
520                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Long.class)]]"
521                 + CRLF
522                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Float.class)]]"
523                 + CRLF
524                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Double.class)]]"
525                 + CRLF
526                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Boolean.class)]]"
527                 + CRLF
528                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/Void.class)]]"
529                 + CRLF
530                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/AssertionError.class)]]"
531                 + CRLF
532                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpServerImpl.class]]"
533                 + CRLF + "[checking com.electriccloud.http.HttpServer]"
534                 + CRLF
535                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpServer.class]]"
536                 + CRLF + "[checking com.electriccloud.http.HttpThreadPoolAware]"
537                 + CRLF
538                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpThreadPoolAware.class]]"
539                 + CRLF + "[checking com.electriccloud.http.HttpThreadPool]"
540                 + CRLF
541                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/concurrent/Future.class)]]"
542                 + CRLF
543                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/concurrent/Callable.class)]]"
544                 + CRLF
545                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/util/Date.class)]]"
546                 + CRLF
547                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpThreadPool.class]]"
548                 + CRLF + "[checking com.electriccloud.http.HttpQueueAware]"
549                 + CRLF
550                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpQueueAware.class]]"
551                 + CRLF + "[checking com.electriccloud.http.HttpServerAware]"
552                 + CRLF
553                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpServerAware.class]]"
554                 + CRLF + "[checking com.electriccloud.http.HttpUtil]"
555                 + CRLF
556                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/net/URI.class)]]"
557                 + CRLF
558                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/methods/HttpRequestBase.class)]]"
559                 + CRLF
560                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/message/AbstractHttpMessage.class)]]"
561                 + CRLF
562                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/HttpMessage.class)]]"
563                 + CRLF
564                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/impl/client/AbstractHttpClient.class)]]"
565                 + CRLF
566                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/annotation/GuardedBy.class)]]"
567                 + CRLF
568                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/ResponseHandler.class)]]"
569                 + CRLF
570                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/ClientProtocolException.class)]]"
571                 + CRLF
572                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/HttpEntity.class)]]"
573                 + CRLF
574                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/methods/HttpEntityEnclosingRequestBase.class)]]"
575                 + CRLF
576                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/entity/AbstractHttpEntity.class)]]"
577                 + CRLF
578                 + "C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java:151: warning: [deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"
579                 + CRLF + "        ThreadSafeClientConnManager connectionManager ="
580                 + CRLF + "        ^"
581                 + CRLF
582                 + "C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java:152: warning: [deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"
583                 + CRLF + "            new ThreadSafeClientConnManager();"
584                 + CRLF + "                ^"
585                 + CRLF
586                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/GeneralSecurityException.class)]]"
587                 + CRLF
588                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/X509TrustManager.class)]]"
589                 + CRLF
590                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/KeyException.class)]]"
591                 + CRLF
592                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/ssl/X509HostnameVerifier.class)]]"
593                 + CRLF
594                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/SSLSocketFactory.class)]]"
595                 + CRLF
596                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/HostNameResolver.class)]]"
597                 + CRLF
598                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/HostnameVerifier.class)]]"
599                 + CRLF
600                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/ssl/TrustStrategy.class)]]"
601                 + CRLF
602                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/security/KeyStore.class)]]"
603                 + CRLF
604                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/scheme/SchemeRegistry.class)]]"
605                 + CRLF
606                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/ClientConnectionManager.class)]]"
607                 + CRLF
608                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/client/HttpRequestRetryHandler.class)]]"
609                 + CRLF
610                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpclient\\4.2\\httpclient-4.2.jar(org/apache/http/conn/ConnectionKeepAliveStrategy.class)]]"
611                 + CRLF
612                 + "[loading ZipFileIndexFileObject[C:\\Users\\anders\\.m2\\repository\\org\\apache\\httpcomponents\\httpcore\\4.2\\httpcore-4.2.jar(org/apache/http/ParseException.class)]]"
613                 + CRLF
614                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/io/UnsupportedEncodingException.class)]]"
615                 + CRLF
616                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpUtil$1.class]]"
617                 + CRLF
618                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/StringBuilder.class)]]"
619                 + CRLF
620                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/AbstractStringBuilder.class)]]"
621                 + CRLF
622                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]]"
623                 + CRLF
624                 + "[loading ZipFileIndexFileObject[C:\\Program Files\\Java\\jdk1.7.0_04\\lib\\ct.sym(META-INF/sym/rt.jar/javax/net/ssl/KeyManager.class)]]"
625                 + CRLF
626                 + "[wrote RegularFileObject[C:\\commander\\pre\\ec\\ec-http\\target\\classes\\com\\electriccloud\\http\\HttpUtil.class]]"
627                 + CRLF + "[total 654ms]"
628                 + CRLF + "4 warnings"
629                 + CRLF;
630         List<CompilerMessage> compilerMessages =
631                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(errors)));
632         assertThat("count", compilerMessages.size(), is(187));
633         List<CompilerMessage> compilerErrors = new ArrayList<>(3);
634         for (CompilerMessage message : compilerMessages) {
635             if (message.getKind() != CompilerMessage.Kind.OTHER) {
636                 compilerErrors.add(message);
637             }
638         }
639 
640         assertEquivalent(
641                 new CompilerMessage(
642                         "[options] bootstrap class path not set in conjunction with -source " + "1.6",
643                         CompilerMessage.Kind.WARNING),
644                 compilerErrors.get(0));
645         CompilerMessage error1 = compilerErrors.get(1);
646         assertThat(
647                 "file",
648                 error1.getFile(),
649                 is("C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java"));
650         assertThat(
651                 "message",
652                 error1.getMessage(),
653                 is("[deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"));
654         assertThat("line", error1.getStartLine(), is(31));
655         assertThat("column", error1.getStartColumn(), is(38));
656         CompilerMessage error2 = compilerErrors.get(2);
657         assertThat(
658                 "file",
659                 error2.getFile(),
660                 is("C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java"));
661         assertThat(
662                 "message",
663                 error2.getMessage(),
664                 is("[deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"));
665         assertThat("line", error2.getStartLine(), is(151));
666         assertThat("column", error2.getStartColumn(), is(8));
667         CompilerMessage error3 = compilerErrors.get(3);
668         assertThat(
669                 "file",
670                 error3.getFile(),
671                 is("C:\\commander\\pre\\ec\\ec-http\\src\\main\\java\\com\\electriccloud\\http\\HttpUtil.java"));
672         assertThat(
673                 "message",
674                 error3.getMessage(),
675                 is("[deprecation] ThreadSafeClientConnManager in org.apache.http.impl.conn.tsccm has been deprecated"));
676         assertThat("line", error3.getStartLine(), is(152));
677         assertThat("column", error3.getStartColumn(), is(16));
678     }
679 
680     @Test
681     public void testJava6Error() throws Exception {
682         String out = "Error.java:3: cannot find symbol" + EOL + "symbol  : class Properties"
683                 + EOL + "location: class Error"
684                 + EOL + "                Properties p = new Properties();"
685                 + EOL + "                ^"
686                 + EOL + "Error.java:3: cannot find symbol"
687                 + EOL + "symbol  : class Properties"
688                 + EOL + "location: class Error"
689                 + EOL + "                Properties p = new Properties();"
690                 + EOL + "                                   ^"
691                 + EOL + "2 errors";
692 
693         List<CompilerMessage> compilerErrors =
694                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(out)));
695 
696         assertThat(compilerErrors, notNullValue());
697 
698         CompilerMessage message1 = compilerErrors.get(0);
699 
700         assertThat(message1.isError(), is(true));
701 
702         assertThat(
703                 message1.getMessage(),
704                 is("cannot find symbol" + EOL + "symbol  : class Properties" + EOL + "location: class Error"));
705 
706         assertThat(message1.getStartColumn(), is(16));
707 
708         assertThat(message1.getEndColumn(), is(26));
709 
710         assertThat(message1.getStartLine(), is(3));
711 
712         assertThat(message1.getEndLine(), is(3));
713 
714         CompilerMessage message2 = compilerErrors.get(1);
715 
716         assertThat(message2.isError(), is(true));
717 
718         assertThat(
719                 message2.getMessage(),
720                 is("cannot find symbol" + EOL + "symbol  : class Properties" + EOL + "location: class Error"));
721 
722         assertThat(message2.getStartColumn(), is(35));
723 
724         assertThat(message2.getEndColumn(), is(48));
725 
726         assertThat(message2.getStartLine(), is(3));
727 
728         assertThat(message2.getEndLine(), is(3));
729     }
730 
731     @Test
732     public void testJava7Error() throws Exception {
733         String out =
734                 "Error.java:3: error: cannot find symbol" + EOL + "                Properties p = new Properties();"
735                         + EOL + "                ^"
736                         + EOL + "  symbol:   class Properties"
737                         + EOL + "  location: class Error"
738                         + EOL + "Error.java:3: error: cannot find symbol"
739                         + EOL + "                Properties p = new Properties();"
740                         + EOL + "                                   ^"
741                         + EOL + "  symbol:   class Properties"
742                         + EOL + "  location: class Error"
743                         + EOL + "2 errors";
744 
745         List<CompilerMessage> compilerErrors =
746                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(out)));
747 
748         assertThat(compilerErrors, notNullValue());
749 
750         CompilerMessage message1 = compilerErrors.get(0);
751 
752         assertThat(message1.isError(), is(true));
753 
754         assertThat(
755                 message1.getMessage(),
756                 is("cannot find symbol" + EOL + "  symbol:   class Properties" + EOL + "  location: class Error"));
757 
758         assertThat(message1.getStartColumn(), is(16));
759 
760         assertThat(message1.getEndColumn(), is(26));
761 
762         assertThat(message1.getStartLine(), is(3));
763 
764         assertThat(message1.getEndLine(), is(3));
765 
766         CompilerMessage message2 = compilerErrors.get(1);
767 
768         assertThat(message2.isError(), is(true));
769 
770         assertThat(
771                 message2.getMessage(),
772                 is("cannot find symbol" + EOL + "  symbol:   class Properties" + EOL + "  location: class Error"));
773 
774         assertThat(message2.getStartColumn(), is(35));
775 
776         assertThat(message2.getEndColumn(), is(48));
777 
778         assertThat(message2.getStartLine(), is(3));
779 
780         assertThat(message2.getEndLine(), is(3));
781     }
782 
783     @ParameterizedTest(name = "{0}")
784     @MethodSource("testStackTraceWithUnknownHeader_args")
785     public void testStackTraceWithUnknownHeader(String scenario, String stackTraceHeader) throws Exception {
786         String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTraceInternalCompilerError;
787 
788         List<CompilerMessage> compilerMessages =
789                 JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
790 
791         assertThat(compilerMessages, notNullValue());
792         assertThat(compilerMessages, hasSize(1));
793 
794         String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
795         // Parser retains neither unidentified log lines nor slightly modified stack trace header
796         assertThat(message, not(containsString(UNIDENTIFIED_LOG_LINES)));
797         assertThat(message, not(containsString(stackTraceHeader)));
798         // Parser returns stack strace without any preceding lines
799         assertThat(message, startsWith(stackTraceInternalCompilerError));
800     }
801 
802     private static Stream<Arguments> testStackTraceWithUnknownHeader_args() {
803         return Stream.of(
804                 Arguments.of(
805                         "modified compiler error header",
806                         FILE_A_BUG_ERROR_HEADERS[0].replaceAll("\\{0\\}", "21").replaceAll("bug", "beetle")),
807                 Arguments.of(
808                         "modified annotation processor error header",
809                         ANNOTATION_PROCESSING_ERROR_HEADERS[0].replaceAll("uncaught", "undandled")),
810                 Arguments.of(
811                         "modified out of resources error header",
812                         SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0].replaceAll("resources", "memory")),
813                 Arguments.of("modified I/O error header", IO_ERROR_HEADERS[0].replaceAll("input/output", "I/O")),
814                 Arguments.of(
815                         "modified plugin error header", PLUGIN_ERROR_HEADERS[0].replaceAll("uncaught", "unhandled")));
816     }
817 
818     @ParameterizedTest(name = "{0}")
819     @MethodSource("testBugParade_args")
820     public void testBugParade(String jdkAndLocale, String stackTraceHeader) throws Exception {
821         String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTraceInternalCompilerError;
822 
823         List<CompilerMessage> compilerMessages =
824                 JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
825 
826         assertThat(compilerMessages, notNullValue());
827         assertThat(compilerMessages, hasSize(1));
828 
829         String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
830         // Parser retains stack trace header
831         assertThat(message, startsWith(stackTraceHeader));
832         assertThat(message, endsWith(stackTraceInternalCompilerError));
833     }
834 
835     private static final String stackTraceInternalCompilerError =
836             "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.util.Optional not found\n"
837                     + "\tat com.sun.tools.javac.comp.MemberEnter.baseEnv(MemberEnter.java:1388)\n"
838                     + "\tat com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:1046)\n"
839                     + "\tat com.sun.tools.javac.code.Symbol.complete(Symbol.java:574)\n"
840                     + "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1037)\n"
841                     + "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:973)\n"
842                     + "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.getKind(Symbol.java:1101)\n"
843                     + "\tat com.sun.tools.javac.code.Kinds.kindName(Kinds.java:162)\n"
844                     + "\tat com.sun.tools.javac.comp.Check.duplicateError(Check.java:329)\n"
845                     + "\tat com.sun.tools.javac.comp.Check.checkUnique(Check.java:3435)\n"
846                     + "\tat com.sun.tools.javac.comp.Enter.visitTypeParameter(Enter.java:454)\n"
847                     + "\tat com.sun.tools.javac.tree.JCTree$JCTypeParameter.accept(JCTree.java:2224)\n"
848                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
849                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
850                     + "\tat com.sun.tools.javac.comp.Enter.visitClassDef(Enter.java:418)\n"
851                     + "\tat com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:693)\n"
852                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
853                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
854                     + "\tat com.sun.tools.javac.comp.Enter.visitTopLevel(Enter.java:334)\n"
855                     + "\tat com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:518)\n"
856                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
857                     + "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
858                     + "\tat com.sun.tools.javac.comp.Enter.complete(Enter.java:486)\n"
859                     + "\tat com.sun.tools.javac.comp.Enter.main(Enter.java:471)\n"
860                     + "\tat com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:982)\n"
861                     + "\tat com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)\n"
862                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:523)\n"
863                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
864                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
865                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
866                     + "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
867                     + "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
868 
869     private static Stream<Arguments> testBugParade_args() {
870         return Stream.of(
871                 Arguments.of("JDK 8 English", FILE_A_BUG_ERROR_HEADERS[0].replaceFirst("\\{0\\}", "21")),
872                 Arguments.of("JDK 8 Japanese", FILE_A_BUG_ERROR_HEADERS[1].replaceFirst("\\{0\\}", "21")),
873                 Arguments.of("JDK 8 Chinese", FILE_A_BUG_ERROR_HEADERS[2].replaceFirst("\\{0\\}", "21")),
874                 Arguments.of("JDK 9 English", FILE_A_BUG_ERROR_HEADERS[3].replaceFirst("\\{0\\}", "21")),
875                 Arguments.of("JDK 9 Japanese", FILE_A_BUG_ERROR_HEADERS[4].replaceFirst("\\{0\\}", "21")),
876                 Arguments.of("JDK 9 Chinese", FILE_A_BUG_ERROR_HEADERS[5].replaceFirst("\\{0\\}", "21")),
877                 Arguments.of("JDK 21 English", FILE_A_BUG_ERROR_HEADERS[6].replaceFirst("\\{0\\}", "21")),
878                 Arguments.of("JDK 21 Japanese", FILE_A_BUG_ERROR_HEADERS[7].replaceFirst("\\{0\\}", "21")),
879                 Arguments.of("JDK 21 Chinese", FILE_A_BUG_ERROR_HEADERS[8].replaceFirst("\\{0\\}", "21")),
880                 Arguments.of("JDK 21 German", FILE_A_BUG_ERROR_HEADERS[9].replaceFirst("\\{0\\}", "21")));
881     }
882 
883     @ParameterizedTest(name = "{0}")
884     @MethodSource("testSystemOutOfResourcesError_args")
885     public void testSystemOutOfResourcesError(String jdkAndLocale, String stackTraceHeader) throws Exception {
886         String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTraceSystemOutOfResourcesError;
887 
888         List<CompilerMessage> compilerMessages =
889                 JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
890 
891         assertThat(compilerMessages, notNullValue());
892         assertThat(compilerMessages, hasSize(1));
893 
894         String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
895         // Parser retains stack trace header
896         assertThat(message, startsWith(stackTraceHeader));
897         assertThat(message, endsWith(stackTraceSystemOutOfResourcesError));
898     }
899 
900     private static final String stackTraceSystemOutOfResourcesError =
901             "java.lang.OutOfMemoryError: GC overhead limit exceeded\n"
902                     + "\tat com.sun.tools.javac.util.List.of(List.java:135)\n"
903                     + "\tat com.sun.tools.javac.util.ListBuffer.append(ListBuffer.java:129)\n"
904                     + "\tat com.sun.tools.javac.parser.JavacParser.variableDeclaratorsRest(JavacParser.java:3006)\n"
905                     + "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceBodyDeclaration(JavacParser.java:3537)\n"
906                     + "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceBody(JavacParser.java:3436)\n"
907                     + "\tat com.sun.tools.javac.parser.JavacParser.classDeclaration(JavacParser.java:3285)\n"
908                     + "\tat com.sun.tools.javac.parser.JavacParser.classOrInterfaceOrEnumDeclaration(JavacParser.java:3226)\n"
909                     + "\tat com.sun.tools.javac.parser.JavacParser.typeDeclaration(JavacParser.java:3215)\n"
910                     + "\tat com.sun.tools.javac.parser.JavacParser.parseCompilationUnit(JavacParser.java:3155)\n"
911                     + "\tat com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:628)\n"
912                     + "\tat com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:665)\n"
913                     + "\tat com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:950)\n"
914                     + "\tat com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)\n"
915                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:523)\n"
916                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
917                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
918                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
919                     + "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
920                     + "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
921 
922     private static Stream<Arguments> testSystemOutOfResourcesError_args() {
923         return Stream.of(
924                 Arguments.of("JDK 8 English", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[0]),
925                 Arguments.of("JDK 8 Japanese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[1]),
926                 Arguments.of("JDK 8 Chinese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[2]),
927                 Arguments.of("JDK 21 English", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[3]),
928                 Arguments.of("JDK 21 Japanese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[4]),
929                 Arguments.of("JDK 21 Chinese", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[5]),
930                 Arguments.of("JDK 21 German", SYSTEM_OUT_OF_RESOURCES_ERROR_HEADERS[6]));
931     }
932 
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 
980     @ParameterizedTest(name = "{0}")
981     @MethodSource("testPluginError_args")
982     public void testPluginError(String jdkAndLocale, String stackTraceHeader) throws Exception {
983         String stackTraceWithHeader = UNIDENTIFIED_LOG_LINES + stackTraceHeader + stackTracePluginError;
984 
985         List<CompilerMessage> compilerMessages =
986                 JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
987 
988         assertThat(compilerMessages, notNullValue());
989         assertThat(compilerMessages, hasSize(1));
990 
991         String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
992         // Parser retains stack trace header
993         assertThat(message, startsWith(stackTraceHeader));
994         assertThat(message, endsWith(stackTracePluginError));
995     }
996 
997     private static final String stackTracePluginError =
998             "A plugin threw an uncaught exception.\n" + "Consult the following stack trace for details.\n"
999                     + "java.lang.NoSuchMethodError: com.sun.tools.javac.util.JavacMessages.add(Lcom/sun/tools/javac/util/JavacMessages$ResourceBundleHelper;)V\n"
1000                     + "\tat com.google.errorprone.BaseErrorProneJavaCompiler.setupMessageBundle(BaseErrorProneJavaCompiler.java:202)\n"
1001                     + "\tat com.google.errorprone.ErrorProneJavacPlugin.init(ErrorProneJavacPlugin.java:40)\n"
1002                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:470)\n"
1003                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
1004                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
1005                     + "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
1006                     + "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
1007                     + "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
1008 
1009     private static Stream<Arguments> testPluginError_args() {
1010         return Stream.of(
1011                 Arguments.of("JDK 8 English", PLUGIN_ERROR_HEADERS[0]),
1012                 Arguments.of("JDK 8 Japanese", PLUGIN_ERROR_HEADERS[1]),
1013                 Arguments.of("JDK 8 Chinese", PLUGIN_ERROR_HEADERS[2]),
1014                 Arguments.of("JDK 21 English", PLUGIN_ERROR_HEADERS[3]),
1015                 Arguments.of("JDK 21 Japanese", PLUGIN_ERROR_HEADERS[4]),
1016                 Arguments.of("JDK 21 Chinese", PLUGIN_ERROR_HEADERS[5]),
1017                 Arguments.of("JDK 21 German", PLUGIN_ERROR_HEADERS[6]));
1018     }
1019 
1020     @Test
1021     public void testNonAnchoredWarning() throws IOException {
1022         final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL
1023                 + "1 warning" + EOL;
1024 
1025         final List<CompilerMessage> compilerErrors =
1026                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(error)));
1027 
1028         assertThat(compilerErrors, notNullValue());
1029         assertThat(compilerErrors.size(), is(1));
1030         assertEquivalent(
1031                 new CompilerMessage(
1032                         "[options] bootstrap class path not set in conjunction with -source 1.6",
1033                         CompilerMessage.Kind.WARNING),
1034                 compilerErrors.get(0));
1035     }
1036 
1037     @Test
1038     public void testAnchoredWarning() throws IOException {
1039         final String error = "C:\\repo\\src\\it\\includes-output-when-compiler-forked\\src\\main"
1040                 + "\\java\\MyClass.java:23: warning: [divzero] division by zero"
1041                 + EOL + "      System.out.println(1/0);"
1042                 + EOL + "                           ^"
1043                 + EOL + "1 warnings"
1044                 + EOL;
1045 
1046         final List<CompilerMessage> compilerErrors =
1047                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(error)));
1048 
1049         assertThat(compilerErrors, notNullValue());
1050         assertThat(compilerErrors.size(), is(1));
1051         assertEquivalent(
1052                 new CompilerMessage(
1053                         "C:\\repo\\src\\it\\includes-output-when-compiler-forked\\src\\main\\java\\MyClass" + ".java",
1054                         CompilerMessage.Kind.WARNING,
1055                         23,
1056                         27,
1057                         23,
1058                         30,
1059                         "[divzero] division by zero"),
1060                 compilerErrors.get(0));
1061     }
1062 
1063     @Test
1064     public void testMixedWarnings() throws IOException {
1065         final String error = "warning: [options] bootstrap class path not set in conjunction with -source 1.6" + EOL
1066                 + "C:\\repo\\src\\it\\includes-output-when-compiler-forked\\src\\main\\java"
1067                 + "\\MyClass.java:23: warning: [divzero] division by zero"
1068                 + EOL + "      System.out.println(1/0);"
1069                 + EOL + "                           ^"
1070                 + EOL + "2 warnings";
1071 
1072         final List<CompilerMessage> compilerErrors =
1073                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(error)));
1074 
1075         assertThat(compilerErrors, notNullValue());
1076         assertThat(compilerErrors.size(), is(2));
1077         assertEquivalent(
1078                 new CompilerMessage(
1079                         "[options] bootstrap class path not set in conjunction with -source 1.6",
1080                         CompilerMessage.Kind.WARNING),
1081                 compilerErrors.get(0));
1082         assertEquivalent(
1083                 new CompilerMessage(
1084                         "C:\\repo\\src\\it\\includes-output-when-compiler-forked\\src\\main\\java\\MyClass" + ".java",
1085                         CompilerMessage.Kind.WARNING,
1086                         23,
1087                         27,
1088                         23,
1089                         30,
1090                         "[divzero] division by zero"),
1091                 compilerErrors.get(1));
1092     }
1093 
1094     @Test
1095     public void testIssue37() throws IOException {
1096         String error =
1097                 "warning: [path] bad path element \"d:\\maven_repo\\.m2\\repository\\org\\ow2\\asm\\asm-xml\\5.0.3\\asm-5.0.3.jar\": no such file or directory"
1098                         + EOL
1099                         + "warning: [path] bad path element \"d:\\maven_repo\\.m2\\repository\\org\\ow2\\asm\\asm-xml\\5.0.3\\asm-util-5.0.3.jar\": no such file or directory"
1100                         + EOL + "warning: [options] bootstrap class path not set in conjunction with -source 1.7"
1101                         + EOL + "3 warnings"
1102                         + EOL
1103                         + "An exception has occurred in the compiler (9). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you."
1104                         + EOL + "java.lang.NullPointerException"
1105                         + EOL + "\tat jdk.zipfs/jdk.nio.zipfs.JarFileSystem.getVersionMap(JarFileSystem.java:137)"
1106                         + EOL
1107                         + "\tat jdk.zipfs/jdk.nio.zipfs.JarFileSystem.createVersionedLinks(JarFileSystem.java:112)"
1108                         + EOL + "\tat jdk.zipfs/jdk.nio.zipfs.JarFileSystem.<init>(JarFileSystem.java:85)"
1109                         + EOL
1110                         + "\tat jdk.zipfs/jdk.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:134)"
1111                         + EOL
1112                         + "\tat jdk.compiler/com.sun.tools.javac.file.JavacFileManager$ArchiveContainer.<init>(JavacFileManager.java:517)"
1113                         + EOL
1114                         + "\tat jdk.compiler/com.sun.tools.javac.file.JavacFileManager.getContainer(JavacFileManager.java:319)"
1115                         + EOL
1116                         + "\tat jdk.compiler/com.sun.tools.javac.file.JavacFileManager.list(JavacFileManager.java:715)"
1117                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.code.ClassFinder.list(ClassFinder.java:722)"
1118                         + EOL
1119                         + "\tat jdk.compiler/com.sun.tools.javac.code.ClassFinder.scanUserPaths(ClassFinder.java:655)"
1120                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:526)"
1121                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:293)"
1122                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:633)"
1123                         + EOL
1124                         + "\tat jdk.compiler/com.sun.tools.javac.code.Symbol$PackageSymbol.members(Symbol.java:1120)"
1125                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.code.Symtab.listPackageModules(Symtab.java:810)"
1126                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.comp.Enter.visitTopLevel(Enter.java:344)"
1127                         + EOL
1128                         + "\tat jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:529)"
1129                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.comp.Enter.classEnter(Enter.java:285)"
1130                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.comp.Enter.classEnter(Enter.java:300)"
1131                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.comp.Enter.complete(Enter.java:570)"
1132                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.comp.Enter.main(Enter.java:554)"
1133                         + EOL
1134                         + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:1052)"
1135                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:923)"
1136                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:302)"
1137                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:162)"
1138                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)"
1139                         + EOL + "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)";
1140 
1141         List<CompilerMessage> compilerErrors =
1142                 JavacCompiler.parseModernStream(0, new BufferedReader(new StringReader(error)));
1143 
1144         assertThat(compilerErrors, notNullValue());
1145         assertThat(compilerErrors.size(), is(4));
1146 
1147         assertEquivalent(
1148                 new CompilerMessage(
1149                         "[path] bad path element \"d:\\maven_repo\\"
1150                                 + ".m2\\repository\\org\\ow2\\asm\\asm-xml\\5.0.3\\asm-5.0.3.jar\": no such file or directory",
1151                         CompilerMessage.Kind.WARNING),
1152                 compilerErrors.get(0));
1153         assertEquivalent(
1154                 new CompilerMessage(
1155                         "warning: [path] bad path element \"d:\\maven_repo\\.m2\\repository\\org\\ow2\\asm\\asm-xml\\5.0.3\\asm-util-5.0.3.jar\": no such file or directory",
1156                         CompilerMessage.Kind.WARNING),
1157                 compilerErrors.get(1));
1158         assertEquivalent(
1159                 new CompilerMessage(
1160                         "[options] bootstrap class path not set in conjunction with -source 1.7",
1161                         CompilerMessage.Kind.WARNING),
1162                 compilerErrors.get(2));
1163 
1164         CompilerMessage finalMessage = compilerErrors.get(3);
1165         assertThat(finalMessage.getKind(), is(CompilerMessage.Kind.ERROR));
1166         assertThat(
1167                 "Starts correctly", finalMessage.getMessage(), startsWith("An exception has occurred in the compiler"));
1168         assertThat(
1169                 "continues through end of output",
1170                 finalMessage.getMessage(),
1171                 endsWith("\tat jdk.compiler/com.sun" + ".tools.javac.Main.main(Main.java:43)" + EOL));
1172     }
1173 
1174     @Test
1175     public void testJvmBootLayerInitializationError() throws Exception {
1176         String out = "Error occurred during initialization of boot layer\n"
1177                 + "java.lang.module.FindException: Module java.xml.bind not found";
1178 
1179         List<CompilerMessage> compilerErrors =
1180                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(UNIDENTIFIED_LOG_LINES + out)));
1181 
1182         assertThat(compilerErrors, notNullValue());
1183         assertThat(compilerErrors.size(), is(1));
1184         assertThat(compilerErrors.get(0).getKind(), is(CompilerMessage.Kind.ERROR));
1185         assertThat(compilerErrors.get(0).getMessage().replaceAll(EOL, "\n"), startsWith(out));
1186     }
1187 
1188     @Test
1189     public void testJvmInitializationError() throws Exception {
1190         String out = "Error occurred during initialization of VM\n"
1191                 + "Initial heap size set to a larger value than the maximum heap size";
1192 
1193         List<CompilerMessage> compilerErrors =
1194                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(UNIDENTIFIED_LOG_LINES + out)));
1195 
1196         assertThat(compilerErrors, notNullValue());
1197         assertThat(compilerErrors.size(), is(1));
1198         assertThat(compilerErrors.get(0).getKind(), is(CompilerMessage.Kind.ERROR));
1199         assertThat(compilerErrors.get(0).getMessage().replaceAll(EOL, "\n"), startsWith(out));
1200     }
1201 
1202     @Test
1203     public void testBadSourceFileError() throws Exception {
1204         String out = "/MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls1.java:12: error: cannot access Cls2\n"
1205                 + "    Cls2 tvar;\n"
1206                 + "    ^\n"
1207                 + "  bad source file: /MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls2.java\n"
1208                 + "    file does not contain class ch.pecunifex.x.Cls2\n"
1209                 + "    Please remove or make sure it appears in the correct subdirectory of the sourcepath.";
1210 
1211         List<CompilerMessage> compilerErrors =
1212                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(out)));
1213 
1214         assertThat(compilerErrors, notNullValue());
1215 
1216         assertThat(compilerErrors.size(), is(1));
1217 
1218         CompilerMessage message = compilerErrors.get(0);
1219         validateBadSourceFile(message);
1220     }
1221 
1222     @Test
1223     public void testWarningFollowedByBadSourceFileError() throws Exception {
1224         String out =
1225                 "/MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls1.java:3: warning: FontDesignMetrics is internal proprietary API and may be removed in a future release\n"
1226                         + "import sun.font.FontDesignMetrics;\n"
1227                         + "               ^\n"
1228                         + "/MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls1.java:12: error: cannot access Cls2\n"
1229                         + "    Cls2 tvar;\n"
1230                         + "    ^\n"
1231                         + "  bad source file: /MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls2.java\n"
1232                         + "    file does not contain class ch.pecunifex.x.Cls2\n"
1233                         + "    Please remove or make sure it appears in the correct subdirectory of the sourcepath.";
1234 
1235         List<CompilerMessage> compilerErrors =
1236                 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(out)));
1237 
1238         assertThat(compilerErrors, notNullValue());
1239 
1240         assertThat(compilerErrors, hasSize(2));
1241 
1242         CompilerMessage firstMessage = compilerErrors.get(0);
1243         assertThat("Is a Warning", firstMessage.getKind(), is(CompilerMessage.Kind.WARNING));
1244         assertThat(
1245                 "On Correct File",
1246                 firstMessage.getFile(),
1247                 is("/MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls1.java"));
1248         assertThat(
1249                 "Internal API Warning",
1250                 firstMessage.getMessage(),
1251                 is("FontDesignMetrics is internal proprietary API and may be removed in a future release"));
1252 
1253         CompilerMessage secondMessage = compilerErrors.get(1);
1254         validateBadSourceFile(secondMessage);
1255     }
1256 
1257     private void validateBadSourceFile(CompilerMessage message) {
1258         assertThat("Is an Error", message.getKind(), is(CompilerMessage.Kind.ERROR));
1259         assertThat("On Correct File", message.getFile(), is("/MTOOLCHAINS-19/src/main/java/ch/pecunifex/x/Cls1.java"));
1260         assertThat("Message starts with access Error", message.getMessage(), startsWith("cannot access Cls2"));
1261     }
1262 
1263     private static void assertEquivalent(CompilerMessage expected, CompilerMessage actual) {
1264         assertThat("Message did not match", actual.getMessage(), is(expected.getMessage()));
1265         assertThat("Kind did not match", actual.getKind(), is(expected.getKind()));
1266         assertThat("File did not match", actual.getFile(), is(expected.getFile()));
1267         assertThat("Start line did not match", actual.getStartLine(), is(expected.getStartLine()));
1268         assertThat("Start column did not match", actual.getStartColumn(), is(expected.getStartColumn()));
1269         assertThat("End line did not match", actual.getEndLine(), is(expected.getEndLine()));
1270         assertThat("End column did not match", actual.getEndColumn(), is(expected.getEndColumn()));
1271     }
1272 }