package org.netbeans.gradle.project.tasks; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.regex.Pattern; import org.netbeans.gradle.model.util.CollectionUtils; import org.netbeans.gradle.model.util.Exceptions; import org.netbeans.gradle.project.NbStrings; import org.netbeans.gradle.project.view.GlobalErrorReporter; public final class GradleDaemonFailures { private static final DaemonFailureHandler DEFAULT_HANDLER = new MultiHandler(new DaemonFailureHandler[] { failureDueToJarCachingHandler() }); public static DaemonFailureHandler getDefaultHandler() { return DEFAULT_HANDLER; } private static DaemonFailureHandler failureDueToJarCachingHandler() { String pattern = "JAR entry .*BuildAction.*\\.class not found in .*\\.jar"; return new RootCauseMessagePatternHandler(pattern, new DaemonFailureHandler() { @Override public boolean tryHandleFailure(Throwable failure) { GlobalErrorReporter.showIssue(NbStrings.getCachedJarIssueMessage()); return true; } }); } private static final class RootCauseMessagePatternHandler implements DaemonFailureHandler { private final Pattern pattern; private final DaemonFailureHandler handlerOnMatch; public RootCauseMessagePatternHandler(String pattern, DaemonFailureHandler handlerOnMatch) { this(Pattern.compile(pattern), handlerOnMatch); } public RootCauseMessagePatternHandler(Pattern pattern, DaemonFailureHandler handlerOnMatch) { assert pattern != null; assert handlerOnMatch != null; this.pattern = pattern; this.handlerOnMatch = handlerOnMatch; } @Override public boolean tryHandleFailure(Throwable failure) { Throwable rootCause = Exceptions.getRootCause(failure); if (rootCause instanceof FileNotFoundException) { String message = rootCause.getMessage(); if (message != null) { if (pattern.matcher(message).matches()) { return handlerOnMatch.tryHandleFailure(failure); } } } return false; } } private static final class MultiHandler implements DaemonFailureHandler { private final DaemonFailureHandler[] handlers; public MultiHandler(DaemonFailureHandler[] handlers) { this.handlers = handlers.clone(); CollectionUtils.checkNoNullElements(Arrays.asList(this.handlers), "handlers"); } @Override public boolean tryHandleFailure(Throwable failure) { for (DaemonFailureHandler handler: handlers) { if (handler.tryHandleFailure(failure)) { return true; } } return false; } } private GradleDaemonFailures() { throw new AssertionError(); } }