aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/pom.xml82
-rw-r--r--lib/readme-lib-module.html5
-rw-r--r--testing-util/pom.xml6
-rw-r--r--testing-util/src/main/java/org/aspectj/testing/util/TestUtil.java369
-rw-r--r--testing-util/src/test/java/org/aspectj/testingutil/TestUtilTest.java11
-rw-r--r--testing/src/test/java/org/aspectj/testing/harness/bridge/DirChanges.java146
-rw-r--r--util/src/main/java/org/aspectj/util/FileUtil.java13
7 files changed, 147 insertions, 485 deletions
diff --git a/lib/pom.xml b/lib/pom.xml
index e2a186b38..807d8a344 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -161,25 +161,6 @@
<sha1>626e7bee806ea14812f6f95cc2d187ab6ba9114a</sha1>
</configuration>
</execution>
- <!--
- Obsolete because we uploaded both binary and source JARs to GitHub Packages, so we can use JDiff as a
- normal dependency. Keep this for reference, so we can remember where we found it.
- -->
- <!--
- <execution>
- <id>download-jdiff</id>
- <phase>generate-resources</phase>
- <goals>
- <goal>wget</goal>
- </goals>
- <configuration>
- <url>https://downloads.sourceforge.net/project/jedit-plugins/JDiffPlugin/1.3/JDiffPlugin-1.3.zip</url>
- <outputDirectory>jdiff</outputDirectory>
- <outputFileName>JDiffPlugin-1.3.zip</outputFileName>
- <sha1>eba63fd845203c6b245fbcb81c0de8e2c83d16c7</sha1>
- </configuration>
- </execution>
- -->
</executions>
</plugin>
@@ -548,67 +529,6 @@
</fileset>
</configuration>
</execution>
- <!--
- Obsolete because we uploaded both binary and source JARs to GitHub Packages, so we can use JDiff as a normal
- dependency. Keep this for reference, so we can remember how we built it. After download + zip the deployment
- was made right from the lib/jdiff directory, using the following commands (without the line breaks):
-
- mvn -Dfile=jdiff.jar -DrepositoryId=github -Durl=https://maven.pkg.github.com/kriegaex/aspectj-packages
- -DgroupId=jdiff -DartifactId=jdiff -Dpackaging=jar -Dversion=1.3
- deploy:deploy-file
-
- mvn -Dfile=jdiff-src.zip -DrepositoryId=github -Durl=https://maven.pkg.github.com/kriegaex/aspectj-packages
- -DgroupId=jdiff -DartifactId=jdiff -Dpackaging=jar -Dversion=1.3
- -Dtypes=java-source -Dclassifier=sources
- deploy:deploy-file
-
- The second command yields an error, trying to re-upload a POM, but that is no problem because the POM would
- be identical to the one already uploaded with the first command.
- -->
- <!--
- <execution>
- <id>zip-jdiff-binaries</id>
- <phase>process-resources</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- <configuration>
- <verbose>true</verbose>
- <fileset>
- <directory>jdiff/JDiffPlugin-1.3.zip/JDiffPlugin.jar</directory>
- <outputDirectory>jdiff/jdiff.jar</outputDirectory>
- <includes>
- <include>**/*.class</include>
- </includes>
- <excludes>
- <exclude>jdiff/options/**</exclude>
- <exclude>jdiff/*.class</exclude>
- </excludes>
- </fileset>
- </configuration>
- </execution>
- <execution>
- <id>zip-jdiff-sources</id>
- <phase>process-resources</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- <configuration>
- <verbose>true</verbose>
- <fileset>
- <directory>jdiff/JDiffPlugin-1.3.zip/JDiffPlugin</directory>
- <outputDirectory>jdiff/jdiff-src.zip</outputDirectory>
- <includes>
- <include>**/*.java</include>
- </includes>
- <excludes>
- <exclude>jdiff/options/**</exclude>
- <exclude>jdiff/*.java</exclude>
- </excludes>
- </fileset>
- </configuration>
- </execution>
- -->
</executions>
</plugin>
@@ -675,8 +595,6 @@
<include>commons/**</include>
<include>docbook/**</include>
<include>jarjar/**</include>
- <!-- Obsolete because JDiff is on GitHub Packages now. Keep for reference. -->
- <!--<include>jdiff/**</include>-->
<include>jdtcore-aj/**</include>
<include>junit/**</include>
<include>regexp/**</include>
diff --git a/lib/readme-lib-module.html b/lib/readme-lib-module.html
index 1e476fb5a..fe4f03c4d 100644
--- a/lib/readme-lib-module.html
+++ b/lib/readme-lib-module.html
@@ -32,11 +32,6 @@ This module also contains some bootstrap libraries and test sources.
<a href="http:jakarta.apache.org/commons">http:jakarta.apache.org/commons</a>.
This is used only by the testing module.
</li>
- <li><a href="jdiff">jdiff</a>:
- JDiff binaries; there is a jdiff project under LGPL at
- <a href="http:sourceforge.net/projects/javadiff">http:sourceforge.net/projects/javadiff</a>.
- This is used only internally by the testing module and is not distributed.
- </li>
<li><a href="junit">junit</a>:
JUnit 3.7 test libraries, available from
<a href="http:junit.org">junit.org</a> and under the CPL.
diff --git a/testing-util/pom.xml b/testing-util/pom.xml
index 0acc00a08..cd62ba319 100644
--- a/testing-util/pom.xml
+++ b/testing-util/pom.xml
@@ -33,12 +33,6 @@
<!-- Yes, not 'test' here -->
<scope>compile</scope>
</dependency>
- <dependency>
- <!-- Identical to lib/jdiff/jdiff.jar, a former system-scoped dependency. Now to be found on GitHub Packages. -->
- <groupId>jdiff</groupId>
- <artifactId>jdiff</artifactId>
- <version>1.3</version>
- </dependency>
</dependencies>
</project>
diff --git a/testing-util/src/main/java/org/aspectj/testing/util/TestUtil.java b/testing-util/src/main/java/org/aspectj/testing/util/TestUtil.java
index 79ae9a776..51c940277 100644
--- a/testing-util/src/main/java/org/aspectj/testing/util/TestUtil.java
+++ b/testing-util/src/main/java/org/aspectj/testing/util/TestUtil.java
@@ -14,33 +14,38 @@ package org.aspectj.testing.util;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringReader;
-import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
-import java.util.*;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
import org.aspectj.bridge.IMessageHandler;
import org.aspectj.bridge.MessageUtil;
import org.aspectj.util.FileUtil;
import org.aspectj.util.LangUtil;
import org.aspectj.util.Reflection;
-
-import jdiff.text.FileLine;
-import jdiff.util.Diff;
-import jdiff.util.DiffNormalOutput;
import org.junit.Assert;
+
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestCase;
@@ -48,8 +53,7 @@ import junit.framework.TestResult;
import junit.framework.TestSuite;
/**
- * Things that junit should perhaps have, but doesn't. Note the file-comparison methods require JDiff to run, but JDiff types are
- * not required to resolve this class. Also, the bytecode weaver is required to compare class files, but not to compare other files.
+ * Things that junit should perhaps have, but doesn't. Also, the bytecode weaver is required to compare class files, but not to compare other files.
*/
public final class TestUtil {
private static final String SANDBOX_NAME = "ajcSandbox";
@@ -208,9 +212,9 @@ public final class TestUtil {
return path.toString();
}
- public static String aspectjrtClasspath() {
- return TestUtil.aspectjrtPath().getPath();
- }
+ public static String aspectjrtClasspath() {
+ return TestUtil.aspectjrtPath().getPath();
+ }
/**
* @param input the String to parse for [on|off|true|false]
@@ -536,76 +540,115 @@ public final class TestUtil {
File expectedFile = new File(expectedBaseDir, path);
return doSameFile(handler, expectedBaseDir, actualBaseDir, expectedFile, actualFile);
}
+
+ public static String disassembleClass(File basedir, File file) {
+ String basedirPath = FileUtil.normalizedPath(basedir);
+ String name = FileUtil.fileToClassName(basedir, file);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ String utf8 = StandardCharsets.UTF_8.name();
+ try (PrintStream out = new PrintStream(baos, true, utf8)) {
+ Class<?> c = Class.forName("org.aspectj.weaver.bcel.LazyClassGen");
+ Method m = c.getMethod("disassemble", new Class[] { String.class, String.class, PrintStream.class });
+ m.invoke(null, new Object[] { basedirPath, name, out });
+ return baos.toString(utf8);
+ } catch (Throwable t) {
+ throw new IllegalStateException(t);
+ }
+ }
+
+ public static List<String> toLines(String inputString) {
+ List<String> lines = new ArrayList<>();
+ try (BufferedReader br = new BufferedReader(new StringReader(inputString))) {
+ String line = null;
+ while ((line= br.readLine()) != null) {
+ lines.add(line);
+ }
+ } catch (IOException ioe) {
+ throw new IllegalStateException("Unable to create lines from string "+inputString,ioe);
+ }
+ return lines;
+ }
+
+ public static String toString(List<String> lines) {
+ return String.join("\n", lines);
+ }
+
+ private static int longestLine(List<String> lines) {
+ int longest = -1;
+ for (String line: lines) {
+ if (line.length()>longest) {
+ longest = line.length();
+ }
+ }
+ return longest;
+ }
- /**
- * This does the work, selecting a lineator subclass and converting public API's to JDiff APIs for comparison. Currently, all
- * jdiff interfaces are method-local, so this class will load without it; if we do use it, we can avoid the duplication.
- */
private static boolean doSameFile(IMessageHandler handler, File expectedBaseDir, File actualBaseDir, File expectedFile,
File actualFile) {
String path = expectedFile.getPath();
- // XXX permit user to specify lineator
- ILineator lineator = Lineator.TEXT;
+ List<String> expectedLines = null;
+ List<String> actualLines = null;
+ List<String> errorContext = new ArrayList<>();
if (path.endsWith(".class")) {
- if (ClassLineator.haveDisassembler()) {
- lineator = Lineator.CLASS;
- } else {
- MessageUtil.abort(handler, "skipping - dissassembler not available");
- return false;
- }
- }
- CanonicalLine[] actualLines = null;
- CanonicalLine[] expectedLines = null;
- try {
- actualLines = lineator.getLines(handler, actualFile, actualBaseDir);
- expectedLines = lineator.getLines(handler, expectedFile, expectedBaseDir);
- } catch (IOException e) {
- MessageUtil.fail(handler, "rendering lines ", e);
+ expectedLines = toLines(disassembleClass(expectedBaseDir, expectedFile));
+ actualLines = toLines(disassembleClass(actualBaseDir, actualFile));
+ } else {
+ expectedLines = FileUtil.readAsLines(expectedFile);
+ actualLines = FileUtil.readAsLines(actualFile);
+ }
+ // TODO replace this section with assertMultiLineStringEquals ?
+ int longestLine = longestLine(expectedLines);
+ int actualLongestLine = longestLine(actualLines);
+ String padding = null;
+ if (actualLongestLine>longestLine) {
+ longestLine = actualLongestLine;
+ }
+ StringBuilder s = new StringBuilder();
+ for (int i=0;i<longestLine;i++) {
+ s.append(" ");
+ }
+ padding = s.toString();
+ if (expectedLines.isEmpty() && !actualLines.isEmpty()) {
+ MessageUtil.fail(handler, "Expected no output but "+path+" contained:\n"+toString(actualLines));
return false;
- }
- if (!LangUtil.isEmpty(actualLines) && !LangUtil.isEmpty(expectedLines)) {
- // here's the transmutation back to jdiff - extract if publishing
- // JDiff
- CanonicalLine[][] clines = new CanonicalLine[][] { expectedLines, actualLines };
- FileLine[][] flines = new FileLine[2][];
- for (int i = 0; i < clines.length; i++) {
- CanonicalLine[] cline = clines[i];
- FileLine[] fline = new FileLine[cline.length];
- for (int j = 0; j < fline.length; j++) {
- fline[j] = new FileLine(cline[j].canonical, cline[j].line);
+ } else {
+ for (int l=0;l<expectedLines.size();l++) {
+ String expectedLine = expectedLines.get(l);
+ if (actualLines.size()<(l-1)) {
+ MessageUtil.fail(handler, "Error comparing "+path+" - ran out of data in actual output compared to expect after "+(l+1)+" lines");
+ return false;
}
- flines[i] = fline;
+ String actualLine = actualLines.get(l);
+ if (!expectedLine.equals(actualLine)) {
+ errorContext.add(padded(actualLine,padding,longestLine)+" ! "+
+ padded(expectedLine, padding, longestLine));
+ MessageUtil.fail(handler, "Error comparing actual vs expected "+path+" - line "+(l+1)+" differs\n"+
+ "expected: ["+expectedLine+"]\n"+
+ " actual: ["+actualLine+"]\n"+
+ String.join("\n", errorContext));
+ return false;
+ }
+ errorContext.add(padded(actualLine,padding,longestLine)+" = "+
+ padded(expectedLine, padding, longestLine));
}
-
- Diff.change edits = new Diff(flines[0], flines[1]).diff_2(false);
- if ((null == edits) || (0 == (edits.inserted + edits.deleted))) {
- // XXX confirm with jdiff that null means no edits
- return true;
- } else {
- // String m = render(handler, edits, flines[0], flines[1]);
- StringWriter writer = new StringWriter();
- DiffNormalOutput out = new DiffNormalOutput(flines[0], flines[1]);
- out.setOut(writer);
- out.setLineSeparator(LangUtil.EOL);
- try {
- out.writeScript(edits);
- } catch (IOException e) {
- MessageUtil.fail(handler, "rendering edits", e);
- } finally {
- if (null != writer) {
- try {
- writer.close();
- } catch (IOException e) {
- MessageUtil.fail(handler, "closing after rendering edits", e);
- }
- }
+ if (actualLines.size()>expectedLines.size()) {
+ StringBuilder extra = new StringBuilder();
+ for (int l=expectedLines.size();l<actualLines.size();l++) {
+ extra.append(actualLines.get(l)).append("\n");
}
- String message = "diff between " + path + " in expected dir " + expectedBaseDir + " and actual dir "
- + actualBaseDir + LangUtil.EOL + writer.toString();
- MessageUtil.fail(handler, message);
+ MessageUtil.fail(handler, "Error comparing actual vs expected "+path+" - actual data contains more lines, the first "+
+ expectedLines.size()+" were as expected, extra data was: \n"+extra.toString()+"\n"+String.join("\n", errorContext));
+ return false;
}
}
- return false;
+ return true;
+ }
+
+ private static String padded(String line, String padding, int longestLine) {
+ StringBuilder s = new StringBuilder();
+ String line2 = line.replace("\t"," ");
+ s.append(line2).append(padding.substring(0,longestLine-line2.length()));
+ return s.toString();
}
public static String cleanTestName(String name) {
@@ -670,9 +713,9 @@ public final class TestUtil {
sink.addTest(test);
} else {
TestSuite source = (TestSuite) test;
- Enumeration tests = source.tests();
+ Enumeration<Test> tests = source.tests();
while (tests.hasMoreElements()) {
- sink.addTest((Test) tests.nextElement());
+ sink.addTest(tests.nextElement());
}
}
@@ -772,168 +815,6 @@ public final class TestUtil {
}
}
- /** component that reduces file to CanonicalLine[] */
- public interface ILineator {
- /** Lineator suitable for text files */
- ILineator TEXT = new TextLineator();
-
- /** Lineator suitable for class files (disassembles first) */
- ILineator CLASS = new ClassLineator();
-
- /**
- * Reduce file to CanonicalLine[].
- *
- * @param handler the IMessageHandler for errors (may be null)
- * @param file the File to render
- * @param basedir the File for the base directory (may be null)
- * @return CanonicalLine[] of lines - not null, but perhaps empty
- */
- CanonicalLine[] getLines(IMessageHandler handler, File file, File basedir) throws IOException;
- }
-
- /** alias for jdiff FileLine to avoid client binding */
- public static class CanonicalLine {
- public static final CanonicalLine[] NO_LINES = new CanonicalLine[0];
-
- /** canonical variant of line for comparison */
- public final String canonical;
-
- /** actual line, for logging */
- public final String line;
-
- public CanonicalLine(String canonical, String line) {
- this.canonical = canonical;
- this.line = line;
- }
-
- public String toString() {
- return line;
- }
- }
-
- private abstract static class Lineator implements ILineator {
- /**
- * Reduce file to CanonicalLine[].
- *
- * @param handler the IMessageHandler for errors (may be null)
- * @param file the File to render
- * @param basedir the File for the base directory (may be null)
- */
- public CanonicalLine[] getLines(IMessageHandler handler, File file, File basedir) throws IOException {
-
- if (!file.canRead() || !file.isFile()) {
- MessageUtil.error(handler, "not readable file: " + basedir + " - " + file);
- return null;
- }
- // capture file as FileLine[]
- InputStream in = null;
- /* String path = */FileUtil.normalizedPath(file, basedir);
- LineStream capture = new LineStream();
- try {
- lineate(capture, handler, basedir, file);
- } catch (IOException e) {
- MessageUtil.fail(handler, "NormalizedCompareFiles IOException reading " + file, e);
- return null;
- } finally {
- if (null != in) {
- try {
- in.close();
- } catch (IOException e) {
- } // ignore
- }
- capture.flush();
- capture.close();
- }
- String missed = capture.getMissed();
- if (!LangUtil.isEmpty(missed)) {
- MessageUtil.warn(handler, "NormalizedCompareFiles missed input: " + missed);
- return null;
- } else {
- String[] lines = capture.getLines();
- CanonicalLine[] result = new CanonicalLine[lines.length];
- for (int i = 0; i < lines.length; i++) {
- result[i] = new CanonicalLine(lines[i], lines[i]);
- }
- return result;
- }
- }
-
- protected abstract void lineate(PrintStream sink, IMessageHandler handler, File basedir, File file) throws IOException;
- }
-
- private static class TextLineator extends Lineator {
-
- protected void lineate(PrintStream sink, IMessageHandler handler, File basedir, File file) throws IOException {
- InputStream in = null;
- try {
- in = new FileInputStream(file);
- FileUtil.copyStream(new DataInputStream(in), sink);
- } finally {
- try {
- in.close();
- } catch (IOException e) {
- } // ignore
- }
- }
- }
-
- public static class ClassLineator extends Lineator {
-
- protected void lineate(PrintStream sink, IMessageHandler handler, File basedir, File file) throws IOException {
- String name = FileUtil.fileToClassName(basedir, file);
- // XXX re-enable preflight?
- // if ((null != basedir) && (path.length()-6 != name.length())) {
- // MessageUtil.error(handler, "unexpected class name \""
- // + name + "\" for path " + path);
- // return null;
- // }
- disassemble(handler, basedir, name, sink);
- }
-
- public static boolean haveDisassembler() {
- try {
- return (null != Class.forName("org.aspectj.weaver.bcel.LazyClassGen"));
- } catch (ClassNotFoundException e) {
- // XXX fix
- // System.err.println(e.getMessage());
- // e.printStackTrace(System.err);
- return false;
- }
- }
-
- /** XXX dependency on bcweaver/bcel */
- private static void disassemble(IMessageHandler handler, File basedir, String name, PrintStream out) throws IOException {
- // LazyClassGen.disassemble(FileUtil.normalizedPath(basedir), name,
- // capture);
-
- Throwable thrown = null;
- String basedirPath = FileUtil.normalizedPath(basedir);
- // XXX use reflection utilities to invoke dissassembler?
- try {
- // XXX need test to detect when this is refactored
- Class c = Class.forName("org.aspectj.weaver.bcel.LazyClassGen");
- Method m = c.getMethod("disassemble", new Class[] { String.class, String.class, PrintStream.class });
- m.invoke(null, new Object[] { basedirPath, name, out });
- } catch (ClassNotFoundException e) {
- thrown = e;
- } catch (NoSuchMethodException e) {
- thrown = e;
- } catch (IllegalAccessException e) {
- thrown = e;
- } catch (InvocationTargetException e) {
- Throwable t = e.getTargetException();
- if (t instanceof IOException) {
- throw (IOException) t;
- }
- thrown = t;
- }
- if (null != thrown) {
- MessageUtil.fail(handler, "disassembling " + name + " path: " + basedirPath, thrown);
- }
- }
- }
-
-
public static File createEmptySandbox() {
File sandbox;
@@ -944,9 +825,9 @@ public final class TestUtil {
if (os.startsWith("Windows")) {
tempDir = new File("N:\\temp");
if (!tempDir.exists()) {
- tempDir = new File("C:\\temp");
- if (!tempDir.exists()) {
- tempDir.mkdir();
+ tempDir = new File("C:\\temp");
+ if (!tempDir.exists()) {
+ tempDir.mkdir();
}
}
} else {
@@ -1059,4 +940,12 @@ public final class TestUtil {
}
}
+ public static boolean haveDisassembler() {
+ try {
+ return (Class.forName("org.aspectj.weaver.bcel.LazyClassGen") != null);
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+
}
diff --git a/testing-util/src/test/java/org/aspectj/testingutil/TestUtilTest.java b/testing-util/src/test/java/org/aspectj/testingutil/TestUtilTest.java
index 1427ccc8a..6b791da43 100644
--- a/testing-util/src/test/java/org/aspectj/testingutil/TestUtilTest.java
+++ b/testing-util/src/test/java/org/aspectj/testingutil/TestUtilTest.java
@@ -81,16 +81,14 @@ public class TestUtilTest extends TestCase {
public void testFileCompareNonClassStaticNegative() throws IOException {
MessageHandler holder = new MessageHandler();
- File basedir = new File("testdata/testCompareTextFiles/differentFile");
+ File basedir = new File(UtilTests.TESTING_UTIL_PATH + "/testdata/testCompareTextFiles/differentFile");
File expectedBaseDir = new File(basedir, "expected");
File actualBaseDir = new File(basedir, "actual");
String filename = "TestUtilTest.java";
File expected = new File(expectedBaseDir, filename);
File actual = new File(actualBaseDir, filename);
-
- assertTrue(!TestUtil.sameFiles(holder, expected, actual));
-
- assertTrue(!TestUtil.sameFiles(holder, expectedBaseDir, actualBaseDir, filename));
+ assertTrue(!TestUtil.sameFiles(holder, expected, actual));
+ assertTrue(!TestUtil.sameFiles(holder, expectedBaseDir, actualBaseDir, filename));
}
public void testParseBoolean() {
@@ -127,8 +125,9 @@ public class TestUtilTest extends TestCase {
}
}
+
public void testFileCompareClass() throws IOException {
- if (!TestUtil.ClassLineator.haveDisassembler()) {
+ if (!TestUtil.haveDisassembler()) {
System.err.println("skipping testFileCompareClass - no disassembler on classpath");
return;
}
diff --git a/testing/src/test/java/org/aspectj/testing/harness/bridge/DirChanges.java b/testing/src/test/java/org/aspectj/testing/harness/bridge/DirChanges.java
index c19618a3d..603373381 100644
--- a/testing/src/test/java/org/aspectj/testing/harness/bridge/DirChanges.java
+++ b/testing/src/test/java/org/aspectj/testing/harness/bridge/DirChanges.java
@@ -294,152 +294,6 @@ public class DirChanges {
*/
boolean checkFile(IMessageHandler handler, String path, File actualFile);
}
-// File-comparison code with a bit more generality -- too unweildy
-// /**
-// * Default FileChecker compares files literally, transforming any
-// * with registered normalizers.
-// */
-// public static class FileChecker implements IFileChecker {
-// final File baseExpectedDir;
-// NormalizedCompareFiles fileComparer;
-//
-// public FileChecker(File baseExpectedDir) {
-// this.baseExpectedDir = baseExpectedDir;
-// fileComparer = new NormalizedCompareFiles();
-// }
-// public boolean checkFile(IMessageHandler handler, String path, File actualFile) {
-// if (null == baseExpectedDir) {
-// MessageUtil.error(handler, "null baseExpectedDir set on construction");
-// } else if (!baseExpectedDir.canRead() || !baseExpectedDir.isDirectory()) {
-// MessageUtil.error(handler, "bad baseExpectedDir: " + baseExpectedDir);
-// } else {
-// File expectedFile = new File(baseExpectedDir, path);
-// if (!expectedFile.canRead()) {
-// MessageUtil.fail(handler, "cannot read expected file: " + expectedFile);
-// } else {
-// return doCheckFile(handler, expectedFile, actualFile, path);
-// }
-// }
-// return false;
-// }
-//
-// protected boolean doCheckFile(
-// IMessageHandler handler,
-// File expectedFile,
-// File actualFile,
-// String path) {
-// fileComparer.setHandler(handler);
-// FileLine[] expected = fileComparer.diff();
-// return false;
-// }
-// }
-
-// /**
-// * CompareFiles implementation that pre-processes input
-// * to normalize it. Currently it reads all files except
-// * .class files, which it disassembles first.
-// */
-// public static class NormalizedCompareFiles extends CompareFiles {
-// private final static String[] NO_PATHS = new String[0];
-// private static String normalPath(File file) { // XXX util
-// if (null == file) {
-// return "";
-// }
-// return file.getAbsolutePath().replace('\\', '/');
-// }
-//
-// private String[] baseDirs;
-// private IMessageHandler handler;
-//
-// public NormalizedCompareFiles() {
-// }
-//
-// void init(IMessageHandler handler, File[] baseDirs) {
-// this.handler = handler;
-// if (null == baseDirs) {
-// this.baseDirs = NO_PATHS;
-// } else {
-// this.baseDirs = new String[baseDirs.length];
-// for (int i = 0; i < baseDirs.length; i++) {
-// this.baseDirs[i] = normalPath(baseDirs[i]) + "/";
-// }
-// }
-// }
-//
-// private String getClassName(File file) {
-// String result = null;
-// String path = normalPath(file);
-// if (!path.endsWith(".class")) {
-// MessageUtil.error(handler,
-// "NormalizedCompareFiles expected "
-// + file
-// + " to end with .class");
-// } else {
-// path = path.substring(0, path.length()-6);
-// for (int i = 0; i < baseDirs.length; i++) {
-// if (path.startsWith(baseDirs[i])) {
-// return path.substring(baseDirs[i].length()).replace('/', '.');
-// }
-// }
-// MessageUtil.error(handler,
-// "NormalizedCompareFiles expected "
-// + file
-// + " to start with one of "
-// + LangUtil.arrayAsList(baseDirs));
-// }
-//
-// return result;
-// }
-//
-// /**
-// * Read file as normalized lines, sending handler any messages
-// * ERROR for input failures and FAIL for processing failures.
-// * @return NOLINES on error or normalized lines from file otherwise
-// */
-// public FileLine[] getFileLines(File file) {
-// FileLineator capture = new FileLineator();
-// InputStream in = null;
-// try {
-// if (!file.getPath().endsWith(".class")) {
-// in = new FileInputStream(file);
-// FileUtil.copyStream(
-// new BufferedReader(new InputStreamReader(in)),
-// new PrintWriter(capture));
-// } else {
-// String name = getClassName(file);
-// if (null == name) {
-// return new FileLine[0];
-// }
-// String path = normalPath(file);
-// path = path.substring(0, path.length()-name.length());
-// // XXX sole dependency on bcweaver/bcel
-// LazyClassGen.disassemble(path, name, capture);
-// }
-// } catch (IOException e) {
-// MessageUtil.fail(handler,
-// "NormalizedCompareFiles IOException reading " + file, e);
-// return null;
-// } finally {
-// if (null != in) {
-// try { in.close(); }
-// catch (IOException e) {} // ignore
-// }
-// capture.flush();
-// capture.close();
-// }
-// String missed = capture.getMissed();
-// if (!LangUtil.isEmpty(missed)) {
-// MessageUtil.fail(handler,
-// "NormalizedCompareFiles missed input: "
-// + missed);
-// return null;
-// } else {
-// return capture.getFileLines();
-// }
-// }
-//
-//
-// }
/**
* Specification for a set of File added, removed, or updated
diff --git a/util/src/main/java/org/aspectj/util/FileUtil.java b/util/src/main/java/org/aspectj/util/FileUtil.java
index 91686dd13..d6bf5b0a6 100644
--- a/util/src/main/java/org/aspectj/util/FileUtil.java
+++ b/util/src/main/java/org/aspectj/util/FileUtil.java
@@ -36,6 +36,9 @@ import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -1139,6 +1142,16 @@ public class FileUtil {
r.close();
return b.toString();
}
+
+ public static List<String> readAsLines(File file) {
+ try {
+ return Files.readAllLines(Paths.get(file.toURI()));
+ } catch (NoSuchFileException nsfe) {
+ return Collections.emptyList();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
// /**
// * Returns the contents of this stream as a String