Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature(custom-jhlite): setup custom npm and maven version reader to handle custom npm/java dependencies #10896

Merged
merged 16 commits into from
Sep 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
705014f
chore: remove unnecessary addition of basePackage to context, it's al…
murdos Sep 18, 2024
82f7322
feat(project-base-name): support uppercase computation
murdos Sep 18, 2024
a38b8df
feat(custom-jhlite): add tech.jhipster.lite.project steps to cucumber…
murdos Sep 18, 2024
18a1722
feat(custom-jhlite): report enhancements from cucumber module to Cucu…
murdos Sep 18, 2024
69726a2
feature(custom-jhlite): setup custom npm version source and associate…
murdos Sep 18, 2024
44f5631
test(custom-jhlite): use a camel cased base name to have a better tes…
murdos Sep 18, 2024
5c19d90
refactor(custom-jhlite): split different features into different buil…
murdos Sep 18, 2024
7b89906
chore(custom-jhlite): add unit test for custom npm version source reader
murdos Sep 18, 2024
ef0799f
refactor: split maven dependency reader: the actual reader, and this …
murdos Sep 18, 2024
26f3c77
refactor(custom-jhlite): rename shared package 'npm' to 'dependencies'
murdos Sep 18, 2024
3660710
feature(custom-jhlite): setup custom maven version reader to handle c…
murdos Sep 18, 2024
00d5167
feature(custom-jhlite): rename npm version reader to align with maven…
murdos Sep 18, 2024
254ed22
fix: missing template
murdos Sep 18, 2024
67d7be1
fix: wrong folder for package.json
murdos Sep 18, 2024
a7bfcc0
fix(custom-jhlite): custom jhlite should now depend on ApprovalTests …
murdos Sep 18, 2024
0f48374
fix(custom-jhlite): custom MavenDependenciesReader should be public
murdos Sep 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package tech.jhipster.lite.generator.server.javatool.base.domain;

import static tech.jhipster.lite.module.domain.JHipsterModule.documentationTitle;
import static tech.jhipster.lite.module.domain.JHipsterModule.from;
import static tech.jhipster.lite.module.domain.JHipsterModule.moduleBuilder;
import static tech.jhipster.lite.module.domain.JHipsterModule.toSrcMainJava;
import static tech.jhipster.lite.module.domain.JHipsterModule.toSrcTestJava;
import static tech.jhipster.lite.module.domain.JHipsterModule.*;

import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.file.JHipsterDestination;
Expand Down Expand Up @@ -49,7 +45,6 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) {

String packagePath = properties.packagePath();
String baseName = properties.projectBaseName().capitalized();
String basePackage = properties.basePackage().get();

JHipsterDestination testDestination = toSrcTestJava().append(packagePath);
JHipsterDestination mainDestination = toSrcMainJava().append(packagePath);
Expand All @@ -58,7 +53,6 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) {
return moduleBuilder(properties)
.context()
.put("baseName", baseName)
.put("basePackage", basePackage)
.and()
.documentation(documentationTitle("Package types"), MAIN_SOURCE.template("package-types.md"))
.documentation(documentationTitle("Assertions"), MAIN_SOURCE.template("assertions.md"))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,34 @@
package tech.jhipster.lite.generator.server.springboot.customjhlite.domain;

import static tech.jhipster.lite.generator.server.springboot.cucumbercommon.domain.CucumbersModules.*;
import static tech.jhipster.lite.generator.server.springboot.cucumbercommon.domain.CucumbersModules.cucumberModuleBuilder;
import static tech.jhipster.lite.module.domain.JHipsterModule.*;

import java.util.function.Consumer;
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterProjectFilePath;
import tech.jhipster.lite.module.domain.file.JHipsterDestination;
import tech.jhipster.lite.module.domain.file.JHipsterSource;
import tech.jhipster.lite.module.domain.javadependency.JavaDependency;
import tech.jhipster.lite.module.domain.javadependency.*;
import tech.jhipster.lite.module.domain.javadependency.JavaDependency.JavaDependencyOptionalValueBuilder;
import tech.jhipster.lite.module.domain.javadependency.JavaDependencyScope;
import tech.jhipster.lite.module.domain.javadependency.JavaDependencyType;
import tech.jhipster.lite.module.domain.javaproperties.PropertyKey;
import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
import tech.jhipster.lite.shared.error.domain.Assert;

public class CustomJHLiteModuleFactory {

private static final String DOMAIN = "domain";
private static final String SHARED = "shared";
private static final String INFRASTRUCTURE = "infrastructure";
private static final String SECONDARY = "secondary";
private static final String DEPENDENCIES = "dependencies";

private static final JHipsterSource SOURCE = from("server/springboot/custom-jhlite");
private static final JHipsterSource MAIN_SOURCE = SOURCE.append("main");
private static final JHipsterSource SLUG_SOURCE = MAIN_SOURCE.append(SHARED).append("slug");

private static final JHipsterSource DEPENDENCIES_MAIN_SOURCE = MAIN_SOURCE.append(SHARED).append(DEPENDENCIES);
private static final JHipsterSource TEST_SOURCE = SOURCE.append("test");
private static final JHipsterSource DEPENDENCIES_TEST_SOURCE = TEST_SOURCE.append(SHARED).append(DEPENDENCIES);
private static final JHipsterSource CUCUMBER_SOURCE = from("server/springboot/cucumber");

private static final String SRC_MAIN_JAVA = "src/main/java";
Expand All @@ -29,25 +38,21 @@ public class CustomJHLiteModuleFactory {

private static final PropertyKey HIDDEN_SLUGS_PROPERTY_KEY = propertyKey("jhlite-hidden-resources.slugs");
private static final PropertyKey BEAN_DEFINITION_OVERRIDING_PROPERTY_KEY = propertyKey("spring.main.allow-bean-definition-overriding");
private static final String PACKAGE_INFO_JAVA = "package-info.java";

public JHipsterModule buildModule(JHipsterModuleProperties properties) {
Assert.notNull("properties", properties);

String packagePath = properties.packagePath();
String baseName = properties.projectBaseName().capitalized();
JHipsterDestination slugDestination = toSrcMainJava().append(packagePath).append("shared").append("slug");
JHipsterDestination cucumberDestination = toSrcTestJava().append(packagePath).append("cucumber");

//@formatter:off
return cucumberModuleBuilder(properties)
.context()
.put("baseName", properties.projectBaseName().capitalized())
.and()
.documentation(documentationTitle("Module creation"), SOURCE.template("module-creation.md"))
.documentation(documentationTitle("Cucumber"), CUCUMBER_SOURCE.template("cucumber.md"))
.javaDependencies()
.addDependency(jhipsterLiteDependency())
.addDependency(jhipsterLiteTestDependency())
.addTestDependency(groupId("com.approvaltests"), artifactId("approvaltests"), versionSlug("approvaltests"))
.and()
.mandatoryReplacements()
.in(mainClassFile(properties))
Expand All @@ -66,24 +71,100 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) {
.set(BEAN_DEFINITION_OVERRIDING_PROPERTY_KEY, propertyValue(true))
.and()
.files()
.add(MAIN_SOURCE.template("package-info.java"), slugDestination.append("package-info.java"))
.add(MAIN_SOURCE.template("FeatureSlug.java"), slugDestination.append("domain").append(baseName + "FeatureSlug.java"))
.add(MAIN_SOURCE.template("ModuleSlug.java"), slugDestination.append("domain").append(baseName + "ModuleSlug.java"))
.add(TEST_SOURCE.template("CucumberTest.java"), cucumberDestination.append("CucumberTest.java"))
.add(TEST_SOURCE.template("CucumberConfiguration.java"), cucumberDestination.append("CucumberConfiguration.java"))
.add(CUCUMBER_SOURCE.append("rest").template("CucumberRestTemplate.java"), cucumberDestination.append("rest").append("CucumberRestTemplate.java"))
.add(CUCUMBER_SOURCE.file("gitkeep"), to("src/test/features/.gitkeep"))
.batch(SOURCE.append("tests-ci"),to("tests-ci"))
.addExecutableTemplate("generate.sh")
.addTemplate("modulePayload.json")
.addExecutableTemplate("start.sh")
.addExecutable("stop.sh")
.and()
.and()
.apply(cucumberBuilder(properties))
.apply(dependenciesReadersBuilder(properties))
.apply(slugBuilder(properties))
.build();
//@formatter:on
}

private Consumer<JHipsterModuleBuilder> cucumberBuilder(JHipsterModuleProperties properties) {
String packagePath = properties.packagePath();
JHipsterDestination cucumberDestination = toSrcTestJava().append(packagePath).append("cucumber");

//@formatter:off
return builder -> builder
.documentation(documentationTitle("Cucumber"), CUCUMBER_SOURCE.template("cucumber.md"))
.files()
.batch(TEST_SOURCE, cucumberDestination)
.addTemplate("CucumberTest.java")
.addTemplate("CucumberConfiguration.java")
.and()
.add(CUCUMBER_SOURCE.append("rest").template("CucumberRestTemplate.java"), cucumberDestination.append("rest").append("CucumberRestTemplate.java"))
.add(CUCUMBER_SOURCE.file("gitkeep"), to("src/test/features/.gitkeep"));
//@formatter:on
}

private Consumer<JHipsterModuleBuilder> dependenciesReadersBuilder(JHipsterModuleProperties properties) {
String packagePath = properties.packagePath();
String baseName = properties.projectBaseName().capitalized();
JHipsterDestination npmMainDestination = toSrcMainJava().append(packagePath).append(SHARED).append(DEPENDENCIES);
JHipsterDestination npmTestDestination = toSrcTestJava().append(packagePath).append(SHARED).append(DEPENDENCIES);

//@formatter:off
return builder -> builder
.context()
.put("baseNameUpperCased", properties.projectBaseName().upperCased())
.put("baseNameKebabCased", properties.projectBaseName().kebabCase())
.and()
.files()
.add(DEPENDENCIES_MAIN_SOURCE.template(PACKAGE_INFO_JAVA), npmMainDestination.append(PACKAGE_INFO_JAVA))
.add(
DEPENDENCIES_MAIN_SOURCE.append(DOMAIN).template("NpmVersionSource.java"),
npmMainDestination.append(DOMAIN).append(baseName + "NpmVersionSource.java")
)
.add(
DEPENDENCIES_MAIN_SOURCE.append(INFRASTRUCTURE).append(SECONDARY).template("NpmVersionReader.java"),
npmMainDestination.append(INFRASTRUCTURE).append(SECONDARY).append(baseName + "NpmVersionReader.java")
)
.add(
DEPENDENCIES_MAIN_SOURCE.append(INFRASTRUCTURE).append(SECONDARY).template("MavenDependenciesReader.java"),
npmMainDestination.append(INFRASTRUCTURE).append(SECONDARY).append(baseName + "MavenDependenciesReader.java")
)
.add(
DEPENDENCIES_TEST_SOURCE.append(INFRASTRUCTURE).append(SECONDARY).template("NpmVersionReaderTest.java"),
npmTestDestination.append(INFRASTRUCTURE).append(SECONDARY).append(baseName + "NpmVersionReaderTest.java")
)
.add(
DEPENDENCIES_TEST_SOURCE.append(INFRASTRUCTURE).append(SECONDARY).template("MavenDependenciesReaderTest.java"),
npmTestDestination.append(INFRASTRUCTURE).append(SECONDARY).append(baseName + "MavenDependenciesReaderTest.java")
)
.add(
SOURCE.file("package.json"),
toSrcMainResources()
.append("generator")
.append(properties.projectBaseName().kebabCase() + "-dependencies")
.append(properties.projectBaseName().kebabCase())
.append("package.json")
)
.add(
SOURCE.file("pom.xml.mustache"),
toSrcMainResources().append("generator").append(properties.projectBaseName().kebabCase() + "-dependencies").append("pom.xml")
);
//@formatter:on
}

private Consumer<JHipsterModuleBuilder> slugBuilder(JHipsterModuleProperties properties) {
String packagePath = properties.packagePath();
String baseName = properties.projectBaseName().capitalized();
JHipsterDestination slugDestination = toSrcMainJava().append(packagePath).append(SHARED).append("slug");

//@formatter:off
return builder -> builder
.files()
.add(SLUG_SOURCE.template(PACKAGE_INFO_JAVA), slugDestination.append(PACKAGE_INFO_JAVA))
.add(SLUG_SOURCE.append(DOMAIN).template("FeatureSlug.java"), slugDestination.append(DOMAIN).append(baseName + "FeatureSlug.java"))
.add(SLUG_SOURCE.append(DOMAIN).template("ModuleSlug.java"), slugDestination.append(DOMAIN).append(baseName + "ModuleSlug.java"));
//@formatter:on
}

private JavaDependency jhipsterLiteDependency() {
return jhLiteDependencyBuilder().build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ public String capitalized() {
return StringUtils.capitalize(name());
}

public String upperCased() {
return StringUtils.uncapitalize(name()).replaceAll("([A-Z])", "_$1").toUpperCase();
}

public String kebabCase() {
return StringUtils.uncapitalize(name()).replaceAll("([A-Z])", "-$1").toLowerCase();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,25 @@

import java.util.List;
import java.util.regex.Pattern;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;
import tech.jhipster.lite.module.domain.ProjectFiles;
import tech.jhipster.lite.module.domain.javadependency.JavaDependenciesVersions;
import tech.jhipster.lite.module.domain.javadependency.JavaDependencyVersion;

@Repository
@Order
class MavenDependenciesReader implements JavaDependenciesReader {
public class FileSystemMavenDependenciesReader implements JavaDependenciesReader {

private static final String CURRENT_VERSIONS_FILE = "/generator/dependencies/pom.xml";
private static final Pattern VERSIONS_PATTERN = Pattern.compile("<([^>]+)\\.version>([^>]+)</");

private final ProjectFiles files;
private final String currentVersionsFile;

public MavenDependenciesReader(ProjectFiles files) {
public FileSystemMavenDependenciesReader(ProjectFiles files, String currentVersionsFile) {
this.files = files;
this.currentVersionsFile = currentVersionsFile;
}

@Override
public JavaDependenciesVersions get() {
List<JavaDependencyVersion> versions = readVersions(files.readString(CURRENT_VERSIONS_FILE));
List<JavaDependencyVersion> versions = readVersions(files.readString(currentVersionsFile));

return new JavaDependenciesVersions(versions);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package tech.jhipster.lite.module.infrastructure.secondary.javadependency;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;
import tech.jhipster.lite.module.domain.ProjectFiles;
import tech.jhipster.lite.module.domain.javadependency.JavaDependenciesVersions;

@Order
@Repository
class JHLiteMavenDependenciesReader implements JavaDependenciesReader {

private static final String CURRENT_VERSIONS_FILE = "/generator/dependencies/pom.xml";

private final FileSystemMavenDependenciesReader reader;

public JHLiteMavenDependenciesReader(ProjectFiles files) {
this.reader = new FileSystemMavenDependenciesReader(files, CURRENT_VERSIONS_FILE);
}

@Override
public JavaDependenciesVersions get() {
return reader.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package {{ packageName }}.shared.dependencies.domain;

import tech.jhipster.lite.module.domain.npm.NpmVersionSource;
import tech.jhipster.lite.module.domain.npm.NpmVersionSourceFactory;

public enum {{ baseName }}NpmVersionSource implements NpmVersionSourceFactory {
{{ baseNameUpperCased }}("{{ baseNameKebabCased }}");

private final String source;

{{ baseName }}NpmVersionSource(String source) {
this.source = source;
}

@Override
public NpmVersionSource build() {
return new NpmVersionSource(source);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package {{ packageName }}.shared.dependencies.infrastructure.secondary;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;
import tech.jhipster.lite.module.domain.ProjectFiles;
import tech.jhipster.lite.module.domain.javadependency.JavaDependenciesVersions;
import tech.jhipster.lite.module.infrastructure.secondary.javadependency.FileSystemMavenDependenciesReader;
import tech.jhipster.lite.module.infrastructure.secondary.javadependency.JavaDependenciesReader;

@Repository
@Order(Ordered.HIGHEST_PRECEDENCE)
public class {{ baseName }}MavenDependenciesReader implements JavaDependenciesReader {

private static final String CURRENT_VERSIONS_FILE = "/generator/{{ baseNameKebabCased }}-dependencies/pom.xml";

private final FileSystemMavenDependenciesReader reader;

public {{ baseName }}MavenDependenciesReader(ProjectFiles files) {
this.reader = new FileSystemMavenDependenciesReader(files, CURRENT_VERSIONS_FILE);
}

@Override
public JavaDependenciesVersions get() {
return reader.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package {{ packageName }}.shared.dependencies.infrastructure.secondary;

import java.util.List;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;
import {{ packageName }}.shared.dependencies.domain.{{ baseName }}NpmVersionSource;
import tech.jhipster.lite.module.domain.ProjectFiles;
import tech.jhipster.lite.module.domain.npm.NpmPackagesVersions;
import tech.jhipster.lite.module.infrastructure.secondary.npm.FileSystemNpmVersionReader;
import tech.jhipster.lite.module.infrastructure.secondary.npm.NpmVersionsReader;

@Repository
@Order(Ordered.HIGHEST_PRECEDENCE)
public class {{ baseName }}NpmVersionReader implements NpmVersionsReader {

private static final String PARENT_FOLDER = "/generator/{{ baseNameKebabCased }}-dependencies/";

private final FileSystemNpmVersionReader reader;

public {{ baseName }}NpmVersionReader(ProjectFiles projectFiles) {
reader = new FileSystemNpmVersionReader(projectFiles, List.of({{ baseName }}NpmVersionSource.values()), PARENT_FOLDER);
}

@Override
public NpmPackagesVersions get() {
return reader.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@{{ packageName }}.SharedKernel
package {{ packageName }}.shared.dependencies;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"dependencies": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" ?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion>

<artifactId>{{ baseNameKebabCased }}-dependencies</artifactId>
<version>0.0.7-SNAPSHOT</version>
<name>{{ projectName }} dependencies</name>
<description>{{ projectName }} dependencies list</description>
<packaging>pom</packaging>

<properties>
<!-- Version slugs of dependencies added by jhipster-lite modules should be declared here -->
</properties>

<dependencyManagement>
<dependencies>
<!-- Dependencies that will be added by jhipster-lite modules should be declared here -->
</dependencies>
</dependencyManagement>
</project>
Loading