Skip to content

Commit 52bb833

Browse files
Merge pull request BuildCLI#204 from BuildCLI/develop
Develop to main
2 parents 2c49512 + b922ba2 commit 52bb833

File tree

12 files changed

+291
-129
lines changed

12 files changed

+291
-129
lines changed

src/main/java/org/buildcli/OptionCommand.java

Lines changed: 0 additions & 69 deletions
This file was deleted.

src/main/java/org/buildcli/OptionCommandMap.java

Lines changed: 0 additions & 49 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.buildcli.actions.commandline;
2+
3+
public abstract class BuildTool {
4+
public abstract int run();
5+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.buildcli.actions.commandline;
2+
3+
import org.buildcli.constants.GradleConstants;
4+
import org.buildcli.utils.GradleInstaller;
5+
6+
import java.io.IOException;
7+
import java.util.ArrayList;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
import static org.buildcli.utils.tools.ToolChecks.checksGradle;
12+
13+
public class GradleProcess extends BuildTool implements CommandLineProcess {
14+
private final List<String> commands = new ArrayList<>();
15+
16+
private GradleProcess() {
17+
if (!checksGradle()) {
18+
GradleInstaller.installGradle();
19+
}
20+
21+
commands.add(GradleConstants.GRADLE_CMD);
22+
}
23+
24+
public static GradleProcess createProcessor(String... tasks) {
25+
var processor = new GradleProcess();
26+
processor.commands.addAll(Arrays.asList(tasks));
27+
return processor;
28+
}
29+
30+
public static GradleProcess createPackageProcessor() {
31+
return createProcessor("clean", "build");
32+
}
33+
34+
public static GradleProcess createCompileProcessor() {
35+
return createProcessor("clean", "classes");
36+
}
37+
38+
@Override
39+
public int run() {
40+
try {
41+
return new ProcessBuilder().command(commands).inheritIO().start().waitFor();
42+
} catch (IOException | InterruptedException e) {
43+
throw new RuntimeException(e);
44+
}
45+
}
46+
}

src/main/java/org/buildcli/actions/commandline/MavenProcess.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import static org.buildcli.utils.tools.ToolChecks.checksMaven;
1212

13-
public class MavenProcess implements CommandLineProcess {
13+
public class MavenProcess extends BuildTool implements CommandLineProcess {
1414
private final List<String> commands = new ArrayList<>();
1515

1616
private MavenProcess() {
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.buildcli.commands.project;
22

3+
import org.buildcli.actions.commandline.BuildTool;
4+
import org.buildcli.actions.commandline.GradleProcess;
35
import org.buildcli.actions.commandline.MavenProcess;
46
import org.buildcli.domain.BuildCLICommand;
7+
import org.buildcli.utils.tools.ToolChecks;
58
import picocli.CommandLine.Command;
69
import picocli.CommandLine.Option;
710

@@ -14,22 +17,30 @@ public class BuildCommand implements BuildCLICommand {
1417
@Option(names = {"--compileOnly", "--compile", "-c"}, description = "", defaultValue = "false")
1518
private boolean compileOnly;
1619

20+
private String projectBuild = ToolChecks.checkIsMavenOrGradle();
1721

1822
@Override
1923
public void run() {
20-
MavenProcess process;
24+
25+
if (projectBuild.equals("Neither")) {
26+
logger.severe("Neither Maven nor Gradle project detected. Please ensure one of these build files (pom.xml or build.gradle) exists.");
27+
return;
28+
}
29+
30+
BuildTool process;
31+
2132
if (compileOnly) {
22-
process = MavenProcess.createCompileProcessor();
33+
process = projectBuild.equals("Maven") ? MavenProcess.createCompileProcessor() : GradleProcess.createCompileProcessor();
2334
} else {
24-
process = MavenProcess.createPackageProcessor();
35+
process = projectBuild.equals("Maven") ? MavenProcess.createPackageProcessor() : GradleProcess.createPackageProcessor();
2536
}
2637

2738
int exitCode = process.run();
2839

2940
if (exitCode == 0) {
30-
logger.info("Project compiled successfully. JAR file generated in target directory.");
41+
logger.info("Project built successfully.");
3142
} else {
32-
logger.severe("Failed to compile project. Maven exited with code: " + exitCode);
43+
logger.severe("Failed to build project. Process exited with code: " + exitCode);
3344
}
3445
}
35-
}
46+
}

src/main/java/org/buildcli/commands/project/InitCommand.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
public class InitCommand implements BuildCLICommand {
2222
@Option(names = {"--name", "-n"}, defaultValue = "buildcli")
2323
private String projectName;
24+
@Option(names = {"--jdk", "-j"}, defaultValue = "17")
25+
private String jdkVersion;
2426

2527
@Override
2628
public void run() {
@@ -96,8 +98,8 @@ private void createPomFile(String projectName) throws IOException {
9698
<version>1.0-SNAPSHOT</version>
9799
98100
<properties>
99-
<maven.compiler.source>17</maven.compiler.source>
100-
<maven.compiler.target>17</maven.compiler.target>
101+
<maven.compiler.source>%s</maven.compiler.source>
102+
<maven.compiler.target>${maven.compiler.source}</maven.compiler.target>
101103
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
102104
</properties>
103105
@@ -136,7 +138,7 @@ private void createPomFile(String projectName) throws IOException {
136138
</plugins>
137139
</build>
138140
</project>
139-
""".formatted(projectName.toLowerCase(), projectName, projectName.toLowerCase()));
141+
""".formatted(projectName.toLowerCase(), projectName, jdkVersion, projectName.toLowerCase()));
140142
}
141143
SystemOutLogger.log("pom.xml file created with default configuration.");
142144
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package org.buildcli.commands.project;
22

33
import org.buildcli.commands.project.update.DependencyCommand;
4+
import org.buildcli.commands.project.update.JDKCommand;
45
import org.buildcli.commands.project.update.VersionCommand;
56
import picocli.CommandLine.Command;
67

78
@Command(name = "update", aliases = {"up"}, description = "Updates project versions and dependencies.", mixinStandardHelpOptions = true,
8-
subcommands = {VersionCommand.class, DependencyCommand.class}
9+
subcommands = {VersionCommand.class, DependencyCommand.class, JDKCommand.class}
910
)
1011
public class UpdateCommand {
1112
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.buildcli.commands.project.update;
2+
3+
import java.util.logging.Level;
4+
import java.util.logging.Logger;
5+
6+
import javax.xml.XMLConstants;
7+
import javax.xml.parsers.DocumentBuilderFactory;
8+
import javax.xml.transform.TransformerFactory;
9+
import javax.xml.transform.dom.DOMSource;
10+
import javax.xml.transform.stream.StreamResult;
11+
12+
import org.buildcli.commands.project.BuildCommand;
13+
import org.buildcli.constants.MavenConstants;
14+
import org.buildcli.domain.BuildCLICommand;
15+
import org.buildcli.log.SystemOutLogger;
16+
17+
import picocli.CommandLine.Command;
18+
import picocli.CommandLine.Option;
19+
20+
@Command(name = "jdk", description = "Updates JDK version of the project.", mixinStandardHelpOptions = true)
21+
public class JDKCommand implements BuildCLICommand {
22+
private static final Logger logger = Logger.getLogger(JDKCommand.class.getName());
23+
@Option(names = {"--recomp", "-r"}, description = "Rebuilds the project with the new JDK version.", defaultValue = "false")
24+
private boolean recomp;
25+
@Option(names = {"--jdkver", "-jv"}, description = "The JDK version to update to.", defaultValue = "17")
26+
private String version;
27+
28+
@Override
29+
public void run() {
30+
try {
31+
var docFactory = DocumentBuilderFactory.newInstance();
32+
docFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
33+
var xmlDoc = docFactory.newDocumentBuilder().parse(MavenConstants.FILE);
34+
35+
var node = xmlDoc.getElementsByTagName("maven.compiler.source").item(0);
36+
node.setTextContent(version);
37+
38+
var transformFactory = TransformerFactory.newInstance();
39+
transformFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
40+
var transformer = transformFactory.newTransformer();
41+
42+
try {
43+
transformer.transform(new DOMSource(xmlDoc), new StreamResult(MavenConstants.FILE));
44+
SystemOutLogger.log("JDK version updated in pom.xml");
45+
} catch (Exception e) {
46+
logger.log(Level.SEVERE, "Error updating JDK version in pom.xml", e);
47+
}
48+
} catch (Exception e) {
49+
logger.log(Level.SEVERE, "Error updating JDK version in pom.xml", e);
50+
}
51+
52+
if (recomp) {
53+
SystemOutLogger.log("Rebuilding project with new java version");
54+
new BuildCommand().run();
55+
}
56+
}
57+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.buildcli.constants;
2+
3+
import org.buildcli.utils.OS;
4+
5+
public class GradleConstants {
6+
public static final String GRADLE_CMD_WINDOWS = "gradle.bat";
7+
public static final String GRADLE_CMD_UNIX = "gradle";
8+
public static final String GRADLE_CMD = OS.isWindows() ? GRADLE_CMD_WINDOWS : GRADLE_CMD_UNIX;
9+
public static final String FILE = "build.gradle";
10+
public static final String DEPENDENCIES_PATTERN = "##dependencies##";
11+
public static final String BUILD_DIR = "build";
12+
}

0 commit comments

Comments
 (0)