Skip to content

Commit

Permalink
17.1.1
Browse files Browse the repository at this point in the history
  • Loading branch information
FirokOtaku committed Nov 5, 2021
1 parent 6e1379d commit b4f9f0f
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 28 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>firok.spring</groupId>
<artifactId>mvci</artifactId>
<version>17.1.0</version>
<version>17.1.1</version>
<description>An annotation processing tool to generate MVC code from JavaBean(s).</description>
<dependencies>
<dependency>
Expand Down
54 changes: 43 additions & 11 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
为 SpringBoot 生成一整套 MVC CRUD 结构.
(包含 mapper, service, service impl, controller)

[Readme - English](readme-en.md)
[Readme - English](readme-en.md) (尚未更新至17.1.x)

## 使用方式

Expand All @@ -14,21 +14,33 @@
```text
firok.spring.mvci.MVCIntrospectProcessor
```
* 启用开发环境中的 ADT 功能
* 为数据库表创建对应的 JavaBean 实体类, 并标注 `@BeanIntrospective` 注解
* 启用开发环境中的 ADT 功能, 这通常需要在 IDE 中进行配置
* 为数据库表创建对应的 JavaBean 实体类, 并在 **合适位置** 标注 `@MVCIntrospective` 注解
* 重新编译并启动项目

### 自定义生成模板
### 配置与调整生成

修改 `@MVCIntrospective` 注解中的 `xxxTemplate` 值即可调整相关结构的生成模板
`@MVCIntrospective` 有多个字段可供配置, 各字段配置含义在 [Javadoc 中](/src/main/java/firok/spring/mvci/MVCIntrospective.java) 有详细描述.

> 将值设为 `firok.spring.mvci.Constants.DISABLE` (`"##DISABLE##"`) 会禁用相关结构生成
大部分字段标注了 `@AvailableValues`注解, 这描述了相关字段可接受的值.
如果 `@AvailableValues` 中包含 `Constants.CUSTOM`, 则表示此字段可以提供任意自定义值 (一般是自定义模板字符串);
否则只能为此字段提供预设值之一, 提供其它值会使得代码无法通过编译.

> 如果不想重复写多次冗长的生成模板, 可以将模板字符串定义为静态常量, 再在注解中使用
预设值中的 `PREFER_XXX` 表示此值可以被上层配置值覆盖, 否则使用指定值;
`DEFAULT` 值则表示此字段强制使用 MVCI 给定的默认值 (一般是默认模板).

默认的模板定义在 `firok.spring.mvci.internal.DefaultXXXTemplate` 下.
`@MVCIntrospective` 可以标注到 **实体类****** 上.
生成一个实体时, 会按照从子包到父包的顺序, 依次向上寻找有无 **包级** 配置注解, 最后决定每个配置字段的值.

创建自定义模板时, 如下键会在结构生成时被替换:
> 希望你知道 `package-info.java` 这玩意
### 生成模板的替换键

修改 `@MVCIntrospective` 注解中的 `templateXXX` 值即可调整相关的生成模板.

默认的模板存放在 `resources` 目录下.

根据模板生成内容时, 如下键会被替换:

键|含义|示例替换值
-|-|-
Expand All @@ -44,9 +56,21 @@
`##SERVICE_IMPL_PACKAGE##` | Service Impl 位置 | `firok.spring.demo.service.impl`
`##CONTROLLER_PACKAGE##` | Controller 位置 | `firok.spring.demo.controller`

### 自定义生成位置和名称
虽然大部分 **替换键****替换值** 也是根据模板生成的, 但我们不对生成相关 **替换值** 的顺序做任何保证, 在调整这些 **替换键模板** 时请 **不要** 使用除了 `##BEAN_NAME_FULL##`, `##BEAN_NAME_SHORT##``##BEAN_PACKAGE##` 之外的 **替换键**.

生成各 `##XXX_PACKAGE##` 替换值时, 会多执行一次额外替换, 替换内容是将 `\.entity|bean\.` 替换为 `.mapper.`, `.service.`, `.service_impl.``.controller.`.

> 假如实体类定义于 `a.b.c.entity.d.e.TestEntity`,
> 生成 controller 时默认位置为 `a.b.c.controller.d.e`
修改 `@MVCIntrospective` 注解中的 `xxxPackage` 值即可调整相关结构的生成位置; 修改 `xxxName` 即可调整相关结构名称.
除去默认的替换键值, 还可以在 `@MVCIntrospective` 中的 `extraParams` 字段创建自定义替换键值. 如果多个配置中包含相同替换键, 将采用 **就近原则**, 更接近实体定义的替换键值将会被采用.

> 假如在 `a.b` 包上指定了 `##TEST## = "test"`,
> 假如在 `a.b.c` 包上指定了 `##TEST## = "test2"`,
> `a.b.c.TestBean` 上指定了 `##TEST## = "test3"`,
> 生成 `a.b.c.TestBean` 实体时将使用 `##TEST## = "test3"`,
> 生成 `a.b.c.Test2Bean` 实体时将使用 `##TEST## = "test2"`,
> 生成 `a.b.DemoBean` 实体时将使用 `##TEST## = "test"`
## 注意

Expand All @@ -61,6 +85,14 @@ MVCI 仅于 **Java17 环境** 下通过测试.

## 变动记录

### 17.1.1

* 细微代码改动

### 17.1.0

* 调整配置方式, 现在可以以包为级别批量调整生成

### 17.0.0

* 提升JDK支持版本至17
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/firok/spring/mvci/MVCIntrospective.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
* <p>标明为此实体生成 mapper 时使用的名称模板.</p>
* <p>indicate the name template to be used when generating mapper for this bean.</p>
* <p>
* <i>resources/mapper.name.txt</i>
* <code>##BEAN_NAME_SHORT##Mapper</code> : <code>TestBean</code> → <code>TestMapper</code>
* </p>
*/
Expand All @@ -138,6 +139,7 @@
* <p>标明为此实体生成 service 时使用的名称模板.</p>
* <p>indicate the name template to be used when generating service for this bean.</p>
* <p>
* <i>resources/service.name.txt</i>
* <code>##BEAN_NAME_SHORT##Service</code> : <code>TestBean</code> → <code>TestService</code>
* </p>
*/
Expand All @@ -148,6 +150,7 @@
* <p>标明为此实体生成 service impl 时使用的名称模板.</p>
* <p>indicate the name to be used when generating service impl for this bean.</p>
* <p>
* <i>resources/service_impl.name.txt</i>
* <code>##BEAN_NAME_SHORT##ServiceImpl</code> : <code>TestBean</code> → <code>TestServiceImpl</code>
* </p>
*/
Expand All @@ -158,6 +161,7 @@
* <p>标明为此实体生成 controller 时使用的名称模板.</p>
* <p>indicate the name to be used when generating controller for this bean.</p>
* <p>
* <i>resources/controller.name.txt</i>
* <code>##BEAN_NAME_SHORT##Controller</code> : <code>TestBean</code> → <code>TestController</code>
* </p>
*/
Expand All @@ -169,16 +173,36 @@
/**
* <p>标明为此实体生成 mapper 时的目标包位置.</p>
* <p>indicate the target package when generating mapper for this bean.</p>
*
* <i>resources/mapper.package.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateMapperPackage() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 mapper 时的目标包位置.</p>
* <p>indicate the target package when generating mapper for this bean.</p>
*
* <i>resources/service.package.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateServicePackage() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 service 时的目标包位置.</p>
* <p>indicate the target package when generating service for this bean.</p>
*
* <i>resources/service_impl.package.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateServiceImplPackage() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 controller 时的目标包位置.</p>
* <p>indicate the target package when generating controller for this bean.</p>
*
* <i>resources/controller.package.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateControllerPackage() default PREFER_DEFAULT;

Expand All @@ -187,27 +211,35 @@
/**
* <p>标明为此实体生成 mapper 时使用的模板.</p>
* <p>indicate the template to be used when generating mapper for this bean.</p>
*
* <i>resources/mapper.java.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateMapperContent() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 service 时使用的模板.</p>
* <p>indicate the template to be used when generating service for this bean.</p>
*
* <i>resources/service.java.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateServiceContent() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 service impl 时使用的模板.</p>
* <p>indicate the template to be used when generating service impl for this bean.</p>
*
* <i>resources/service_impl.java.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateServiceImplContent() default PREFER_DEFAULT;

/**
* <p>标明为此实体生成 controller 时使用的模板.</p>
* <p>indicate the template to be used when generating controller for this bean.</p>
*
* <i>resources/controller.java.txt</i>
*/
@AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM })
String templateControllerContent() default PREFER_DEFAULT;
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/firok/spring/mvci/internal/BeanContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,17 +151,19 @@ private static String nonDefault(List<MVCIntrospective> configs, Function<MVCInt

private void single(String valueKey, String valueTemplate, Map<String, String> extras)
{
mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams, extras));
String value = RegexPipeline.pipelineAll(valueTemplate, mapExtraParams);
if(extras != null) value = RegexPipeline.pipelineAll(value, extras);
mapExtraParams.put(valueKey, value);
}
private void single(String valueKey, String valueTemplate)
{
mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams, null));
mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams));
}
private void write(String valueKeyLocation, String valueKeyName, String templateContent) throws Exception
{
String valueLocation = mapExtraParams.get(valueKeyLocation);
String valueName = mapExtraParams.get(valueKeyName);
String valueContent = RegexPipeline.pipelineAll(templateContent, mapExtraParams, null);
String valueContent = RegexPipeline.pipelineAll(templateContent, mapExtraParams);
try(var writer = mvci.createSourceFileWrite(valueLocation + "." + valueName))
{
writer.write(valueContent);
Expand Down
14 changes: 1 addition & 13 deletions src/main/java/firok/spring/mvci/internal/RegexPipeline.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public class RegexPipeline
{
public static String pipelineAll(String content, Map<String, String> mapParams, Map<String, String> extras)
public static String pipelineAll(String content, Map<String, String> mapParams)
{
for(var entryParam : mapParams.entrySet())
{
Expand All @@ -17,18 +17,6 @@ public static String pipelineAll(String content, Map<String, String> mapParams,

content = regexPattern.matcher(content).replaceAll(replacement);
}
if(extras != null)
{
for(var entryParam : extras.entrySet())
{
String regexString = entryParam.getKey();
String replacement = entryParam.getValue();

Pattern regexPattern = getPattern(regexString);

content = regexPattern.matcher(content).replaceAll(replacement);
}
}
return content;
}
public static String pipelineFirst(String content, Map<String, String> mapParams)
Expand Down

0 comments on commit b4f9f0f

Please sign in to comment.