@Override
 public boolean matches(Object actual) {
   this.actual = actual;
   if (expected == null) return (actual == null);
   if (!(actual instanceof String)) {
     return false;
   }
   if (expected.equals(actual)) return true;
   String actualString = (String) actual;
   java.util.regex.Matcher m = pattern.matcher(actualString);
   while (m.find()) {
     actualLines.add(actualString.substring(m.start(), m.end()));
   }
   return expectedLines.equals(actualLines);
 }
 public MultiLineStringMatcher(String expected, String ls) {
   this.expected = expected;
   if (ls.equals("\r")) {
     this.pattern = Pattern.compile(".+(\\r|$)");
   } else if (ls.equals("\n")) {
     this.pattern = Pattern.compile(".+(\\n|$)");
   } else {
     this.pattern = Pattern.compile(".+(\\r\\n|$)");
   }
   if (expected != null) {
     java.util.regex.Matcher m = pattern.matcher(expected);
     while (m.find()) {
       expectedLines.add(expected.substring(m.start(), m.end()));
     }
   }
 }
    public InProcessExecutionFailure(
        List<String> tasks,
        Set<String> skippedTasks,
        OutputScrapingExecutionFailure outputFailure,
        GradleException failure) {
      super(tasks, skippedTasks, outputFailure);
      this.outputFailure = outputFailure;
      this.failure = failure;

      // Chop up the exception message into its expected parts
      java.util.regex.Matcher matcher = LOCATION_PATTERN.matcher(failure.getMessage());
      if (matcher.find()) {
        fileName = matcher.group(1);
        lineNumber = matcher.group(3);
        description = failure.getMessage().substring(matcher.end()).trim();
      } else {
        fileName = "";
        lineNumber = "";
        description = failure.getMessage().trim();
      }
    }