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 6121e4c  BIGTOP-4210: Add mybatis audit interceptor (#56)
6121e4c is described below

commit 6121e4cefea419acf8b4a66f6b57270a4389bfc3
Author: timyuer <[email protected]>
AuthorDate: Fri Aug 30 10:55:51 2024 +0800

    BIGTOP-4210: Add mybatis audit interceptor (#56)
---
 .../{po/BasePO.java => annotations/CreateBy.java}  |  28 ++----
 .../BasePO.java => annotations/CreateTime.java}    |  28 ++----
 .../{po/BasePO.java => annotations/UpdateBy.java}  |  28 ++----
 .../BasePO.java => annotations/UpdateTime.java}    |  28 ++----
 .../org/apache/bigtop/manager/dao/po/BasePO.java   |   9 ++
 .../server/interceptor/AuditingInterceptor.java    | 100 +++++++++++++++++++++
 6 files changed, 141 insertions(+), 80 deletions(-)

diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateBy.java
similarity index 65%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateBy.java
index 7fe37f9..44af380 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateBy.java
@@ -16,25 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.po;
+package org.apache.bigtop.manager.dao.annotations;
 
-import lombok.Data;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-import jakarta.persistence.Column;
-import java.sql.Timestamp;
-
-@Data
-public abstract class BasePO {
-
-    @Column(name = "create_time")
-    private Timestamp createTime;
-
-    @Column(name = "update_time")
-    private Timestamp updateTime;
-
-    @Column(name = "create_by")
-    private Long createBy;
-
-    @Column(name = "update_by")
-    private Long updateBy;
-}
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.FIELD})
+public @interface CreateBy {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateTime.java
similarity index 65%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateTime.java
index 7fe37f9..288657b 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/CreateTime.java
@@ -16,25 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.po;
+package org.apache.bigtop.manager.dao.annotations;
 
-import lombok.Data;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-import jakarta.persistence.Column;
-import java.sql.Timestamp;
-
-@Data
-public abstract class BasePO {
-
-    @Column(name = "create_time")
-    private Timestamp createTime;
-
-    @Column(name = "update_time")
-    private Timestamp updateTime;
-
-    @Column(name = "create_by")
-    private Long createBy;
-
-    @Column(name = "update_by")
-    private Long updateBy;
-}
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.FIELD})
+public @interface CreateTime {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateBy.java
similarity index 65%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateBy.java
index 7fe37f9..f2e63ee 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateBy.java
@@ -16,25 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.po;
+package org.apache.bigtop.manager.dao.annotations;
 
-import lombok.Data;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-import jakarta.persistence.Column;
-import java.sql.Timestamp;
-
-@Data
-public abstract class BasePO {
-
-    @Column(name = "create_time")
-    private Timestamp createTime;
-
-    @Column(name = "update_time")
-    private Timestamp updateTime;
-
-    @Column(name = "create_by")
-    private Long createBy;
-
-    @Column(name = "update_by")
-    private Long updateBy;
-}
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.FIELD})
+public @interface UpdateBy {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateTime.java
similarity index 65%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
copy to 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateTime.java
index 7fe37f9..b26d824 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/annotations/UpdateTime.java
@@ -16,25 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.po;
+package org.apache.bigtop.manager.dao.annotations;
 
-import lombok.Data;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-import jakarta.persistence.Column;
-import java.sql.Timestamp;
-
-@Data
-public abstract class BasePO {
-
-    @Column(name = "create_time")
-    private Timestamp createTime;
-
-    @Column(name = "update_time")
-    private Timestamp updateTime;
-
-    @Column(name = "create_by")
-    private Long createBy;
-
-    @Column(name = "update_by")
-    private Long updateBy;
-}
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.FIELD})
+public @interface UpdateTime {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
index 7fe37f9..42fef72 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/BasePO.java
@@ -18,6 +18,11 @@
  */
 package org.apache.bigtop.manager.dao.po;
 
+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 lombok.Data;
 
 import jakarta.persistence.Column;
@@ -26,15 +31,19 @@ import java.sql.Timestamp;
 @Data
 public abstract class BasePO {
 
+    @CreateTime
     @Column(name = "create_time")
     private Timestamp createTime;
 
+    @UpdateTime
     @Column(name = "update_time")
     private Timestamp updateTime;
 
+    @CreateBy
     @Column(name = "create_by")
     private Long createBy;
 
+    @UpdateBy
     @Column(name = "update_by")
     private Long updateBy;
 }
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
new file mode 100644
index 0000000..71e8d5c
--- /dev/null
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/interceptor/AuditingInterceptor.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.bigtop.manager.server.interceptor;
+
+import org.apache.bigtop.manager.common.utils.ClassUtils;
+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.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Signature;
+
+import org.springframework.stereotype.Component;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Field;
+import java.sql.Timestamp;
+import java.util.List;
+
+@Slf4j
+@Component
+@Intercepts({
+    @Signature(
+            type = Executor.class,
+            method = "update",
+            args = {MappedStatement.class, Object.class})
+})
+public class AuditingInterceptor implements Interceptor {
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        MappedStatement mappedStatement = (MappedStatement) 
invocation.getArgs()[0];
+        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+
+        // Get Entity Object
+        Object parameter = invocation.getArgs()[1];
+        log.debug("sqlCommandType {}", sqlCommandType);
+
+        if (!(parameter instanceof BasePO)) {
+            return invocation.proceed();
+        }
+
+        // Get the current time and operator
+        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
+        Long currentUser = SessionUserHolder.getUserId();
+        log.debug("timestamp: {} currentUser: {}", timestamp, currentUser);
+
+        // Modify audit fields
+        List<Field> fields = ClassUtils.getFields(parameter.getClass());
+        if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE 
== sqlCommandType) {
+            for (Field field : fields) {
+                boolean accessible = field.canAccess(parameter);
+                field.setAccessible(true);
+                if (field.isAnnotationPresent(CreateBy.class)
+                        && SqlCommandType.INSERT == sqlCommandType
+                        && currentUser != null) {
+                    field.set(parameter, currentUser);
+                }
+                if (field.isAnnotationPresent(CreateTime.class) && 
SqlCommandType.INSERT == sqlCommandType) {
+                    field.set(parameter, timestamp);
+                }
+                if (field.isAnnotationPresent(UpdateBy.class) && currentUser 
!= null) {
+                    field.set(parameter, currentUser);
+                }
+                if (field.isAnnotationPresent(UpdateTime.class)) {
+                    field.set(parameter, timestamp);
+                }
+                field.setAccessible(accessible);
+            }
+        }
+
+        return invocation.proceed();
+    }
+}

Reply via email to