diff --git a/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleRank.java b/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleRank.java new file mode 100644 index 00000000000..655fb3387df --- /dev/null +++ b/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleRank.java @@ -0,0 +1,35 @@ +package tech.jhipster.lite.module.domain.resource; + +/** + * Represents the maturity and adoption level of JHipster modules. + * Ranks range from experimental to community-validated, + * helping users assess module stability and production readiness. + */ +public enum JHipsterModuleRank { + /** + * Experimental or advanced module requiring specific expertise + */ + RANK_D, + + /** + * Module without known production usage + */ + RANK_C, + + /** + * Module with at least one confirmed production usage + */ + RANK_B, + + /** + * Module with multiple production usages across different projects + * and documented through talks, books or blog posts + */ + RANK_A, + + /** + * Production-proven module providing unique features, + * validated by community feedback (10+ endorsements) + */ + RANK_S, +} diff --git a/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleResource.java b/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleResource.java index 8006409f42f..20345c18428 100644 --- a/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleResource.java +++ b/src/main/java/tech/jhipster/lite/module/domain/resource/JHipsterModuleResource.java @@ -2,6 +2,7 @@ import static org.apache.commons.lang3.builder.ToStringStyle.*; +import java.util.Optional; import org.apache.commons.lang3.builder.ToStringBuilder; import tech.jhipster.lite.module.domain.JHipsterModuleFactory; import tech.jhipster.lite.module.domain.JHipsterModuleSlug; @@ -14,6 +15,7 @@ public final class JHipsterModuleResource { private final JHipsterModuleApiDoc apiDoc; private final JHipsterModuleOrganization organization; private final JHipsterModuleTags tags; + private final JHipsterModuleRank rank; private final JHipsterModuleFactory factory; private JHipsterModuleResource(JHipsterModuleResourceBuilder builder) { @@ -24,6 +26,7 @@ private JHipsterModuleResource(JHipsterModuleResourceBuilder builder) { apiDoc = builder.apiDoc; tags = builder.tags; organization = builder.organization; + rank = Optional.ofNullable(builder.rank).orElse(JHipsterModuleRank.RANK_D); factory = builder.factory; } @@ -60,6 +63,10 @@ public JHipsterModuleOrganization organization() { return organization; } + public JHipsterModuleRank rank() { + return rank; + } + public JHipsterModuleFactory factory() { return factory; } @@ -86,10 +93,11 @@ private static final class JHipsterModuleResourceBuilder JHipsterModuleResourceApiDocBuilder, JHipsterModuleResourceOrganizationBuilder, JHipsterModuleResourceTagsBuilder, - JHipsterModuleResourceFactoryBuilder { + JHipsterModuleResourceOptionalBuilder { private JHipsterModuleSlugFactory slug; private JHipsterModuleApiDoc apiDoc; + private JHipsterModuleRank rank; private JHipsterModuleFactory factory; private JHipsterModulePropertiesDefinition propertiesDefinition; @@ -125,12 +133,19 @@ public JHipsterModuleResourceTagsBuilder organization(JHipsterModuleOrganization } @Override - public JHipsterModuleResourceFactoryBuilder tags(JHipsterModuleTags tags) { + public JHipsterModuleResourceOptionalBuilder tags(JHipsterModuleTags tags) { this.tags = tags; return this; } + @Override + public JHipsterModuleResourceOptionalBuilder rank(JHipsterModuleRank rank) { + this.rank = rank; + + return this; + } + @Override public JHipsterModuleResource factory(JHipsterModuleFactory factory) { this.factory = factory; @@ -168,14 +183,16 @@ default JHipsterModuleResourceTagsBuilder standalone() { } public interface JHipsterModuleResourceTagsBuilder { - JHipsterModuleResourceFactoryBuilder tags(JHipsterModuleTags tags); + JHipsterModuleResourceOptionalBuilder tags(JHipsterModuleTags tags); - default JHipsterModuleResourceFactoryBuilder tags(String... tags) { + default JHipsterModuleResourceOptionalBuilder tags(String... tags) { return tags(JHipsterModuleTags.builder().add(tags).build()); } } - public interface JHipsterModuleResourceFactoryBuilder { + public interface JHipsterModuleResourceOptionalBuilder { + JHipsterModuleResourceOptionalBuilder rank(JHipsterModuleRank rank); + JHipsterModuleResource factory(JHipsterModuleFactory factory); } } diff --git a/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourceFixture.java b/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourceFixture.java index fcc78df4fec..e524d003e80 100644 --- a/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourceFixture.java +++ b/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourceFixture.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; import tech.jhipster.lite.module.domain.JHipsterModuleFactory; import tech.jhipster.lite.module.domain.resource.JHipsterModuleOrganization.JHipsterModuleOrganizationBuilder; import tech.jhipster.lite.module.domain.resource.JHipsterModuleTags.JHipsterModuleTagsBuilder; @@ -76,6 +77,7 @@ public static final class JHipsterTestModuleResourceBuilder { private JHipsterModuleFactory factory; private JHipsterModuleTags tags; private String feature; + private JHipsterModuleRank rank; private final Collection moduleDependencies = new ArrayList<>(); private final Collection featureDependencies = new ArrayList<>(); @@ -130,14 +132,21 @@ public JHipsterTestModuleResourceBuilder tags(JHipsterModuleTags tags) { return this; } + public JHipsterTestModuleResourceBuilder rank(JHipsterModuleRank rank) { + this.rank = rank; + + return this; + } + public JHipsterModuleResource build() { - return JHipsterModuleResource.builder() + JHipsterModuleResource.JHipsterModuleResourceOptionalBuilder builder = JHipsterModuleResource.builder() .slug(() -> slug) .propertiesDefinition(propertiesDefinition()) .apiDoc(group, operation) .organization(buildOrganization()) - .tags(tags) - .factory(factory); + .tags(tags); + + return Optional.ofNullable(rank).map(builder::rank).orElse(builder).factory(factory); } private JHipsterModuleOrganization buildOrganization() { diff --git a/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourcesTest.java b/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourcesTest.java index 08fc33d1ecd..63dde03fae8 100644 --- a/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourcesTest.java +++ b/src/test/java/tech/jhipster/lite/module/domain/resource/JHipsterModulesResourcesTest.java @@ -46,4 +46,18 @@ void shouldHaveMeaningfulToString() { assertThat(resource.toString()).contains("JHipsterModuleResource[", "slug=dummy"); } + + @Test + void shouldBuildWithRankedResources() { + var resource = defaultModuleResourceBuilder().rank(JHipsterModuleRank.RANK_S).build(); + + assertThat(resource.rank()).isEqualTo(JHipsterModuleRank.RANK_S); + } + + @Test + void shouldBuildWithDefaultRankedResources() { + var resource = defaultModuleResourceBuilder().build(); + + assertThat(resource.rank()).isEqualTo(JHipsterModuleRank.RANK_D); + } }