Skip to content

Commit

Permalink
Merge pull request #10896 from murdos/custom-jhlite-npm-dependencies
Browse files Browse the repository at this point in the history
feature(custom-jhlite): setup custom npm and maven version reader to handle custom npm/java dependencies
  • Loading branch information
murdos authored Sep 20, 2024
2 parents 62f7b21 + 0f48374 commit 884915a
Show file tree
Hide file tree
Showing 22 changed files with 407 additions and 53 deletions.
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

0 comments on commit 884915a

Please sign in to comment.