Selaa lähdekoodia

Merge remote-tracking branch 'upstream/dev' into instacne-spi

jay li 5 kuukautta sitten
vanhempi
säilyke
07951cd68d
23 muutettua tiedostoa jossa 117 lisäystä ja 95 poistoa
  1. 1 0
      liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java
  2. 2 0
      liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MaxWaitTimeOperator.java
  3. 2 0
      liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java
  4. 2 12
      liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java
  5. 45 48
      liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/DeclComponentProxy.java
  6. 9 6
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java
  7. 3 1
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java
  8. 1 0
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java
  9. 2 2
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Executable.java
  10. 5 0
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/executor/NodeExecutor.java
  11. 1 1
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/executor/NodeExecutorHelper.java
  12. 1 0
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java
  13. 13 13
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java
  14. 1 1
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyHelper.java
  15. 2 0
      liteflow-core/src/main/java/com/yomahub/liteflow/log/LFLog.java
  16. 1 1
      liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorFile.java
  17. 2 6
      liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java
  18. 1 1
      liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorCondition/ExecutorCondition.java
  19. 6 1
      liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorCondition/ExecutorConditionBuilder.java
  20. 5 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java
  21. 5 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml
  22. 6 0
      liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/pom.xml
  23. 1 2
      pom.xml

+ 1 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java

@@ -119,6 +119,7 @@ public class LiteFlowChainELBuilder {
 	 * @return LiteFlowChainELBuilder
 	 * @deprecated 请使用 {@link #setChainId(String)}
 	 */
+	@Deprecated
 	public LiteFlowChainELBuilder setChainName(String chainName) {
 		if (FlowBus.containChain(chainName)) {
 			this.chain = FlowBus.getChain(chainName);

+ 2 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MaxWaitTimeOperator.java

@@ -65,6 +65,8 @@ public abstract class MaxWaitTimeOperator extends BaseOperator<Condition> {
         timeoutCondition.addExecutable(executable);
         timeoutCondition.setMaxWaitTime(maxWaitTime);
         timeoutCondition.setMaxWaitTimeUnit(getMaxWaitTimeUnit());
+        timeoutCondition.setId(executable.getId());
+        timeoutCondition.setTag(executable.getTag());
         return timeoutCondition;
     }
 

+ 2 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java

@@ -159,6 +159,8 @@ public class OperatorHelper {
 	/**
 	 * 所谓Boolean item,指的是那些最终的结果值为布尔类型的Item
 	 * 布尔类型的items有,if,while,break类型的Node,以及AndOrCondition以及NotCondition
+	 * @param object 检查的对象
+	 * @throws Exception 检查过程中抛的错
 	 */
 	public static void checkObjMustBeBooleanTypeItem(Object object) throws Exception{
 		if (!(object instanceof Executable)){

+ 2 - 12
liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java

@@ -478,20 +478,10 @@ public class FlowExecutor {
 		catch (Exception e) {
 			if (ObjectUtil.isNotNull(chain)) {
 				String errMsg = StrUtil.format("chain[{}] execute error on slot[{}]", chain.getChainId(), slotIndex);
-				if (BooleanUtil.isTrue(liteflowConfig.getPrintExecutionLog())) {
-					LOG.error(errMsg, e);
-				}
-				else {
-					LOG.error(errMsg);
-				}
+				LOG.error(errMsg, e);
 			}
 			else {
-				if (BooleanUtil.isTrue(liteflowConfig.getPrintExecutionLog())) {
-					LOG.error(e.getMessage(), e);
-				}
-				else {
-					LOG.error(e.getMessage());
-				}
+				LOG.error(e.getMessage(), e);
 			}
 
 			// 如果是正常流程需要把异常设置到slot的exception属性里

+ 45 - 48
liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/DeclComponentProxy.java

@@ -111,7 +111,7 @@ public class DeclComponentProxy {
 
     public class AopInvocationHandler implements InvocationHandler {
 
-        private DeclWarpBean declWarpBean;
+        private final DeclWarpBean declWarpBean;
 
         public AopInvocationHandler(DeclWarpBean declWarpBean) {
             this.declWarpBean = declWarpBean;
@@ -162,60 +162,57 @@ public class DeclComponentProxy {
     private Object[] loadMethodParameter(Object proxy, MethodWrapBean methodWrapBean, Object[] args){
         NodeComponent thisNodeComponent = (NodeComponent) proxy;
 
-        return IntStream.range(0, methodWrapBean.getParameterWrapBeanList().size()).boxed().map(new Function<Integer, Object>() {
-            @Override
-            public Object apply(Integer index) {
-                ParameterWrapBean parameterWrapBean = methodWrapBean.getParameterWrapBeanList().get(index);
+        return IntStream.range(0, methodWrapBean.getParameterWrapBeanList().size()).boxed().map(index -> {
+            ParameterWrapBean parameterWrapBean = methodWrapBean.getParameterWrapBeanList().get(index);
 
-                // 如果参数是NodeComponent,那就返回proxy本身
-                if (parameterWrapBean.getParameterType().isAssignableFrom(NodeComponent.class)) {
-                    return proxy;
-                }
-
-                if (parameterWrapBean.getFact() == null && ArrayUtil.isNotEmpty(args)){
-                    if (parameterWrapBean.getParameterType().isAssignableFrom(args[index - 1].getClass())){
-                        return args[index -1];
-                    }
-                }
+            // 如果参数是NodeComponent,那就返回proxy本身
+            if (parameterWrapBean.getParameterType().isAssignableFrom(NodeComponent.class)) {
+                return proxy;
+            }
 
-                // 如果没有@LiteflowFact标注,那么不处理,直接赋值null
-                if (parameterWrapBean.getFact() == null) {
-                    return null;
+            if (parameterWrapBean.getFact() == null && ArrayUtil.isNotEmpty(args)){
+                if (parameterWrapBean.getParameterType().isAssignableFrom(args[index - 1].getClass())){
+                    return args[index -1];
                 }
+            }
 
-                // 把上下文数据转换成map形式的,key为别名,value为上下文
-                Map<String, Object> contextMap = DataBus.getSlot(thisNodeComponent.getSlotIndex()).getContextBeanList().stream().collect(
-                        Collectors.toMap(tuple -> tuple.get(0), tuple -> tuple.get(1))
-                );
-
-                List<String> errorList = new ArrayList<>();
-
-                Object result = null;
-                // 根据表达式去上下文里搜索相匹配的数据
-                for(Map.Entry<String, Object> entry : contextMap.entrySet()){
-                    try{
-                        InstructionSet instructionSet = expressRunner.getInstructionSetFromLocalCache(entry.getKey() + "." + parameterWrapBean.getFact().value());
-                        DefaultContext<String, Object> context = new DefaultContext<>();
-                        context.put(entry.getKey(), entry.getValue());
-                        result = expressRunner.execute(instructionSet, context, errorList, false, false);
-                        if (result != null){
-                            break;
-                        }
-                    }catch (Exception ignore){}
-                }
+            // 如果没有@LiteflowFact标注,那么不处理,直接赋值null
+            if (parameterWrapBean.getFact() == null) {
+                return null;
+            }
 
-                if (result == null){
-                    try{
-                        // 如果没有搜到,那么尝试推断表达式是指定的上下文,按照指定上下文的方式去再获取
-                        InstructionSet instructionSet = expressRunner.getInstructionSetFromLocalCache("contextMap." + parameterWrapBean.getFact().value());
-                        DefaultContext<String, Object> context = new DefaultContext<>();
-                        context.put("contextMap", contextMap);
-                        result = expressRunner.execute(instructionSet, context, errorList, false, false);
-                    }catch (Exception ignore){}
-                }
+            // 把上下文数据转换成map形式的,key为别名,value为上下文
+            Map<String, Object> contextMap = DataBus.getSlot(thisNodeComponent.getSlotIndex()).getContextBeanList().stream().collect(
+                    Collectors.toMap(tuple -> tuple.get(0), tuple -> tuple.get(1))
+            );
+
+            List<String> errorList = new ArrayList<>();
+
+            Object result = null;
+            // 根据表达式去上下文里搜索相匹配的数据
+            for(Map.Entry<String, Object> entry : contextMap.entrySet()){
+                try{
+                    InstructionSet instructionSet = expressRunner.getInstructionSetFromLocalCache(entry.getKey() + "." + parameterWrapBean.getFact().value());
+                    DefaultContext<String, Object> context = new DefaultContext<>();
+                    context.put(entry.getKey(), entry.getValue());
+                    result = expressRunner.execute(instructionSet, context, errorList, false, false);
+                    if (result != null){
+                        break;
+                    }
+                }catch (Exception ignore){}
+            }
 
-                return result;
+            if (result == null){
+                try{
+                    // 如果没有搜到,那么尝试推断表达式是指定的上下文,按照指定上下文的方式去再获取
+                    InstructionSet instructionSet = expressRunner.getInstructionSetFromLocalCache("contextMap." + parameterWrapBean.getFact().value());
+                    DefaultContext<String, Object> context = new DefaultContext<>();
+                    context.put("contextMap", contextMap);
+                    result = expressRunner.execute(instructionSet, context, errorList, false, false);
+                }catch (Exception ignore){}
             }
+
+            return result;
         }).toArray();
     }
 }

+ 9 - 6
liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java

@@ -132,7 +132,9 @@ public class FlowBus {
 
 	/**
 	 * 添加已托管的节点(如:Spring、Solon 管理的节点)
-	 * */
+	 * @param nodeId nodeId
+	 * @param nodeComponent nodeComponent
+	 */
 	public static void addManagedNode(String nodeId, NodeComponent nodeComponent) {
 		// 根据class来猜测类型
 		NodeTypeEnum type = NodeTypeEnum.guessType(nodeComponent.getClass());
@@ -182,6 +184,7 @@ public class FlowBus {
 	 * @param name 节点名称
 	 * @param nodeType 节点类型
 	 * @param script 脚本
+	 * @param language 语言
 	 */
 	public static void addScriptNode(String nodeId, String name, NodeTypeEnum nodeType, String script,
 			String language) {
@@ -199,11 +202,11 @@ public class FlowBus {
 
 	/**
 	 * 添加脚本 node,并且编译脚本
-	 * @param nodeId
-	 * @param name
-	 * @param type
-	 * @param script
-	 * @param language
+	 * @param nodeId nodeId
+	 * @param name name
+	 * @param type type
+	 * @param script script content
+	 * @param language language
 	 * @return NodeComponent instance
 	 */
 	public static NodeComponent addScriptNodeAndCompile(String nodeId, String name, NodeTypeEnum type, String script,

+ 3 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java

@@ -70,6 +70,7 @@ public class Chain implements Executable{
 
 	/**
 	 * @deprecated 请使用{@link #getChainId()}
+	 * @return chainId
 	 */
 	@Deprecated
 	public String getChainName() {
@@ -77,9 +78,10 @@ public class Chain implements Executable{
 	}
 
 	/**
-	 * @param chainName
+	 * @param chainName chainId
 	 * @deprecated 请使用 {@link #setChainId(String)}
 	 */
+	@Deprecated
 	public void setChainName(String chainName) {
 		this.chainId = chainName;
 	}

+ 1 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java

@@ -173,6 +173,7 @@ public abstract class Condition implements Executable{
 
 	/**
 	 * 请使用 {@link #setCurrChainId(String)}
+	 * @return currChainId
 	 */
 	@Deprecated
 	public String getCurrChainName() {

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Executable.java

@@ -18,7 +18,7 @@ public interface Executable{
 	ExecuteableTypeEnum getExecuteType();
 
 	/**
-	 * @return
+	 * @return executeName or id
 	 * @deprecated 请使用 {@link #getId()}
 	 */
 	@Deprecated
@@ -27,7 +27,7 @@ public interface Executable{
 	}
 
 	/**
-	 * @param currentChainName
+	 * @param currentChainName currentChainName
 	 * @deprecated 请使用 {@link #setCurrChainId(String)}
 	 */
 	default void setCurrChainName(String currentChainName) {

+ 5 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/flow/executor/NodeExecutor.java

@@ -21,6 +21,8 @@ public abstract class NodeExecutor {
 
 	/**
 	 * 执行器执行入口-若需要更大维度的执行方式可以重写该方法
+	 * @param instance instance
+	 * @throws Exception 执行过程中抛的错
 	 */
 	public void execute(NodeComponent instance) throws Exception {
 		int retryCount = instance.getRetryCount();
@@ -54,6 +56,9 @@ public abstract class NodeExecutor {
 
 	/**
 	 * 执行重试逻辑 - 子类通过实现该方法进行重试逻辑的控制
+	 * @param instance instance
+	 * @param currentRetryCount currentRetryCount
+	 * @throws Exception 抛出重试执行过程中的错
 	 */
 	protected void retry(NodeComponent instance, int currentRetryCount) throws Exception {
 		Slot slot = DataBus.getSlot(instance.getSlotIndex());

+ 1 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/flow/executor/NodeExecutorHelper.java

@@ -34,7 +34,7 @@ public class NodeExecutorHelper {
 
 	/**
 	 * 获取帮助者的实例
-	 * @return
+	 * @return NodeExecutorHelper
 	 */
 	public static NodeExecutorHelper loadInstance() {
 		// 外围类能直接访问内部类(不管是否是静态的)的私有变量

+ 1 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java

@@ -10,6 +10,7 @@ public class CompletableFutureExpand {
      *
      * @param timeout 在出现 TimeoutException 异常完成之前等待多长时间,以 {@code unit} 为单位
      * @param unit    一个 {@link TimeUnit},结合 {@code timeout} 参数,表示给定粒度单位的持续时间
+     * @param timeoutDefaultObj timeoutDefaultObj
      * @return 入参的 CompletableFuture
      */
     public static <T> CompletableFuture<T> completeOnTimeout(CompletableFuture<T> future, long timeout, TimeUnit unit, T timeoutDefaultObj) {

+ 13 - 13
liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java

@@ -42,12 +42,12 @@ public abstract class ParallelStrategyExecutor {
 
     /**
      * 封装 CompletableFuture 对象
-     * @param executable
-     * @param parallelExecutor
-     * @param whenCondition
-     * @param currChainId
-     * @param slotIndex
-     * @return
+     * @param executable executable
+     * @param parallelExecutor parallelExecutor
+     * @param whenCondition whenCondition
+     * @param currChainId currChainId
+     * @param slotIndex slotIndex
+     * @return CompletableFuture
      */
     protected CompletableFuture<WhenFutureObj> wrappedFutureObj(Executable executable, ExecutorService parallelExecutor,
                                                                 WhenCondition whenCondition, String currChainId, Integer slotIndex) {
@@ -62,7 +62,7 @@ public abstract class ParallelStrategyExecutor {
 
     /**
      * 设置 WhenCondition 参数
-     * @param whenCondition
+     * @param whenCondition whenCondition
      */
     protected void setWhenConditionParams(WhenCondition whenCondition) {
         // 获得 liteflow 的参数
@@ -87,9 +87,9 @@ public abstract class ParallelStrategyExecutor {
     /**
      * 过滤 WHEN 待执行任务
      * @param executableList 所有任务列表
-     * @param slotIndex
+     * @param slotIndex slotIndex
      * @param currentChainId 当前执行的 chainId
-     * @return
+     * @return Executable的Stream对象
      */
     protected Stream<Executable> filterWhenTaskList(List<Executable> executableList, Integer slotIndex, String currentChainId) {
         // 1.先进行过滤,前置和后置组件过滤掉,因为在 EL Chain 处理的时候已经提出来了
@@ -120,9 +120,9 @@ public abstract class ParallelStrategyExecutor {
 
     /**
      * 获取所有任务 CompletableFuture 集合
-     * @param whenCondition
-     * @param slotIndex
-     * @return
+     * @param whenCondition whenCondition
+     * @param slotIndex slotIndex
+     * @return List
      */
     protected List<CompletableFuture<WhenFutureObj>> getWhenAllTaskList(WhenCondition whenCondition, Integer slotIndex) {
 
@@ -152,7 +152,7 @@ public abstract class ParallelStrategyExecutor {
      * @param slotIndex 当前 slot 的 index
      * @param whenAllFutureList 并行组件中所有任务列表
      * @param specifyTask 指定预先完成的任务,详见 {@link ParallelStrategyEnum}
-     * @throws Exception
+     * @throws Exception 处理过程中抛的异常
      */
     protected void handleTaskResult(WhenCondition whenCondition, Integer slotIndex, List<CompletableFuture<WhenFutureObj>> whenAllFutureList,
                                     CompletableFuture<?> specifyTask) throws Exception {

+ 1 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyHelper.java

@@ -64,7 +64,7 @@ public class ParallelStrategyHelper {
 
     /**
      * 默认需完成所有任务
-     * @return
+     * @return ParallelStrategyExecutor
      */
     public ParallelStrategyExecutor buildParallelExecutor() {
         return buildParallelExecutor(ParallelStrategyEnum.ALL);

+ 2 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/log/LFLog.java

@@ -373,6 +373,8 @@ public class LFLog implements Logger{
     public void error(String s, Throwable throwable) {
         if (isPrint()) {
             this.log.error(getRId() + s, throwable);
+        }else{
+            this.log.error(getRId() + s);
         }
     }
 

+ 1 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorFile.java

@@ -53,7 +53,7 @@ public class MonitorFile {
 
 	/**
 	 * 创建文件监听
-	 */
+     */
 	public void create() throws Exception {
 		for (String path : PATH_SET) {
 			long interval = TimeUnit.MILLISECONDS.toMillis(2);

+ 2 - 6
liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java

@@ -382,9 +382,7 @@ public class Slot {
 		if (ObjectUtil.isNull(this.executeStepsStr)) {
 			this.executeStepsStr = getExecuteStepStr(true);
 		}
-		if (LiteflowConfigGetter.get().getPrintExecutionLog()) {
-			LOG.info("CHAIN_NAME[{}]\n{}", this.getChainName(), this.executeStepsStr);
-		}
+		LOG.info("CHAIN_NAME[{}]\n{}", this.getChainName(), this.executeStepsStr);
 	}
 
 	public void addRollbackStep(CmpStep step) {
@@ -418,9 +416,7 @@ public class Slot {
 		if (ObjectUtil.isNull(this.rollbackStepsStr)) {
 			this.rollbackStepsStr = getRollbackStepStr(true);
 		}
-		if (LiteflowConfigGetter.get().getPrintExecutionLog()) {
-			LOG.info("ROLLBACK_CHAIN_NAME[{}]\n{}", this.getChainName(), this.rollbackStepsStr);
-		}
+		LOG.info("ROLLBACK_CHAIN_NAME[{}]\n{}", this.getChainName(), this.rollbackStepsStr);
 	}
 
 

+ 1 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorCondition/ExecutorCondition.java

@@ -6,7 +6,7 @@ package com.yomahub.liteflow.thread.ExecutorCondition;
  * <p>Description: 执行器条件对象</p>
  *
  * @author jason
- * @Date 2024/11/12
+ * @since 2.13.0
  */
 public class ExecutorCondition {
     private final boolean conditionLevel;

+ 6 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorCondition/ExecutorConditionBuilder.java

@@ -15,13 +15,18 @@ import com.yomahub.liteflow.property.LiteflowConfig;
  * <p>Description: 执行器构建对象</p>
  *
  * @author jason
- * @Date 2024/11/12
+ * @since 2.13.0
  */
 
 public class ExecutorConditionBuilder {
 
     /**
      * 构建执行器条件
+     * @param condition condition
+     * @param chain chain
+     * @param liteflowConfig liteflowConfig
+     * @param type type
+     * @return ExecutorCondition
      */
     public static ExecutorCondition buildExecutorCondition(
             Condition condition,

+ 5 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java

@@ -111,6 +111,11 @@ public class MaxWaitSecondsELSpringbootTest extends BaseTest {
         assertNotTimeout("switch2");
     }
 
+    @Test
+    public void testSwitch3() {
+        assertNotTimeout("switch3");
+    }
+
     // 测试 IF 的超时情况
     @Test
     public void testIf1() {

+ 5 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml

@@ -62,6 +62,11 @@
         SWITCH(s).TO(a, b).maxWaitSeconds(3);
     </chain>
 
+    <chain name="switch3">
+        <!-- 不超时 -->
+        SWITCH(s).TO(a.maxWaitSeconds(3), b.maxWaitSeconds(2));
+    </chain>
+
     <!-- 条件编排测试 -->
     <!-- f 返回 true -->
     <chain name="if1">

+ 6 - 0
liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/pom.xml

@@ -80,6 +80,12 @@
             <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-jdbc</artifactId>
             <version>${shardingsphere.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.shardingsphere</groupId>
+                    <artifactId>shardingsphere-test-util</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 </project>

+ 1 - 2
pom.xml

@@ -39,7 +39,7 @@
 	</scm>
 
 	<properties>
-		<revision>2.12.4.2</revision>
+		<revision>2.13.0</revision>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<maven.compiler.source>8</maven.compiler.source>
@@ -374,7 +374,6 @@
 				<artifactId>maven-site-plugin</artifactId>
 				<version>3.7.1</version>
 			</plugin>
-
 			<!-- Javadoc -->
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>