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();
+ }
+}