/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2010 Oracle and/or its affiliates. All rights reserved. * * Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common * Development and Distribution License("CDDL") (collectively, the * "License"). You may not use this file except in compliance with the * License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the * specific language governing permissions and limitations under the * License. When distributing the software, include this License Header * Notice in each file and include the License file at * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the * License Header, with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * If you wish your version of this file to be governed by only the CDDL * or only the GPL Version 2, indicate your decision by adding * "[Contributor] elects to include this software in this distribution * under the [CDDL or GPL Version 2] license." If you do not indicate a * single choice of license, a recipient has the option to distribute * your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. * * Contributor(s): * * Portions Copyrighted 2008 Sun Microsystems, Inc. */ package org.netbeans.modules.hudson.ui.actions; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.AbstractAction; import javax.swing.Action; import org.netbeans.api.java.classpath.GlobalPathRegistry; import org.netbeans.api.project.Project; import org.netbeans.modules.gsf.testrunner.api.CallstackFrameNode; import org.netbeans.modules.gsf.testrunner.api.DiffViewAction; import org.netbeans.modules.gsf.testrunner.api.Manager; import org.netbeans.modules.gsf.testrunner.api.TestMethodNode; import org.netbeans.modules.gsf.testrunner.api.TestRunnerNodeFactory; import org.netbeans.modules.gsf.testrunner.api.TestSession; import org.netbeans.modules.gsf.testrunner.api.TestSuite; import org.netbeans.modules.gsf.testrunner.api.Testcase; import org.netbeans.modules.gsf.testrunner.api.TestsuiteNode; import org.netbeans.modules.gsf.testrunner.api.Trouble; import org.netbeans.modules.hudson.api.ConnectionBuilder; import org.netbeans.modules.hudson.api.HudsonJob; import org.netbeans.modules.hudson.api.HudsonJobBuild; import org.netbeans.modules.hudson.api.HudsonMavenModuleBuild; import org.netbeans.modules.hudson.spi.HudsonLogger; import org.netbeans.modules.hudson.ui.interfaces.OpenableInBrowser; import org.openide.awt.StatusDisplayer; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import static org.netbeans.modules.hudson.ui.actions.Bundle.*; import org.openide.util.RequestProcessor; import org.openide.windows.IOProvider; import org.openide.windows.InputOutput; import org.openide.windows.OutputWriter; import org.openide.xml.XMLUtil; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; /** * Action to display test failures. */ public class ShowFailures extends AbstractAction implements Runnable { private static final Logger LOG = Logger.getLogger(ShowFailures.class.getName()); private static final RequestProcessor RP = new RequestProcessor(ShowFailures.class); private final HudsonJob job; private final String url; private final String displayName; public ShowFailures(HudsonJobBuild build) { this(build.getJob(), build.getUrl(), build.getDisplayName()); } public ShowFailures(HudsonMavenModuleBuild module) { this(module.getBuild().getJob(), module.getUrl(), module.getBuildDisplayName()); } @Messages("ShowFailures.label=Show Test Failures") private ShowFailures(HudsonJob job, String url, String displayName) { this.job = job; this.url = url; this.displayName = displayName; putValue(NAME, ShowFailures_label()); } public void actionPerformed(ActionEvent e) { new RequestProcessor(url + "testReport").post(this); // NOI18N } private static final Pattern ASSERTION_FAILURE = Pattern.compile("(?m)junit[.]framework[.](AssertionFailedError|(Array)?ComparisonFailure)|java[.]lang[.]AssertionError($|: )"); @Messages({ "# {0} - job #build", "ShowFailures.title={0} Test Failures", "# {0} - class & method name of failed test", "# {1} - suite name of failed test", "ShowFailures.from_suite={0} (from {1})", "LBL_GotoSource=Go to Source", "no_test_result=No test result found for this build.", "# {0} - Java source file resource path", "no_source_to_hyperlink=Could not find {0} among open projects." }) public void run() { try { XMLReader parser = XMLUtil.createXMLReader(); parser.setContentHandler(new DefaultHandler() { InputOutput io; StringBuilder buf; Hyperlinker hyperlinker = new Hyperlinker(job); TestSession session = new TestSession(displayName, new Project() { public @Override FileObject getProjectDirectory() { return FileUtil.createMemoryFileSystem().getRoot(); } public @Override Lookup getLookup() { return Lookup.EMPTY; } }, TestSession.SessionType.TEST, new TestRunnerNodeFactory() { public @Override TestsuiteNode createTestSuiteNode(String suiteName, boolean filtered) { // XXX could add OpenableInBrowser return new TestsuiteNode(suiteName, filtered); } public @Override Node createTestMethodNode(final Testcase testcase, Project project) { return new TestMethodNode(testcase, project) { public @Override Action[] getActions(boolean context) { return new Action[] { OpenUrlAction.forOpenable(new OpenableInBrowser() { public @Override String getUrl() { return url + "testReport/" + testcase.getClassName().replaceFirst("[.][^.]+$", "") + "/" + testcase.getClassName().replaceFirst(".+[.]", "") + "/" + testcase.getName() + "/"; } }), new DiffViewAction(testcase), }; } }; } public @Override Node createCallstackFrameNode(String frameInfo, String displayName) { return new CallstackFrameNode(frameInfo, displayName) { public @Override Action getPreferredAction() { return new AbstractAction(LBL_GotoSource()) { public @Override void actionPerformed(ActionEvent e) { // XXX should have utility API to parse stack traces final Matcher m = Pattern.compile("\tat (.+[.])[^.]+[.][^.]+[(]([^.]+[.]java):([0-9]+)[)]").matcher(frameInfo); if (m.matches()) { final String resource = m.group(1).replace('.', '/') + m.group(2); RP.post(new Runnable() { @Override public void run() { FileObject f = GlobalPathRegistry.getDefault().findResource(resource); LOG.log(Level.FINER, "matched {0} -> {1}", new Object[] {resource, f}); if (f != null) { HudsonLogger.Helper.openAt(f, Integer.parseInt(m.group(3)) - 1, -1, true); } else { StatusDisplayer.getDefault().setStatusText(no_source_to_hyperlink(resource)); } } }); } else { LOG.log(Level.FINER, "no match for {0}", frameInfo); } } }; } public @Override Action[] getActions(boolean context) { return new Action[] {getPreferredAction()}; } }; } }); private void prepareOutput() { if (io == null) { String title = ShowFailures_title(displayName); io = IOProvider.getDefault().getIO(title, new Action[0]); io.select(); Manager.getInstance().testStarted(session); } } class Suite { String name; String stdout; String stderr; Stack cases = new Stack(); List casesDone = new ArrayList(); long duration; } class Case { String className; String name; String errorStackTrace; long duration; } long parseDuration(String d) { if (d == null) { return 0; } try { return (long) (1000 * Float.parseFloat(d)); } catch (NumberFormatException x) { return 0; } } Stack suites = new Stack(); public @Override void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.matches("errorStackTrace|stdout|stderr|name|className")) { // NOI18N buf = new StringBuilder(); } else if (qName.equals("suite")) { // NOI18N suites.push(new Suite()); } else if (qName.equals("case") && !suites.empty()) { // NOI18N suites.peek().cases.push(new Case()); } } public @Override void characters(char[] ch, int start, int length) throws SAXException { if (buf != null) { buf.append(ch, start, length); } } public @Override void endElement(String uri, String localName, String qName) throws SAXException { if (suites.empty()) { return; } Suite s = suites.peek(); String text = buf != null && buf.length() > 0 ? buf.toString() : null; buf = null; if (s.cases.empty()) { // suite level if (qName.equals("stdout")) { // NOI18N s.stdout = text; } else if (qName.equals("stderr")) { // NOI18N s.stderr = text; } else if (qName.equals("name")) { // NOI18N s.name = text; } else if (qName.equals("duration")) { // NOI18N s.duration = parseDuration(text); } } else { // case level Case c = s.cases.peek(); if (qName.equals("errorStackTrace")) { // NOI18N c.errorStackTrace = text; } else if (qName.equals("name")) { // NOI18N c.name = text; } else if (qName.equals("className")) { // NOI18N c.className = text; } else if (qName.equals("duration")) { // NOI18N c.duration = parseDuration(text); } } if (qName.equals("suite")) { // NOI18N try { show(s); } catch (IOException x) { LOG.log(Level.FINE, null, x); } suites.pop(); } else if (qName.equals("case")) { // NOI18N s.casesDone.add(s.cases.pop()); } } void show(Suite s) throws IOException { prepareOutput(); OutputWriter out = io.getOut(); OutputWriter err = io.getErr(); TestSuite suite = new TestSuite(s.name); session.addSuite(suite); Manager.getInstance().displaySuiteRunning(session, suite.getName()); if (s.stderr != null) { // XXX TR window does not seem to show only stdio from selected suite Manager.getInstance().displayOutput(session, s.stderr, true); } if (s.stdout != null) { Manager.getInstance().displayOutput(session, s.stdout, false); } for (final Case c : s.casesDone) { if (c.errorStackTrace == null) { continue; } String name = c.className + "." + c.name; String shortName = c.name; if (s.name != null && !s.name.equals(c.className)) { shortName = name; name = ShowFailures_from_suite(name, s.name); } println(); out.println("[" + name + "]"); // XXX use color printing to make it stand out? show(c.errorStackTrace, /* err is too hard to read */ out); Testcase test = new Testcase(shortName, null, session); test.setClassName(c.className); Trouble trouble = new Trouble(!ASSERTION_FAILURE.matcher(c.errorStackTrace).lookingAt()); trouble.setStackTrace(c.errorStackTrace.split("\r?\n")); // XXX call setComparisonFailure if matches "expected:<...> but was:<...>" test.setTrouble(trouble); LOG.log(Level.FINE, "got {0} as {1}", new Object[] {name, test.getStatus()}); test.setTimeMillis(c.duration); session.addTestCase(test); } if (s.stderr != null || s.stdout != null) { println(); show(s.stderr, err); show(s.stdout, out); } Manager.getInstance().displayReport(session, session.getReport(s.duration)); } boolean firstLine = true; void println() { if (firstLine) { firstLine = false; } else { io.getOut().println(); } } void show(String lines, OutputWriter w) { if (lines == null) { return; } for (String line : lines.split("\r\n?|\n")) { // NOI18N hyperlinker.handleLine(line, w); } } public @Override void endDocument() throws SAXException { if (io != null) { io.getOut().close(); io.getErr().close(); Manager.getInstance().sessionFinished(session); } } }); // XXX could use ?tree (would be faster) if there were an alternate object for failed tests only String u = url + "testReport/api/xml?xpath=//suite[case/errorStackTrace]&wrapper=failures"; // NOI18N InputSource source = new InputSource(new ConnectionBuilder().job(job).url(u).connection().getInputStream()); source.setSystemId(u); parser.parse(source); } catch (FileNotFoundException x) { Toolkit.getDefaultToolkit().beep(); StatusDisplayer.getDefault().setStatusText(no_test_result()); } catch (Exception x) { Toolkit.getDefaultToolkit().beep(); LOG.log(Level.INFO, null, x); } } } ----- Classpath: --------------------------------------------- bootPath: /space/jdk6/jre/lib/resources.jar:/space/jdk6/jre/lib/rt.jar:/space/jdk6/jre/lib/sunrsasign.jar:/space/jdk6/jre/lib/jsse.jar:/space/jdk6/jre/lib/jce.jar:/space/jdk6/jre/lib/charsets.jar:/space/jdk6/jre/lib/modules/jdk.boot.jar:/space/jdk6/jre/classes:/space/jdk6/jre/lib/ext/sunjce_provider.jar:/space/jdk6/jre/lib/ext/localedata.jar:/space/jdk6/jre/lib/ext/sunpkcs11.jar:/space/jdk6/jre/lib/ext/dnsns.jar classPath: /space/src/nb/main/nbbuild/netbeans/platform/modules/org-netbeans-api-annotations-common.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-api-java-classpath.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-netbeans-api-progress.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-core-ide.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-libs-commons_net.jar:/space/src/nb/main/libs.commons_net/external/commons-net-3.0.1.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-modules-diff.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-modules-gsf-testrunner.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-netbeans-modules-keyring.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-netbeans-modules-options-api.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-modules-projectapi.jar:/space/src/nb/main/nbbuild/netbeans/ide/modules/org-netbeans-modules-projectuiapi.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-netbeans-spi-quicksearch.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-actions.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-awt.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-dialogs.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-explorer.jar:/space/src/nb/main/nbbuild/netbeans/platform/core/org-openide-filesystems.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-io.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-loaders.jar:/space/src/nb/main/nbbuild/netbeans/platform/lib/org-openide-modules.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-nodes.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-text.jar:/space/src/nb/main/nbbuild/netbeans/platform/lib/org-openide-util.jar:/space/src/nb/main/nbbuild/netbeans/platform/lib/org-openide-util-lookup.jar:/space/src/nb/main/nbbuild/netbeans/platform/modules/org-openide-windows.jar sourcePath: /space/src/nb/main/hudson/src:/space/src/nb/main/hudson/build/classes-generated ----- Original exception --------------------------------------------- java.lang.AssertionError: isSubtype 12 at com.sun.tools.javac.code.Types$5.visitType(Types.java:423) at com.sun.tools.javac.code.Types$5.visitType(Types.java:403) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visitMethodType(Types.java:3747) at com.sun.tools.javac.code.Type$MethodType.accept(Type.java:886) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:3743) at com.sun.tools.javac.code.Types.isSubtype(Types.java:399) at com.sun.tools.javac.code.Types.isSubtypeNoCapture(Types.java:378) at com.sun.tools.javac.code.Types$5.visitClassType(Types.java:484) at com.sun.tools.javac.code.Types$5.visitClassType(Types.java:403) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:583) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:3743) at com.sun.tools.javac.code.Types.isSubtype(Types.java:399) at com.sun.tools.javac.code.Types.isSubtypeNoCapture(Types.java:378) at com.sun.tools.javac.code.Types$5.visitClassType(Types.java:484) at com.sun.tools.javac.code.Types$5.visitClassType(Types.java:403) at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:583) at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:3743) at com.sun.tools.javac.code.Types.isSubtype(Types.java:399) at com.sun.tools.javac.code.Types.isSubtype(Types.java:375) at com.sun.tools.javac.code.Types.isSubtypeUnchecked(Types.java:346) at com.sun.tools.javac.code.Types.isConvertible(Types.java:284) at com.sun.tools.javac.code.Types.isAssignable(Types.java:1620) at com.sun.tools.javac.comp.Check.checkType(Check.java:442) at com.sun.tools.javac.comp.Attr.check(Attr.java:207) at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1596) at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1326) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:470) at com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:917) at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:730) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:517) at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:948) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:786) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:861) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:674) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3334) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3246) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3177) at com.sun.tools.javac.comp.Attr.visitClassDef(Attr.java:726) at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:595) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.visitNewClass(Attr.java:1855) at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1377) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:525) at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1549) at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1326) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:481) at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:1327) at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1172) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:517) at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:948) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:786) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.visitTry(Attr.java:1151) at com.sun.tools.javac.tree.JCTree$JCTry.accept(JCTree.java:1049) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:517) at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:948) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:786) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:861) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:674) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:451) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:424) at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:501) at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3334) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3246) at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3177) at com.sun.tools.javac.comp.Attr.attrib(Attr.java:3151) at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1220) at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1195) at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:466) at com.sun.tools.javac.api.JavacTaskImpl.analyze(JavacTaskImpl.java:445) at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:592) at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:449) at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:164) at org.netbeans.modules.parsing.impl.TaskProcessor.callGetResult(TaskProcessor.java:605) at org.netbeans.modules.parsing.impl.SourceCache.getResult(SourceCache.java:224) at org.netbeans.modules.parsing.impl.TaskProcessor$CompilationJob.run(TaskProcessor.java:717) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)