2
0
Fork 0
mirror of https://github.com/ethauvin/rife2.git synced 2025-05-01 02:58:12 -07:00

Build system cleanup and refactoring

This commit is contained in:
Geert Bevin 2023-03-12 09:41:24 -04:00
parent 1cd248ccb2
commit 162e536b4b
8 changed files with 173 additions and 102 deletions

View file

@ -18,7 +18,7 @@ public class BuildExecutor {
return arguments_; return arguments_;
} }
public Map<String, Method> getBuildCommands() { public Map<String, Method> buildCommands() {
if (buildCommands_ == null) { if (buildCommands_ == null) {
var build_commands = new TreeMap<String, Method>(); var build_commands = new TreeMap<String, Method>();
@ -50,7 +50,6 @@ public class BuildExecutor {
public void processArguments(String[] arguments) { public void processArguments(String[] arguments) {
arguments_ = new ArrayList<>(Arrays.asList(arguments)); arguments_ = new ArrayList<>(Arrays.asList(arguments));
var commands = getBuildCommands();
var show_help = arguments_.isEmpty(); var show_help = arguments_.isEmpty();
@ -58,13 +57,7 @@ public class BuildExecutor {
var command = arguments_.remove(0); var command = arguments_.remove(0);
try { try {
var method = commands.get(command); if (runCommand(command)) {
if (method != null) {
method.invoke(this);
} else {
System.err.println("ERROR: unknown command '" + command + "'");
System.out.println();
new HelpCommand(this, arguments_).printFullHelp();
break; break;
} }
} catch (Exception e) { } catch (Exception e) {
@ -78,6 +71,20 @@ public class BuildExecutor {
} }
} }
public boolean runCommand(String command)
throws Exception {
var method = buildCommands().get(command);
if (method != null) {
method.invoke(this);
} else {
System.err.println("ERROR: unknown command '" + command + "'");
System.out.println();
new HelpCommand(this, arguments_).printFullHelp();
return true;
}
return false;
}
@BuildCommand(help = HelpCommand.Help.class) @BuildCommand(help = HelpCommand.Help.class)
public void help() { public void help() {
new HelpCommand(this, arguments_).execute(); new HelpCommand(this, arguments_).execute();

View file

@ -6,11 +6,12 @@ package rife.bld;
import rife.bld.commands.*; import rife.bld.commands.*;
import rife.bld.dependencies.*; import rife.bld.dependencies.*;
import rife.tools.FileUtils;
import rife.tools.StringUtils;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.util.*;
import java.util.Collections; import java.util.regex.Pattern;
import java.util.List;
public abstract class Project extends BuildExecutor { public abstract class Project extends BuildExecutor {
public List<Repository> repositories = Collections.emptyList(); public List<Repository> repositories = Collections.emptyList();
@ -19,10 +20,14 @@ public abstract class Project extends BuildExecutor {
public VersionNumber version = null; public VersionNumber version = null;
public String mainClass = null; public String mainClass = null;
public final DependencyScopes dependencies_ = new DependencyScopes(); public DependencyScopes dependencies = new DependencyScopes();
public abstract void setup(); public abstract void setup();
/*
* Standard build commands
*/
@BuildCommand(help = CleanCommand.Help.class) @BuildCommand(help = CleanCommand.Help.class)
public void clean() public void clean()
throws Exception { throws Exception {
@ -55,6 +60,10 @@ public abstract class Project extends BuildExecutor {
new RunCommand(this).execute(); new RunCommand(this).execute();
} }
/*
* Useful methods
*/
public static VersionNumber version(int major) { public static VersionNumber version(int major) {
return new VersionNumber(major); return new VersionNumber(major);
} }
@ -76,7 +85,7 @@ public abstract class Project extends BuildExecutor {
} }
public DependencySet scope(Scope scope) { public DependencySet scope(Scope scope) {
return dependencies_.scope(scope); return dependencies.scope(scope);
} }
public static Dependency dependency(String groupId, String artifactId) { public static Dependency dependency(String groupId, String artifactId) {
@ -95,56 +104,142 @@ public abstract class Project extends BuildExecutor {
return new Dependency(groupId, artifactId, version, classifier, type); return new Dependency(groupId, artifactId, version, classifier, type);
} }
public static String joinPaths(List<String> paths) {
return StringUtils.join(paths, File.pathSeparator);
}
/* /*
* Project directories * Project directories
*/ */
public File srcDirectory() {
return new File("src");
}
public File srcMainDirectory() {
return new File(srcDirectory(), "main");
}
public File srcMainJavaDirectory() { public File srcMainJavaDirectory() {
return Path.of("src", "main", "java").toFile(); return new File(srcMainDirectory(), "java");
}
public File srcMainResourcesDirectory() {
return new File(srcMainDirectory(), "resources");
}
public File srcMainResourcesTemplatesDirectory() {
return new File(srcMainResourcesDirectory(), "templates");
}
public File srcMainWebappDirectory() {
return new File(srcMainDirectory(), "webapp");
}
public File srcProjectDirectory() {
return new File(srcDirectory(), "project");
} }
public File srcProjectJavaDirectory() { public File srcProjectJavaDirectory() {
return Path.of("src", "project", "java").toFile(); return new File(srcProjectDirectory(), "java");
}
public File srcTestJDirectory() {
return new File(srcDirectory(), "test");
} }
public File srcTestJavaDirectory() { public File srcTestJavaDirectory() {
return Path.of("src", "test", "java").toFile(); return new File(srcTestJDirectory(), "java");
}
public File libDirectory() {
return new File("lib");
} }
public File libCompileDirectory() { public File libCompileDirectory() {
return Path.of("lib", "compile").toFile(); return new File(libDirectory(), "compile");
} }
public File libProjectDirectory() { public File libProjectDirectory() {
return Path.of("lib", "project").toFile(); return new File(libDirectory(), "project");
} }
public File libRuntimeDirectory() { public File libRuntimeDirectory() {
return Path.of("lib", "runtime").toFile(); return new File(libDirectory(), "runtime");
} }
public File libStandaloneDirectory() { public File libStandaloneDirectory() {
return Path.of("lib", "standalone").toFile(); return new File(libDirectory(), "standalone");
} }
public File libTestDirectory() { public File libTestDirectory() {
return Path.of("lib", "test").toFile(); return new File(libDirectory(), "test");
}
public File buildDirectory() {
return new File("build");
} }
public File buildDistDirectory() { public File buildDistDirectory() {
return Path.of("build", "dist").toFile(); return new File(buildDirectory(), "dist");
} }
public File buildMainDirectory() { public File buildMainDirectory() {
return Path.of("build", "main").toFile(); return new File(buildDirectory(), "main");
} }
public File buildProjectDirectory() { public File buildProjectDirectory() {
return Path.of("build", "project").toFile(); return new File(buildDirectory(), "project");
} }
public File buildTestDirectory() { public File buildTestDirectory() {
return Path.of("build", "test").toFile(); return new File(buildDirectory(), "test");
}
/*
* File collections
*/
public List<File> mainSourceFiles() {
// get all the main java sources
var src_main_java_dir_abs = srcMainJavaDirectory().getAbsoluteFile();
return FileUtils.getFileList(src_main_java_dir_abs, Pattern.compile("^.*\\.java$"), null)
.stream().map(file -> new File(src_main_java_dir_abs, file)).toList();
}
public List<File> testSourceFiles() {
// get all the test java sources
var src_test_java_dir_abs = srcTestJavaDirectory().getAbsoluteFile();
return FileUtils.getFileList(src_test_java_dir_abs, Pattern.compile("^.*\\.java$"), null)
.stream().map(file -> new File(src_test_java_dir_abs, file)).toList();
}
/*
* Project classpaths
*/
public List<String> compileClasspath() {
// detect the jar files in the compile lib directory
var lib_compile_dir_abs = libCompileDirectory().getAbsoluteFile();
var lib_compile_jar_files = FileUtils.getFileList(lib_compile_dir_abs, Pattern.compile("^.*\\.jar$"), null);
// build the compilation classpath
var compile_classpath_paths = new ArrayList<>(lib_compile_jar_files.stream().map(file -> new File(lib_compile_dir_abs, file).getAbsolutePath()).toList());
compile_classpath_paths.add(0, buildMainDirectory().getAbsolutePath());
return compile_classpath_paths;
}
public List<String> testClasspath() {
// detect the jar files in the test lib directory
var lib_test_dir_abs = libTestDirectory().getAbsoluteFile();
var lib_test_jar_files = FileUtils.getFileList(lib_test_dir_abs, Pattern.compile("^.*\\.jar$"), null);
// build the test classpath
var test_classpath_paths = new ArrayList<>(lib_test_jar_files.stream().map(file -> new File(lib_test_dir_abs, file).getAbsolutePath()).toList());
test_classpath_paths.addAll(0, compileClasspath());
return test_classpath_paths;
} }
public void start(String[] args) { public void start(String[] args) {

View file

@ -20,33 +20,33 @@ public class CleanCommand {
} }
} }
private final Project project_; public final Project project;
public CleanCommand(Project project) { public CleanCommand(Project project) {
project_ = project; this.project = project;
} }
public void execute() { public void execute() {
try { try {
FileUtils.deleteDirectory(project_.buildDistDirectory()); FileUtils.deleteDirectory(project.buildDistDirectory());
} catch (FileUtilsErrorException e) { } catch (FileUtilsErrorException e) {
// no-op // no-op
} }
try { try {
FileUtils.deleteDirectory(project_.buildMainDirectory()); FileUtils.deleteDirectory(project.buildMainDirectory());
} catch (FileUtilsErrorException e) { } catch (FileUtilsErrorException e) {
// no-op // no-op
} }
try { try {
FileUtils.deleteDirectory(project_.buildProjectDirectory()); FileUtils.deleteDirectory(project.buildProjectDirectory());
} catch (FileUtilsErrorException e) { } catch (FileUtilsErrorException e) {
// no-op // no-op
} }
try { try {
FileUtils.deleteDirectory(project_.buildTestDirectory()); FileUtils.deleteDirectory(project.buildTestDirectory());
} catch (FileUtilsErrorException e) { } catch (FileUtilsErrorException e) {
// no-op // no-op
} }

View file

@ -6,14 +6,12 @@ package rife.bld.commands;
import rife.bld.BuildHelp; import rife.bld.BuildHelp;
import rife.bld.Project; import rife.bld.Project;
import rife.tools.FileUtils;
import rife.tools.StringUtils; import rife.tools.StringUtils;
import javax.tools.*; import javax.tools.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
public class CompileCommand { public class CompileCommand {
public static class Help implements BuildHelp { public static class Help implements BuildHelp {
@ -29,61 +27,33 @@ public class CompileCommand {
} }
} }
private final Project project_; public final Project project;
public CompileCommand(Project project) { public CompileCommand(Project project) {
project_ = project; this.project = project;
} }
public void execute() public void execute()
throws Exception { throws Exception {
project_.buildMainDirectory().mkdirs(); project.buildMainDirectory().mkdirs();
project_.buildProjectDirectory().mkdirs(); project.buildProjectDirectory().mkdirs();
project_.buildTestDirectory().mkdirs(); project.buildTestDirectory().mkdirs();
// detect the jar files in the compile lib directory
var lib_compile_dir_abs = project_.libCompileDirectory().getAbsoluteFile();
var lib_compile_jar_files = FileUtils.getFileList(lib_compile_dir_abs, Pattern.compile("^.*\\.jar$"), null);
// detect the jar files in the test lib directory
var lib_test_dir_abs = project_.libTestDirectory().getAbsoluteFile();
var lib_test_jar_files = FileUtils.getFileList(lib_test_dir_abs, Pattern.compile("^.*\\.jar$"), null);
// get all the main java sources
var src_main_java_dir_abs = project_.srcMainJavaDirectory().getAbsoluteFile();
var main_java_files = FileUtils.getFileList(src_main_java_dir_abs, Pattern.compile("^.*\\.java$"), null)
.stream().map(file -> new File(src_main_java_dir_abs, file)).toList();
// get the main output path
var main_build_path = project_.buildMainDirectory().getAbsolutePath();
// get all the test java sources
var src_test_java_dir_abs = project_.srcTestJavaDirectory().getAbsoluteFile();
var test_java_files = FileUtils.getFileList(src_test_java_dir_abs, Pattern.compile("^.*\\.java$"), null)
.stream().map(file -> new File(src_test_java_dir_abs, file)).toList();
// get the test output path
var build_test_path = project_.buildTestDirectory().getAbsolutePath();
// build the compilation classpath
var compile_classpath_paths = new ArrayList<>(lib_compile_jar_files.stream().map(file -> new File(lib_compile_dir_abs, file).getAbsolutePath()).toList());
compile_classpath_paths.add(0, main_build_path);
var compile_classpath = StringUtils.join(compile_classpath_paths, File.pathSeparator);
// build the test classpath
var test_classpath_paths = new ArrayList<>(lib_test_jar_files.stream().map(file -> new File(lib_test_dir_abs, file).getAbsolutePath()).toList());
test_classpath_paths.addAll(0, compile_classpath_paths);
var test_classpath = StringUtils.join(test_classpath_paths, File.pathSeparator);
// compile both the main and the test java sources // compile both the main and the test java sources
var compiler = ToolProvider.getSystemJavaCompiler(); var compiler = ToolProvider.getSystemJavaCompiler();
try (var file_manager = compiler.getStandardFileManager(null, null, null)) { try (var file_manager = compiler.getStandardFileManager(null, null, null)) {
buildProjectSources(compiler, file_manager, compile_classpath, main_java_files, main_build_path); buildProjectSources(compiler, file_manager,
buildProjectSources(compiler, file_manager, test_classpath, test_java_files, build_test_path); Project.joinPaths(project.compileClasspath()),
project.mainSourceFiles(),
project.buildMainDirectory().getAbsolutePath());
buildProjectSources(compiler, file_manager,
Project.joinPaths(project.testClasspath()),
project.testSourceFiles(),
project.buildTestDirectory().getAbsolutePath());
} }
} }
private static void buildProjectSources(JavaCompiler compiler, StandardJavaFileManager fileManager, String classpath, List<File> sources, String destination) public void buildProjectSources(JavaCompiler compiler, StandardJavaFileManager fileManager, String classpath, List<File> sources, String destination)
throws IOException { throws IOException {
var compilation_units = fileManager.getJavaFileObjectsFromFiles(sources); var compilation_units = fileManager.getJavaFileObjectsFromFiles(sources);
var diagnostics = new DiagnosticCollector<JavaFileObject>(); var diagnostics = new DiagnosticCollector<JavaFileObject>();
@ -94,7 +64,7 @@ public class CompileCommand {
} }
} }
private static void outputDiagnostics(DiagnosticCollector<JavaFileObject> diagnostics) public void outputDiagnostics(DiagnosticCollector<JavaFileObject> diagnostics)
throws IOException { throws IOException {
for (var diagnostic : diagnostics.getDiagnostics()) { for (var diagnostic : diagnostics.getDiagnostics()) {
var source = diagnostic.getSource().getCharContent(true).toString(); var source = diagnostic.getSource().getCharContent(true).toString();

View file

@ -32,8 +32,6 @@ public class CreateCommand {
} }
} }
public static final String NAME = "create";
private final String packageName_; private final String packageName_;
private final String projectName_; private final String projectName_;
@ -142,7 +140,7 @@ public class CreateCommand {
downloadDependencies(); downloadDependencies();
} }
private void createProjectStructure() { public void createProjectStructure() {
projectDir_.mkdirs(); projectDir_.mkdirs();
srcMainJavaDir_.mkdirs(); srcMainJavaDir_.mkdirs();
srcMainResourcesTemplatesDir_.mkdirs(); srcMainResourcesTemplatesDir_.mkdirs();
@ -163,7 +161,7 @@ public class CreateCommand {
testPackageDir_.mkdirs(); testPackageDir_.mkdirs();
} }
private void populateProjectStructure() public void populateProjectStructure()
throws FileUtilsErrorException { throws FileUtilsErrorException {
// project gitignore // project gitignore
FileUtils.writeString( FileUtils.writeString(
@ -231,7 +229,7 @@ public class CreateCommand {
build_sh_file.setExecutable(true); build_sh_file.setExecutable(true);
} }
private void populateIdeaProject() public void populateIdeaProject()
throws FileUtilsErrorException { throws FileUtilsErrorException {
// IDEA project files // IDEA project files
FileUtils.writeString( FileUtils.writeString(
@ -277,7 +275,7 @@ public class CreateCommand {
FileUtils.writeString(run_tests_template.getContent(), run_tests_file); FileUtils.writeString(run_tests_template.getContent(), run_tests_file);
} }
private void downloadDependencies() { public void downloadDependencies() {
for (var dependency : NewProjectInfo.DEPENDENCIES.get(Scope.compile)) { for (var dependency : NewProjectInfo.DEPENDENCIES.get(Scope.compile)) {
new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency) new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency)
.downloadTransitivelyIntoFolder(libCompileDir_, Scope.compile); .downloadTransitivelyIntoFolder(libCompileDir_, Scope.compile);

View file

@ -19,42 +19,42 @@ public class DownloadCommand {
} }
} }
private final Project project_; public final Project project;
public DownloadCommand(Project project) { public DownloadCommand(Project project) {
project_ = project; this.project = project;
} }
public void execute() { public void execute() {
var compile_deps = NewProjectInfo.DEPENDENCIES.get(Scope.compile); var compile_deps = project.dependencies.get(Scope.compile);
if (compile_deps != null) { if (compile_deps != null) {
for (var dependency : compile_deps) { for (var dependency : compile_deps) {
new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency) new DependencyResolver(project.repositories, dependency)
.downloadTransitivelyIntoFolder(project_.libCompileDirectory(), Scope.compile); .downloadTransitivelyIntoFolder(project.libCompileDirectory(), Scope.compile);
} }
} }
var runtime_deps = NewProjectInfo.DEPENDENCIES.get(Scope.runtime); var runtime_deps = project.dependencies.get(Scope.runtime);
if (runtime_deps != null) { if (runtime_deps != null) {
for (var dependency : runtime_deps) { for (var dependency : runtime_deps) {
new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency) new DependencyResolver(project.repositories, dependency)
.downloadTransitivelyIntoFolder(project_.libRuntimeDirectory(), Scope.runtime); .downloadTransitivelyIntoFolder(project.libRuntimeDirectory(), Scope.runtime);
} }
} }
var standalone_deps = NewProjectInfo.DEPENDENCIES.get(Scope.standalone); var standalone_deps = project.dependencies.get(Scope.standalone);
if (standalone_deps != null) { if (standalone_deps != null) {
for (var dependency : standalone_deps) { for (var dependency : standalone_deps) {
new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency) new DependencyResolver(project.repositories, dependency)
.downloadTransitivelyIntoFolder(project_.libStandaloneDirectory(), Scope.compile, Scope.runtime); .downloadTransitivelyIntoFolder(project.libStandaloneDirectory(), Scope.compile, Scope.runtime);
} }
} }
var test_deps = NewProjectInfo.DEPENDENCIES.get(Scope.test); var test_deps = project.dependencies.get(Scope.test);
if (test_deps != null) { if (test_deps != null) {
for (var dependency : test_deps) { for (var dependency : test_deps) {
new DependencyResolver(NewProjectInfo.REPOSITORIES, dependency) new DependencyResolver(project.repositories, dependency)
.downloadTransitivelyIntoFolder(project_.libTestDirectory(), Scope.compile, Scope.runtime); .downloadTransitivelyIntoFolder(project.libTestDirectory(), Scope.compile, Scope.runtime);
} }
} }
} }

View file

@ -7,7 +7,6 @@ package rife.bld.commands;
import rife.Version; import rife.Version;
import rife.bld.*; import rife.bld.*;
import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.List;
import static java.util.Comparator.comparingInt; import static java.util.Comparator.comparingInt;
@ -38,7 +37,7 @@ public class HelpCommand {
boolean print_full_help = true; boolean print_full_help = true;
try { try {
var commands = executor_.getBuildCommands(); var commands = executor_.buildCommands();
if (commands.containsKey(topic)) { if (commands.containsKey(topic)) {
var method = commands.get(topic); var method = commands.get(topic);
var annotation = method.getAnnotation(BuildCommand.class); var annotation = method.getAnnotation(BuildCommand.class);
@ -66,7 +65,7 @@ public class HelpCommand {
public void printFullHelp() public void printFullHelp()
throws Exception { throws Exception {
var commands = executor_.getBuildCommands(); var commands = executor_.buildCommands();
System.err.println(""" System.err.println("""
The RIFE2 CLI provides its features through a series of commands that The RIFE2 CLI provides its features through a series of commands that
@ -78,6 +77,7 @@ public class HelpCommand {
The following commands are supported. The following commands are supported.
"""); """);
// test
// jar Creates an uberJar archive for a RIFE2 application // jar Creates an uberJar archive for a RIFE2 application
// war Creates a war archive for a RIFE2 application // war Creates a war archive for a RIFE2 application

View file

@ -22,12 +22,13 @@ public class RunCommand {
} }
} }
private final Project project_; public final Project project;
public RunCommand(Project project) { public RunCommand(Project project) {
project_ = project; this.project = project;
} }
public void execute() { public void execute() {
} }
} }