This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 219fa5a  BIGTOP-4211: Optimize mybatis audit interceptor (#57)
219fa5a is described below

commit 219fa5acf114754951761c2645a3495ad3e53f7f
Author: timyuer <[email protected]>
AuthorDate: Mon Sep 9 10:01:46 2024 +0800

    BIGTOP-4211: Optimize mybatis audit interceptor (#57)
---
 .../src/main/resources/mapper/mysql/HostMapper.xml |  6 +--
 .../src/main/resources/mapper/mysql/RepoMapper.xml |  6 +--
 .../server/interceptor/AuditingInterceptor.java    | 49 ++++++++++++++++------
 3 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
index a1143a3..4c475a7 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -100,11 +100,11 @@
         </where>
     </select>
 
-    <insert id="saveAll">
-        insert into host (hostname, ipv4, ipv6, os, arch, 
available_processors, free_memory_size, total_memory_size, free_disk, 
total_disk, state, cluster_id)
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
+        insert into host (hostname, ipv4, ipv6, os, arch, 
available_processors, free_memory_size, total_memory_size, free_disk, 
total_disk, state, cluster_id, create_by, update_by, create_time, update_time)
         values
         <foreach collection='hosts' item='host' separator=','>
-            (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, 
#{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, 
#{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, 
#{host.clusterId})
+            (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, 
#{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, 
#{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, 
#{host.clusterId} 
,#{host.createBy},#{host.updateBy},#{host.createTime},#{host.updateTime})
         </foreach>
     </insert>
 
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
index 1382507..b51ab04 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
@@ -40,11 +40,11 @@
         limit 1
     </select>
 
-    <insert id="saveAll">
-        insert into repo (base_url, os, arch, repo_id, repo_name, cluster_id)
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
+        insert into repo (base_url, os, arch, repo_id, repo_name, cluster_id, 
create_by, update_by, create_time, update_time)
         values
         <foreach collection='clusters' item='cluster' separator=','>
-            
(#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.clusterId})
+            
(#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.clusterId},#{cluster.createBy},#{cluster.updateBy},#{cluster.createTime},#{cluster.updateTime})
         </foreach>
     </insert>
 
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/interceptor/AuditingInterceptor.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/interceptor/AuditingInterceptor.java
index 71e8d5c..7d7cb60 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/interceptor/AuditingInterceptor.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/interceptor/AuditingInterceptor.java
@@ -24,9 +24,10 @@ import org.apache.bigtop.manager.dao.annotations.CreateBy;
 import org.apache.bigtop.manager.dao.annotations.CreateTime;
 import org.apache.bigtop.manager.dao.annotations.UpdateBy;
 import org.apache.bigtop.manager.dao.annotations.UpdateTime;
-import org.apache.bigtop.manager.dao.po.BasePO;
 import org.apache.bigtop.manager.server.holder.SessionUserHolder;
 
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlCommandType;
@@ -41,6 +42,8 @@ import lombok.extern.slf4j.Slf4j;
 
 import java.lang.reflect.Field;
 import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 @Slf4j
@@ -53,6 +56,7 @@ import java.util.List;
 })
 public class AuditingInterceptor implements Interceptor {
 
+    @SuppressWarnings("unchecked")
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
         MappedStatement mappedStatement = (MappedStatement) 
invocation.getArgs()[0];
@@ -62,39 +66,60 @@ public class AuditingInterceptor implements Interceptor {
         Object parameter = invocation.getArgs()[1];
         log.debug("sqlCommandType {}", sqlCommandType);
 
-        if (!(parameter instanceof BasePO)) {
-            return invocation.proceed();
+        Collection<Object> objects;
+        if (parameter instanceof MapperMethod.ParamMap) {
+            MapperMethod.ParamMap<Object> paramMap = 
((MapperMethod.ParamMap<Object>) parameter);
+            if (paramMap.get("param1") instanceof Collection) {
+                objects = ((Collection<Object>) paramMap.get("param1"));
+            } else {
+                objects = Collections.singletonList(paramMap.get("param1"));
+            }
+        } else {
+            objects = Collections.singletonList(parameter);
+        }
+
+        for (Object o : objects) {
+            setAuditFields(o, sqlCommandType);
         }
 
+        return invocation.proceed();
+    }
+
+    private Pair<Long, Timestamp> getAuditInfo() {
         // Get the current time and operator
         Timestamp timestamp = new Timestamp(System.currentTimeMillis());
         Long currentUser = SessionUserHolder.getUserId();
         log.debug("timestamp: {} currentUser: {}", timestamp, currentUser);
+        return Pair.of(currentUser, timestamp);
+    }
+
+    private void setAuditFields(Object object, SqlCommandType sqlCommandType) 
throws IllegalAccessException {
+
+        Pair<Long, Timestamp> auditInfo = getAuditInfo();
+        Long currentUser = auditInfo.getLeft();
+        Timestamp timestamp = auditInfo.getRight();
 
-        // Modify audit fields
-        List<Field> fields = ClassUtils.getFields(parameter.getClass());
+        List<Field> fields = ClassUtils.getFields(object.getClass());
         if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE 
== sqlCommandType) {
             for (Field field : fields) {
-                boolean accessible = field.canAccess(parameter);
+                boolean accessible = field.canAccess(object);
                 field.setAccessible(true);
                 if (field.isAnnotationPresent(CreateBy.class)
                         && SqlCommandType.INSERT == sqlCommandType
                         && currentUser != null) {
-                    field.set(parameter, currentUser);
+                    field.set(object, currentUser);
                 }
                 if (field.isAnnotationPresent(CreateTime.class) && 
SqlCommandType.INSERT == sqlCommandType) {
-                    field.set(parameter, timestamp);
+                    field.set(object, timestamp);
                 }
                 if (field.isAnnotationPresent(UpdateBy.class) && currentUser 
!= null) {
-                    field.set(parameter, currentUser);
+                    field.set(object, currentUser);
                 }
                 if (field.isAnnotationPresent(UpdateTime.class)) {
-                    field.set(parameter, timestamp);
+                    field.set(object, timestamp);
                 }
                 field.setAccessible(accessible);
             }
         }
-
-        return invocation.proceed();
     }
 }

Reply via email to