diff --git a/src/main/java/rife/bld/BuildExecutor.java b/src/main/java/rife/bld/BuildExecutor.java index cda33b1..7310cfa 100644 --- a/src/main/java/rife/bld/BuildExecutor.java +++ b/src/main/java/rife/bld/BuildExecutor.java @@ -37,10 +37,13 @@ public class BuildExecutor { private static final String ARG_HELP3 = "-?"; private static final String ARG_STACKTRACE1 = "--stacktrace"; private static final String ARG_STACKTRACE2 = "-s"; + private static final String ARG_VERBOSE1 = "--verbose"; + private static final String ARG_VERBOSE2 = "-v"; private final HierarchicalProperties properties_; private List arguments_ = Collections.emptyList(); private boolean offline_ = false; + private boolean verbose_ = false; private Map buildCommands_ = null; private Map buildAliases_ = null; private final AtomicReference currentCommandName_ = new AtomicReference<>(); @@ -135,6 +138,18 @@ public class BuildExecutor { return offline_; } + /** + * Returns whether the bld execution should output detailed information + * about the operations it performs. + * + * @return {@code true} if the execution is verbose; + * or {@code false} otherwise + * @since 2.3.1 + */ + public boolean verbose() { + return verbose_; + } + /** * Returns the properties uses for bld execution. * @@ -227,6 +242,7 @@ public class BuildExecutor { var show_help = false; show_help |= arguments_.removeAll(List.of(ARG_HELP1, ARG_HELP2, ARG_HELP3)); showStacktrace = arguments_.removeAll(List.of(ARG_STACKTRACE1, ARG_STACKTRACE2)); + verbose_ = arguments_.removeAll(List.of(ARG_VERBOSE1, ARG_VERBOSE2)); if (show_help) { new HelpOperation(this, Collections.emptyList()).execute(); diff --git a/src/main/java/rife/bld/Cli.java b/src/main/java/rife/bld/Cli.java index 2ab14b1..cb9de31 100644 --- a/src/main/java/rife/bld/Cli.java +++ b/src/main/java/rife/bld/Cli.java @@ -32,7 +32,7 @@ public class Cli extends BuildExecutor { @BuildCommand(help = CreateHelp.class) public void create() throws Exception { - createOperation_.fromArguments(arguments()).execute(); + createOperation_.fromArguments(arguments()).verbose(verbose()).execute(); } /** @@ -44,7 +44,7 @@ public class Cli extends BuildExecutor { @BuildCommand(value = "create-app", alias = "create-blank", help = CreateAppHelp.class) public void createApp() throws Exception { - createAppOperation_.executeOnce(() -> createAppOperation_.fromArguments(arguments())); + createAppOperation_.executeOnce(() -> createAppOperation_.verbose(verbose()).fromArguments(arguments())); } /** @@ -56,7 +56,7 @@ public class Cli extends BuildExecutor { @BuildCommand(value = "create-base", help = CreateBaseHelp.class) public void createBase() throws Exception { - createBaseOperation_.executeOnce(() -> createBaseOperation_.fromArguments(arguments())); + createBaseOperation_.executeOnce(() -> createBaseOperation_.verbose(verbose()).fromArguments(arguments())); } /** @@ -68,7 +68,7 @@ public class Cli extends BuildExecutor { @BuildCommand(value = "create-lib", help = CreateLibHelp.class) public void createLib() throws Exception { - createLibOperation_.executeOnce(() -> createLibOperation_.fromArguments(arguments())); + createLibOperation_.executeOnce(() -> createLibOperation_.verbose(verbose()).fromArguments(arguments())); } /** @@ -80,7 +80,7 @@ public class Cli extends BuildExecutor { @BuildCommand(value = "create-rife2", help = CreateRife2Help.class) public void createRife2() throws Exception { - createRife2Operation_.executeOnce(() -> createRife2Operation_.fromArguments(arguments())); + createRife2Operation_.executeOnce(() -> createRife2Operation_.verbose(verbose()).fromArguments(arguments())); } /** diff --git a/src/main/java/rife/bld/Project.java b/src/main/java/rife/bld/Project.java index 5fdd0e7..4d49a37 100644 --- a/src/main/java/rife/bld/Project.java +++ b/src/main/java/rife/bld/Project.java @@ -147,6 +147,7 @@ public class Project extends BaseProject { public void jarSources() throws Exception { jarSourcesOperation().executeOnce(() -> jarSourcesOperation() + .verbose(verbose()) .manifestAttributes(Map.of(Attributes.Name.MANIFEST_VERSION, "1.0")) .sourceDirectories(List.of(srcMainJavaDirectory())) .destinationDirectory(buildDistDirectory()) @@ -163,7 +164,9 @@ public class Project extends BaseProject { throws Exception { compile(); javadoc(); - jarJavadocOperation().executeOnce(() -> jarJavadocOperation().manifestAttributes(Map.of(Attributes.Name.MANIFEST_VERSION, "1.0")) + jarJavadocOperation().executeOnce(() -> jarJavadocOperation() + .verbose(verbose()) + .manifestAttributes(Map.of(Attributes.Name.MANIFEST_VERSION, "1.0")) .sourceDirectories(List.of(buildJavadocDirectory())) .destinationDirectory(buildDistDirectory()) .destinationFileName(javadocJarFileName())); diff --git a/src/main/java/rife/bld/operations/AbstractCreateOperation.java b/src/main/java/rife/bld/operations/AbstractCreateOperation.java index 6ecf673..8758843 100644 --- a/src/main/java/rife/bld/operations/AbstractCreateOperation.java +++ b/src/main/java/rife/bld/operations/AbstractCreateOperation.java @@ -164,14 +164,44 @@ public abstract class AbstractCreateOperation> { private boolean silent_ = false; + private boolean verbose_ = false; private boolean executed_ = false; /** @@ -40,6 +41,39 @@ public abstract class AbstractOperation> { return silent_; } + /** + * Changes whether the operation should output detailed information about + * what it's doing. + *

+ * Defaults to not verbose. + *

+ * Verbosity is independent from silence: the {@code silent} setting + * suppresses an operation's regular output, while the {@code verbose} + * setting adds detailed output about the individual steps an operation + * performs. + * + * @param verbose {@code true} if the operation should be verbose; + * {@code false} otherwise + * @return this operation instance + * @since 2.3.1 + */ + public T verbose(boolean verbose) { + verbose_ = verbose; + return (T) this; + } + + /** + * Indicates whether the operation should output detailed information about + * what it's doing. + * + * @return {@code true} if the operation should be verbose; + * {@code false} otherwise + * @since 2.3.1 + */ + public boolean verbose() { + return verbose_; + } + /** * Ensures that this operation instance is executed once and only once. * diff --git a/src/main/java/rife/bld/operations/AbstractProcessOperation.java b/src/main/java/rife/bld/operations/AbstractProcessOperation.java index ef8a9a6..c1cfc4e 100644 --- a/src/main/java/rife/bld/operations/AbstractProcessOperation.java +++ b/src/main/java/rife/bld/operations/AbstractProcessOperation.java @@ -84,7 +84,13 @@ public abstract class AbstractProcessOperation new IllegalStateException("No " + toolName_ + " tool found.")); + if (verbose()) { + System.out.println("Executing command: " + tool.name() + ' ' + String.join(" ", toolArgs_)); + } + var status = tool.run(System.out, System.err, toolArgs_.toArray(new String[0])); if (status != 0) { System.out.println(tool.name() + ' ' + String.join(" ", toolArgs_)); diff --git a/src/main/java/rife/bld/operations/CleanOperation.java b/src/main/java/rife/bld/operations/CleanOperation.java index e4a07ae..7a29639 100644 --- a/src/main/java/rife/bld/operations/CleanOperation.java +++ b/src/main/java/rife/bld/operations/CleanOperation.java @@ -43,6 +43,9 @@ public class CleanOperation extends AbstractOperation { */ protected void executeCleanDirectory(File directory) { try { + if (verbose() && directory.exists()) { + System.out.println("Deleting directory '" + directory.getAbsolutePath() + "'"); + } FileUtils.deleteDirectory(directory); } catch (FileUtilsErrorException e) { // no-op @@ -56,8 +59,9 @@ public class CleanOperation extends AbstractOperation { * @since 1.5 */ public CleanOperation fromProject(BaseProject project) { - return directories(project.buildDirectory() - .listFiles(f -> !f.equals(project.buildBldDirectory()))); + return verbose(project.verbose()) + .directories(project.buildDirectory() + .listFiles(f -> !f.equals(project.buildBldDirectory()))); } /** diff --git a/src/main/java/rife/bld/operations/CompileOperation.java b/src/main/java/rife/bld/operations/CompileOperation.java index 8a3f3c5..5e6edc3 100644 --- a/src/main/java/rife/bld/operations/CompileOperation.java +++ b/src/main/java/rife/bld/operations/CompileOperation.java @@ -85,7 +85,14 @@ public class CompileOperation extends AbstractOperation { throws IOException { var sources = new ArrayList<>(mainSourceFiles()); for (var directory : mainSourceDirectories()) { - sources.addAll(FileUtils.getJavaFileList(directory)); + var found = FileUtils.getJavaFileList(directory); + if (verbose()) { + var dir_abs = directory.getAbsoluteFile(); + for (var source : found) { + System.out.println("Found main source file '" + dir_abs.toPath().relativize(source.toPath()) + "' in '" + dir_abs + "'"); + } + } + sources.addAll(found); } if (sources.isEmpty()) { @@ -110,7 +117,14 @@ public class CompileOperation extends AbstractOperation { throws IOException { var sources = new ArrayList<>(testSourceFiles()); for (var directory : testSourceDirectories()) { - sources.addAll(FileUtils.getJavaFileList(directory)); + var found = FileUtils.getJavaFileList(directory); + if (verbose()) { + var dir_abs = directory.getAbsoluteFile(); + for (var source : found) { + System.out.println("Found test source file '" + dir_abs.toPath().relativize(source.toPath()) + "' in '" + dir_abs + "'"); + } + } + sources.addAll(found); } if (sources.isEmpty()) { @@ -141,6 +155,12 @@ public class CompileOperation extends AbstractOperation { return; } + if (verbose()) { + for (var source : sources) { + System.out.println("Compiling source '" + source.getAbsolutePath() + "' into '" + destination.getAbsolutePath() + "'"); + } + } + var compiler = ToolProvider.getSystemJavaCompiler(); try (var file_manager = compiler.getStandardFileManager(null, null, null)) { var compilation_units = file_manager.getJavaFileObjectsFromFiles(sources); @@ -221,7 +241,8 @@ public class CompileOperation extends AbstractOperation { * @since 1.5 */ public CompileOperation fromProject(BaseProject project) { - var operation = buildMainDirectory(project.buildMainDirectory()) + var operation = verbose(project.verbose()) + .buildMainDirectory(project.buildMainDirectory()) .buildTestDirectory(project.buildTestDirectory()) .compileMainClasspath(project.compileMainClasspath()) .compileTestClasspath(project.compileTestClasspath()) diff --git a/src/main/java/rife/bld/operations/HelpOperation.java b/src/main/java/rife/bld/operations/HelpOperation.java index 94d80ca..f1de662 100644 --- a/src/main/java/rife/bld/operations/HelpOperation.java +++ b/src/main/java/rife/bld/operations/HelpOperation.java @@ -193,6 +193,7 @@ public class HelpOperation { -?, -h, --help Shows the help -D= Sets a JVM system property -s, --stacktrace Prints out the stacktrace for exceptions + -v, --verbose Prints out detailed information about the operations """); } } \ No newline at end of file diff --git a/src/main/java/rife/bld/operations/JarOperation.java b/src/main/java/rife/bld/operations/JarOperation.java index 9e8e869..7b40e33 100644 --- a/src/main/java/rife/bld/operations/JarOperation.java +++ b/src/main/java/rife/bld/operations/JarOperation.java @@ -108,6 +108,10 @@ public class JarOperation extends AbstractOperation { */ protected void executeAddFileToJar(JarOutputStream jar, NamedFile file) throws IOException { + if (verbose()) { + System.out.println("Adding '" + file.file().getAbsolutePath() + "' to jar as '" + file.name().replace('\\', '/') + "'"); + } + var entry = new JarEntry(file.name().replace('\\', '/')); entry.setTime(file.file().lastModified()); jar.putNextEntry(entry); @@ -128,7 +132,8 @@ public class JarOperation extends AbstractOperation { * @since 1.5 */ public JarOperation fromProject(BaseProject project) { - return manifestAttributes(Map.of(Attributes.Name.MANIFEST_VERSION, "1.0")) + return verbose(project.verbose()) + .manifestAttributes(Map.of(Attributes.Name.MANIFEST_VERSION, "1.0")) .sourceDirectories(project.buildMainDirectory(), project.srcMainResourcesDirectory()) .destinationDirectory(project.buildDistDirectory()) .destinationFileName(project.jarFileName()) diff --git a/src/main/java/rife/bld/operations/JavadocOperation.java b/src/main/java/rife/bld/operations/JavadocOperation.java index b754b67..9de237c 100644 --- a/src/main/java/rife/bld/operations/JavadocOperation.java +++ b/src/main/java/rife/bld/operations/JavadocOperation.java @@ -102,6 +102,12 @@ public class JavadocOperation extends AbstractOperation { } } + if (verbose()) { + for (var source : filtered_sources) { + System.out.println("Documenting source '" + source.getAbsolutePath() + "' into '" + destination.getAbsolutePath() + "'"); + } + } + var documentation = ToolProvider.getSystemDocumentationTool(); try (var file_manager = documentation.getStandardFileManager(null, null, null)) { var compilation_units = file_manager.getJavaFileObjectsFromFiles(filtered_sources); @@ -152,7 +158,8 @@ public class JavadocOperation extends AbstractOperation { * @since 1.5.10 */ public JavadocOperation fromProject(BaseProject project) { - var operation = buildDirectory(project.buildJavadocDirectory()) + var operation = verbose(project.verbose()) + .buildDirectory(project.buildJavadocDirectory()) .classpath(project.compileMainClasspath()) .classpath(project.buildMainDirectory().getAbsolutePath()) .modulePath(project.compileMainModulePath()) diff --git a/src/main/java/rife/bld/operations/RunOperation.java b/src/main/java/rife/bld/operations/RunOperation.java index db18a26..e2ec51f 100644 --- a/src/main/java/rife/bld/operations/RunOperation.java +++ b/src/main/java/rife/bld/operations/RunOperation.java @@ -65,7 +65,8 @@ public class RunOperation extends AbstractProcessOperation { * @since 1.5 */ public RunOperation fromProject(BaseProject project) { - var operation = workDirectory(project.workDirectory()) + var operation = verbose(project.verbose()) + .workDirectory(project.workDirectory()) .javaTool(project.javaTool()) .classpath(project.runClasspath()) .modulePath(project.runModulePath()) diff --git a/src/main/java/rife/bld/operations/TestOperation.java b/src/main/java/rife/bld/operations/TestOperation.java index 5fcd5b5..90686ef 100644 --- a/src/main/java/rife/bld/operations/TestOperation.java +++ b/src/main/java/rife/bld/operations/TestOperation.java @@ -72,7 +72,8 @@ public class TestOperation, O extends List * @since 1.5 */ public T fromProject(BaseProject project) { - var operation = workDirectory(project.workDirectory()) + var operation = verbose(project.verbose()) + .workDirectory(project.workDirectory()) .javaTool(project.javaTool()) .classpath(project.testClasspath()) .modulePath(project.testModulePath()); diff --git a/src/main/java/rife/bld/operations/UberJarOperation.java b/src/main/java/rife/bld/operations/UberJarOperation.java index ee5f20a..760f842 100644 --- a/src/main/java/rife/bld/operations/UberJarOperation.java +++ b/src/main/java/rife/bld/operations/UberJarOperation.java @@ -60,6 +60,9 @@ public class UberJarOperation extends AbstractOperation { protected void executeCollectSourceJarContents(File stagingDirectory) throws FileUtilsErrorException { for (var jar : jarSourceFiles()) { + if (verbose()) { + System.out.println("Unpacking jar '" + jar.getAbsolutePath() + "'"); + } FileUtils.unzipFile(jar, stagingDirectory); } } @@ -73,6 +76,9 @@ public class UberJarOperation extends AbstractOperation { throws FileUtilsErrorException { for (var named_file : sourceDirectories()) { if (named_file.file().exists()) { + if (verbose()) { + System.out.println("Collecting resources from '" + named_file.file().getAbsolutePath() + "'"); + } var destination_file = new File(stagingDirectory, named_file.name()); destination_file.mkdirs(); FileUtils.copyDirectory(named_file.file(), destination_file); @@ -91,6 +97,7 @@ public class UberJarOperation extends AbstractOperation { existing_manifest.delete(); new JarOperation() + .verbose(verbose()) .manifestAttributes(Map.of( Attributes.Name.MANIFEST_VERSION, "1.0", Attributes.Name.MAIN_CLASS, mainClass())) @@ -115,7 +122,8 @@ public class UberJarOperation extends AbstractOperation { jars.addAll(project.runtimeClasspathJars()); jars.add(new File(project.buildDistDirectory(), project.jarFileName())); - return jarSourceFiles(jars) + return verbose(project.verbose()) + .jarSourceFiles(jars) .destinationDirectory(project.buildDistDirectory()) .destinationFileName(project.uberJarFileName()) .mainClass(project.uberJarMainClass()); diff --git a/src/main/java/rife/bld/operations/UpgradeOperation.java b/src/main/java/rife/bld/operations/UpgradeOperation.java index 4effbc1..5c494b3 100644 --- a/src/main/java/rife/bld/operations/UpgradeOperation.java +++ b/src/main/java/rife/bld/operations/UpgradeOperation.java @@ -23,9 +23,25 @@ public class UpgradeOperation extends AbstractOperation { */ public void execute() throws IOException { - new Wrapper().createWrapperFiles(Path.of("lib", "bld").toFile(), BldVersion.getVersion()); - new Wrapper().upgradeIdeaBldLibrary(new File(".idea"), BldVersion.getVersion()); - new Wrapper().upgradeVscodeSettings(new File(".vscode"), BldVersion.getVersion()); + var bld_dir = Path.of("lib", "bld").toFile(); + var idea_dir = new File(".idea"); + var vscode_dir = new File(".vscode"); + + if (verbose()) { + System.out.println("Creating wrapper files in '" + bld_dir.getAbsolutePath() + "'"); + } + new Wrapper().createWrapperFiles(bld_dir, BldVersion.getVersion()); + + if (verbose()) { + System.out.println("Upgrading IDEA bld library in '" + idea_dir.getAbsolutePath() + "'"); + } + new Wrapper().upgradeIdeaBldLibrary(idea_dir, BldVersion.getVersion()); + + if (verbose()) { + System.out.println("Upgrading VSCode settings in '" + vscode_dir.getAbsolutePath() + "'"); + } + new Wrapper().upgradeVscodeSettings(vscode_dir, BldVersion.getVersion()); + if (!silent()) { System.out.println("The wrapper was successfully upgraded to " + BldVersion.getVersion() + "."); } diff --git a/src/main/java/rife/bld/operations/WarOperation.java b/src/main/java/rife/bld/operations/WarOperation.java index 98356e8..ad7129a 100644 --- a/src/main/java/rife/bld/operations/WarOperation.java +++ b/src/main/java/rife/bld/operations/WarOperation.java @@ -77,6 +77,9 @@ public class WarOperation extends AbstractOperation { protected void executeCopyWebappDirectory(File stagingDirectory) throws FileUtilsErrorException { if (webappDirectory() != null) { + if (verbose()) { + System.out.println("Copying webapp directory '" + webappDirectory().getAbsolutePath() + "'"); + } FileUtils.copyDirectory(webappDirectory(), stagingDirectory); } } @@ -92,6 +95,9 @@ public class WarOperation extends AbstractOperation { if (!libSourceDirectories().isEmpty()) { web_inf_lib_dir.mkdirs(); for (var dir : libSourceDirectories()) { + if (verbose()) { + System.out.println("Copying lib directory '" + dir.getAbsolutePath() + "' into 'WEB-INF/lib'"); + } FileUtils.copyDirectory(dir, web_inf_lib_dir); } } @@ -99,6 +105,9 @@ public class WarOperation extends AbstractOperation { if (!jarSourceFiles().isEmpty()) { web_inf_lib_dir.mkdirs(); for (var file : jarSourceFiles()) { + if (verbose()) { + System.out.println("Copying jar '" + file.file().getAbsolutePath() + "' into 'WEB-INF/lib' as '" + file.name() + "'"); + } FileUtils.copy(file.file(), new File(web_inf_lib_dir, file.name())); } } @@ -115,6 +124,9 @@ public class WarOperation extends AbstractOperation { if (!classesSourceDirectories().isEmpty()) { web_inf_classes_dir.mkdirs(); for (var dir : classesSourceDirectories()) { + if (verbose()) { + System.out.println("Copying classes directory '" + dir.getAbsolutePath() + "' into 'WEB-INF/classes'"); + } FileUtils.copyDirectory(dir, web_inf_classes_dir); } } @@ -128,6 +140,9 @@ public class WarOperation extends AbstractOperation { protected void executeCopyWebXmlFile(File stagingWebInfDirectory) throws FileUtilsErrorException { if (webXmlFile() != null) { + if (verbose()) { + System.out.println("Copying web.xml file '" + webXmlFile().getAbsolutePath() + "' into 'WEB-INF'"); + } FileUtils.copy(webXmlFile(), new File(stagingWebInfDirectory, "web.xml")); } } @@ -140,6 +155,7 @@ public class WarOperation extends AbstractOperation { protected void executeCreateWarArchive(File stagingDirectory) throws IOException { new JarOperation() + .verbose(verbose()) .sourceDirectories(stagingDirectory) .destinationDirectory(destinationDirectory()) .destinationFileName(destinationFileName()) @@ -165,7 +181,8 @@ public class WarOperation extends AbstractOperation { jar_source_files.add(new NamedFile(jar_file.getName(), jar_file)); } - return jarSourceFiles(jar_source_files) + return verbose(project.verbose()) + .jarSourceFiles(jar_source_files) .webappDirectory(project.srcMainWebappDirectory()) .destinationDirectory(project.buildDistDirectory()) .destinationFileName(project.warFileName()); diff --git a/src/test/java/rife/bld/operations/TestCleanOperation.java b/src/test/java/rife/bld/operations/TestCleanOperation.java index 77881ce..79f8d52 100644 --- a/src/test/java/rife/bld/operations/TestCleanOperation.java +++ b/src/test/java/rife/bld/operations/TestCleanOperation.java @@ -8,7 +8,9 @@ import org.junit.jupiter.api.Test; import rife.bld.WebProject; import rife.tools.FileUtils; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; import java.nio.file.Files; import java.util.List; @@ -90,6 +92,37 @@ public class TestCleanOperation { } } + @Test + void testVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var dir1 = new File(tmp, "dir1"); + var dir2 = new File(tmp, "dir2"); + dir1.mkdirs(); + dir2.mkdirs(); + + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new CleanOperation() + .verbose(true) + .directories(List.of(dir1, dir2)) + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + assertTrue(output.contains("Deleting directory '" + dir1.getAbsolutePath() + "'"), output); + assertTrue(output.contains("Deleting directory '" + dir2.getAbsolutePath() + "'"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + static class TestProject extends WebProject { public TestProject(File tmp) { workDirectory = tmp; diff --git a/src/test/java/rife/bld/operations/TestCompileOperation.java b/src/test/java/rife/bld/operations/TestCompileOperation.java index c670daa..96219aa 100644 --- a/src/test/java/rife/bld/operations/TestCompileOperation.java +++ b/src/test/java/rife/bld/operations/TestCompileOperation.java @@ -10,7 +10,9 @@ import rife.tools.FileUtils; import javax.tools.DiagnosticCollector; import javax.tools.JavaFileObject; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; import java.nio.file.Files; import java.util.List; @@ -208,6 +210,83 @@ public class TestCompileOperation { } } + @Test + void testVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var main_dir = new File(tmp, "main"); + var package_dir = new File(main_dir, "tst"); + package_dir.mkdirs(); + var source_file = new File(package_dir, "Source.java"); + FileUtils.writeString(""" + package tst; + public class Source { + } + """, source_file); + + var build_main = new File(tmp, "buildMain"); + + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new CompileOperation() + .verbose(true) + .buildMainDirectory(build_main) + .mainSourceDirectories(List.of(main_dir)) + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + assertTrue(output.contains("Found main source file '" + new File("tst", "Source.java") + "' in '" + main_dir.getAbsoluteFile() + "'"), output); + assertTrue(output.contains("Compiling source '" + source_file.getAbsolutePath() + "' into '" + build_main.getAbsolutePath() + "'"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + + @Test + void testNotVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var main_dir = new File(tmp, "main"); + var package_dir = new File(main_dir, "tst"); + package_dir.mkdirs(); + var source_file = new File(package_dir, "Source.java"); + FileUtils.writeString(""" + package tst; + public class Source { + } + """, source_file); + + var build_main = new File(tmp, "buildMain"); + + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new CompileOperation() + .buildMainDirectory(build_main) + .mainSourceDirectories(List.of(main_dir)) + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + assertFalse(output.contains("Found main source file"), output); + assertFalse(output.contains("Compiling source"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + @Test void testFromProject() throws Exception { diff --git a/src/test/java/rife/bld/operations/TestCreateBaseOperation.java b/src/test/java/rife/bld/operations/TestCreateBaseOperation.java index 379629f..1eef063 100644 --- a/src/test/java/rife/bld/operations/TestCreateBaseOperation.java +++ b/src/test/java/rife/bld/operations/TestCreateBaseOperation.java @@ -7,6 +7,9 @@ package rife.bld.operations; import org.junit.jupiter.api.Test; import rife.tools.FileUtils; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; import java.nio.file.Files; import java.util.regex.Pattern; @@ -344,4 +347,35 @@ public class TestCreateBaseOperation { FileUtils.deleteDirectory(tmp); } } + + @Test + void testVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new CreateBaseOperation() + .verbose(true) + .workDirectory(tmp) + .packageName("org.stuff") + .projectName("your-thing") + .baseName("YourThing") + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + var bld_file = new File(tmp, "your-thing/src/bld/java/org/stuff/YourThingBuild.java"); + var main_package_dir = new File(tmp, "your-thing/src/main/java/org/stuff"); + assertTrue(output.contains("Creating directory '" + main_package_dir.getAbsolutePath() + "'"), output); + assertTrue(output.contains("Creating file '" + bld_file.getAbsolutePath() + "'"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } } diff --git a/src/test/java/rife/bld/operations/TestJarOperation.java b/src/test/java/rife/bld/operations/TestJarOperation.java index 768c99d..fb4953e 100644 --- a/src/test/java/rife/bld/operations/TestJarOperation.java +++ b/src/test/java/rife/bld/operations/TestJarOperation.java @@ -8,7 +8,9 @@ import org.junit.jupiter.api.Test; import rife.bld.NamedFile; import rife.tools.FileUtils; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; import java.nio.file.Files; import java.util.List; import java.util.Map; @@ -177,6 +179,41 @@ public class TestJarOperation { } } + @Test + void testVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var source_dir = new File(tmp, "source"); + var destination_dir = new File(tmp, "destination"); + var destination_name = "archive.jar"; + + source_dir.mkdirs(); + var source1 = new File(source_dir, "source1.text"); + FileUtils.writeString("source1", source1); + + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new JarOperation() + .verbose(true) + .sourceDirectories(List.of(source_dir)) + .destinationDirectory(destination_dir) + .destinationFileName(destination_name) + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + assertTrue(output.contains("Adding '" + source1.getAbsolutePath() + "' to jar as 'source1.text'"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + @Test void testFromProject() throws Exception { diff --git a/src/test/java/rife/bld/operations/TestWarOperation.java b/src/test/java/rife/bld/operations/TestWarOperation.java index 077e2bb..72e605c 100644 --- a/src/test/java/rife/bld/operations/TestWarOperation.java +++ b/src/test/java/rife/bld/operations/TestWarOperation.java @@ -8,7 +8,9 @@ import org.junit.jupiter.api.Test; import rife.bld.NamedFile; import rife.tools.FileUtils; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; import java.nio.file.Files; import java.util.List; import java.util.jar.JarFile; @@ -106,6 +108,51 @@ public class TestWarOperation { assertEquals(destination_fileName, operation3.destinationFileName()); } + @Test + void testVerbose() + throws Exception { + var tmp = Files.createTempDirectory("test").toFile(); + try { + var webapp_dir = new File(tmp, "webapp"); + webapp_dir.mkdirs(); + FileUtils.writeString("body { }", new File(webapp_dir, "style.css")); + + var jar_file = new File(tmp, "lib.jar"); + FileUtils.writeString("not really a jar", jar_file); + + var web_xml_file = new File(tmp, "web.xml"); + FileUtils.writeString("", web_xml_file); + + var destination_dir = new File(tmp, "destination"); + + var orig_out = System.out; + var captured = new ByteArrayOutputStream(); + try { + System.setOut(new PrintStream(captured, true)); + + new WarOperation() + .verbose(true) + .webappDirectory(webapp_dir) + .jarSourceFiles(new NamedFile("lib.jar", jar_file)) + .webXmlFile(web_xml_file) + .destinationDirectory(destination_dir) + .destinationFileName("archive.war") + .execute(); + } finally { + System.setOut(orig_out); + } + + var output = captured.toString(); + assertTrue(output.contains("Copying webapp directory '" + webapp_dir.getAbsolutePath() + "'"), output); + assertTrue(output.contains("Copying jar '" + jar_file.getAbsolutePath() + "' into 'WEB-INF/lib' as 'lib.jar'"), output); + assertTrue(output.contains("Copying web.xml file '" + web_xml_file.getAbsolutePath() + "' into 'WEB-INF'"), output); + // the internal jar operation also runs verbosely + assertTrue(output.contains("' to jar as '"), output); + } finally { + FileUtils.deleteDirectory(tmp); + } + } + @Test void testFromProject() throws Exception {