8156000: tools/all/RunCodingRules.java fails if build dir exists, but generated sources do not

RunCodingRules test compiles and runs PropertiesParser to get the generated CompilerProperties.java

Reviewed-by: mcimadamore, jjg
This commit is contained in:
Jan Lahoda 2016-05-04 17:06:55 +02:00
parent d2463eca44
commit 37c2a5ad4e
2 changed files with 58 additions and 48 deletions

View File

@ -28,24 +28,10 @@ package propertiesparser;
import propertiesparser.parser.MessageFile;
import propertiesparser.gen.ClassGenerator;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.RuntimeException;
import java.lang.Throwable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/** Translates a .properties file into a .java file containing an enum-like Java class
* which defines static factory methods for all resource keys in a given resource file. <P>
@ -64,13 +50,17 @@ public class PropertiesParser {
}
public static void main(String[] args) {
PropertiesParser pp = new PropertiesParser(msg -> System.out.println(msg));
boolean ok = pp.run(args);
boolean ok = run(args, System.out);
if ( !ok ) {
System.exit(1);
}
}
public static boolean run(String[] args, PrintStream out) {
PropertiesParser pp = new PropertiesParser(msg -> out.println(msg));
return pp.run(args);
}
public static interface Logger {
void info(String msg);
}

View File

@ -30,6 +30,9 @@
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@ -58,29 +61,23 @@ public class RunCodingRules {
List<Path> sourceDirs = null;
Path crulesDir = null;
Path mainSrcDir = null;
List<Path> genSrcDirs = null;
for (Path d = testSrc; d != null; d = d.getParent()) {
if (Files.exists(d.resolve("TEST.ROOT"))) {
d = d.getParent();
Path toolsPath = d.resolve("make/tools");
Path buildDir = d.getParent().resolve("build");
if (Files.exists(toolsPath) && Files.exists(buildDir)) {
if (Files.exists(toolsPath)) {
mainSrcDir = d.resolve("src");
crulesDir = toolsPath;
sourceDirs = Files.walk(mainSrcDir, 1)
.map(p -> p.resolve("share/classes"))
.filter(p -> Files.isDirectory(p))
.collect(Collectors.toList());
genSrcDirs = Files.walk(buildDir, 1)
.map(p -> p.resolve("support/gensrc"))
.filter(p -> Files.isDirectory(p.resolve("jdk.compiler")))
.collect(Collectors.toList());
break;
}
}
}
if (sourceDirs == null || crulesDir == null || genSrcDirs == null) {
if (sourceDirs == null || crulesDir == null) {
System.err.println("Warning: sources not found, test skipped.");
return ;
}
@ -90,7 +87,10 @@ public class RunCodingRules {
DiagnosticListener<JavaFileObject> noErrors = diagnostic -> {
Assert.check(diagnostic.getKind() != Diagnostic.Kind.ERROR, diagnostic.toString());
};
String FS = File.separator;
String PS = File.pathSeparator;
//compile crules:
List<File> crulesFiles = Files.walk(crulesDir)
.filter(entry -> entry.getFileName().toString().endsWith(".java"))
.filter(entry -> entry.getParent().endsWith("crules"))
@ -114,41 +114,61 @@ public class RunCodingRules {
metaInfServices.write("crules.CodingRulesAnalyzerPlugin\n");
}
//generate CompilerProperties.java:
List<File> propertiesParserFiles =
Files.walk(crulesDir.resolve("propertiesparser"))
.filter(entry -> entry.getFileName().toString().endsWith(".java"))
.map(entry -> entry.toFile())
.collect(Collectors.toList());
Path propertiesParserTarget = targetDir.resolve("propertiesParser");
Files.createDirectories(propertiesParserTarget);
List<String> propertiesParserOptions = Arrays.asList(
"-d", propertiesParserTarget.toString());
javaCompiler.getTask(null, fm, noErrors, propertiesParserOptions, null,
fm.getJavaFileObjectsFromFiles(propertiesParserFiles)).call();
Path genSrcTarget = targetDir.resolve("gensrc");
ClassLoader propertiesParserLoader = new URLClassLoader(new URL[] {
propertiesParserTarget.toUri().toURL(),
crulesDir.toUri().toURL()
});
Class propertiesParserClass =
Class.forName("propertiesparser.PropertiesParser", false, propertiesParserLoader);
Method propertiesParserRun =
propertiesParserClass.getDeclaredMethod("run", String[].class, PrintStream.class);
String compilerProperties =
"jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties";
Path propertiesPath = mainSrcDir.resolve(compilerProperties.replace("/", FS));
Path genSrcTargetDir = genSrcTarget.resolve(mainSrcDir.relativize(propertiesPath.getParent()));
Files.createDirectories(genSrcTargetDir);
String[] propertiesParserRunOptions = new String[] {
"-compile", propertiesPath.toString(), genSrcTargetDir.toString()
};
Object result = propertiesParserRun.invoke(null, propertiesParserRunOptions, System.err);
if (!(result instanceof Boolean) || !(Boolean) result) {
throw new AssertionError("Cannot parse properties: " + result);
}
//compile langtools sources with crules enabled:
List<File> sources = sourceDirs.stream()
.flatMap(dir -> silentFilesWalk(dir))
.filter(entry -> entry.getFileName().toString().endsWith(".java"))
.map(p -> p.toFile())
.collect(Collectors.toList());
String FS = File.separator;
String PS = File.pathSeparator;
Path genSrcTarget = targetDir.resolve("gensrc");
List<String> genSrcFiles = Arrays.asList(
"jdk.compiler/com/sun/tools/javac/resources/CompilerProperties.java"
);
for (String f : genSrcFiles) {
for (Path dir : genSrcDirs) {
Path from = dir.resolve(f.replace("/", FS));
if (Files.exists(from)) {
try {
Path to = genSrcTarget.resolve(f.replace("/", FS));
Files.createDirectories(to.getParent());
Files.copy(from, to);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Path sourceTarget = targetDir.resolve("classes");
Files.createDirectories(sourceTarget);
String processorPath = crulesTarget + PS + crulesDir;
List<String> options = Arrays.asList(
"-d", sourceTarget.toString(),
"-modulesourcepath", mainSrcDir + FS + "*" + FS + "share" + FS + "classes" + PS + genSrcTarget,
"-modulesourcepath", mainSrcDir + FS + "*" + FS + "share" + FS + "classes" + PS
+ genSrcTarget + FS + "*" + FS + "share" + FS + "classes",
"-XDaccessInternalAPI",
"-processorpath", processorPath,
"-Xplugin:coding_rules");