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

jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new fd71e6cd2 [#5518] feat(iceberg): add http header and remote addr 
information to Iceberg Event  (#5495)
fd71e6cd2 is described below

commit fd71e6cd26f5aae7f534d66a3d7573e64691380f
Author: FANNG <[email protected]>
AuthorDate: Tue Nov 12 11:20:38 2024 +0800

    [#5518] feat(iceberg): add http header and remote addr information to 
Iceberg Event  (#5495)
    
    ### What changes were proposed in this pull request?
    1. add HTTP header to event listener context
    2. add remote IP addr to event listener context
    
    ### Why are the changes needed?
    
    Fix: #5518
    
    ### Does this PR introduce _any_ user-facing change?
    no
    
    ### How was this patch tested?
    setup a local app and check IP addr and HTTP header was added to context
---
 iceberg/iceberg-rest-server/build.gradle.kts       |  1 -
 .../iceberg/service/IcebergRestUtils.java          | 17 ++++
 .../dispatcher/IcebergTableEventDispatcher.java    | 87 +++++++------------
 .../IcebergTableOperationDispatcher.java           |  2 +-
 .../dispatcher/IcebergTableOperationExecutor.java  | 18 ++--
 .../service/rest/IcebergTableOperations.java       | 20 +++--
 .../service/rest/IcebergTableRenameOperations.java | 11 ++-
 .../api/event/IcebergCreateTableEvent.java         |  4 +-
 .../api/event/IcebergCreateTableFailureEvent.java  |  4 +-
 .../api/event/IcebergCreateTablePreEvent.java      |  6 +-
 .../listener/api/event/IcebergDropTableEvent.java  |  6 +-
 .../api/event/IcebergDropTableFailureEvent.java    |  7 +-
 .../api/event/IcebergDropTablePreEvent.java        |  6 +-
 .../gravitino/listener/api/event/IcebergEvent.java | 12 ++-
 .../listener/api/event/IcebergFailureEvent.java    | 12 ++-
 .../listener/api/event/IcebergListTableEvent.java  |  5 +-
 .../api/event/IcebergListTableFailureEvent.java    |  5 +-
 .../api/event/IcebergListTablePreEvent.java        |  5 +-
 .../listener/api/event/IcebergLoadTableEvent.java  |  6 +-
 .../api/event/IcebergLoadTableFailureEvent.java    |  5 +-
 .../api/event/IcebergLoadTablePreEvent.java        |  5 +-
 .../listener/api/event/IcebergPreEvent.java        | 12 ++-
 .../api/event/IcebergRenameTableEvent.java         |  6 +-
 .../api/event/IcebergRenameTableFailureEvent.java  |  4 +-
 .../api/event/IcebergRenameTablePreEvent.java      |  6 +-
 .../listener/api/event/IcebergRequestContext.java  | 98 ++++++++++++++++++++++
 .../listener/api/event/IcebergTableEvent.java      |  5 +-
 .../api/event/IcebergTableExistsEvent.java         |  7 +-
 .../api/event/IcebergTableExistsFailureEvent.java  |  5 +-
 .../api/event/IcebergTableExistsPreEvent.java      |  5 +-
 .../api/event/IcebergTableFailureEvent.java        |  5 +-
 .../listener/api/event/IcebergTablePreEvent.java   |  4 +-
 .../api/event/IcebergUpdateTableEvent.java         |  4 +-
 .../api/event/IcebergUpdateTableFailureEvent.java  |  4 +-
 .../api/event/IcebergUpdateTablePreEvent.java      |  6 +-
 .../iceberg/service/rest/DummyEventListener.java   | 74 ++++++++++++++++
 .../iceberg/service/rest/IcebergRestTestUtil.java  | 21 ++++-
 .../service/rest/MockIcebergTableOperations.java   | 43 ++++++++++
 .../rest/MockIcebergTableRenameOperations.java}    | 22 +++--
 .../service/rest/TestIcebergTableOperations.java   | 86 ++++++++++++++++++-
 40 files changed, 515 insertions(+), 146 deletions(-)

diff --git a/iceberg/iceberg-rest-server/build.gradle.kts 
b/iceberg/iceberg-rest-server/build.gradle.kts
index c635ecd79..5d84ef778 100644
--- a/iceberg/iceberg-rest-server/build.gradle.kts
+++ b/iceberg/iceberg-rest-server/build.gradle.kts
@@ -60,7 +60,6 @@ dependencies {
   implementation(libs.metrics.jersey2)
 
   annotationProcessor(libs.lombok)
-
   compileOnly(libs.lombok)
 
   testImplementation(project(":bundles:aws-bundle"))
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
index 23ceb7790..ba747e060 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
@@ -25,7 +25,11 @@ import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.stream.Stream;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
@@ -122,6 +126,19 @@ public class IcebergRestUtils {
     return NameIdentifier.of(catalogNS.toArray(String[]::new));
   }
 
+  public static Map<String, String> getHttpHeaders(HttpServletRequest 
httpServletRequest) {
+    Map<String, String> headers = new HashMap<>();
+    Enumeration<String> headerNames = httpServletRequest.getHeaderNames();
+    while (headerNames.hasMoreElements()) {
+      String headerName = headerNames.nextElement();
+      String headerValue = httpServletRequest.getHeader(headerName);
+      if (headerValue != null) {
+        headers.put(headerName, headerValue);
+      }
+    }
+    return headers;
+  }
+
   // remove the last '/' from the prefix, for example transform 
'iceberg_catalog/' to
   // 'iceberg_catalog'
   private static String normalizePrefix(String rawPrefix) {
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
index 60bb517a0..aae0214a2 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
@@ -20,7 +20,6 @@
 package org.apache.gravitino.iceberg.service.dispatcher;
 
 import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import org.apache.gravitino.listener.EventBus;
 import org.apache.gravitino.listener.api.event.IcebergCreateTableEvent;
@@ -38,13 +37,13 @@ import 
org.apache.gravitino.listener.api.event.IcebergLoadTablePreEvent;
 import org.apache.gravitino.listener.api.event.IcebergRenameTableEvent;
 import org.apache.gravitino.listener.api.event.IcebergRenameTableFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergRenameTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.listener.api.event.IcebergTableExistsEvent;
 import org.apache.gravitino.listener.api.event.IcebergTableExistsFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergTableExistsPreEvent;
 import org.apache.gravitino.listener.api.event.IcebergUpdateTableEvent;
 import org.apache.gravitino.listener.api.event.IcebergUpdateTableFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergUpdateTablePreEvent;
-import org.apache.gravitino.utils.PrincipalUtils;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.rest.requests.CreateTableRequest;
@@ -79,26 +78,21 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
     TableIdentifier tableIdentifier = TableIdentifier.of(namespace, 
createTableRequest.name());
     NameIdentifier nameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), tableIdentifier);
+            metalakeName, context.catalogName(), tableIdentifier);
     eventBus.dispatchEvent(
-        new IcebergCreateTablePreEvent(
-            PrincipalUtils.getCurrentUserName(), nameIdentifier, 
createTableRequest));
+        new IcebergCreateTablePreEvent(context, nameIdentifier, 
createTableRequest));
     LoadTableResponse loadTableResponse;
     try {
       loadTableResponse =
           icebergTableOperationDispatcher.createTable(context, namespace, 
createTableRequest);
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergCreateTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), nameIdentifier, 
createTableRequest, e));
+          new IcebergCreateTableFailureEvent(context, nameIdentifier, 
createTableRequest, e));
       throw e;
     }
     eventBus.dispatchEvent(
         new IcebergCreateTableEvent(
-            PrincipalUtils.getCurrentUserName(),
-            nameIdentifier,
-            createTableRequest,
-            loadTableResponse));
+            context, nameIdentifier, createTableRequest, loadTableResponse));
     return loadTableResponse;
   }
 
@@ -109,10 +103,9 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
       UpdateTableRequest updateTableRequest) {
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), tableIdentifier);
+            metalakeName, context.catalogName(), tableIdentifier);
     eventBus.dispatchEvent(
-        new IcebergUpdateTablePreEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
updateTableRequest));
+        new IcebergUpdateTablePreEvent(context, gravitinoNameIdentifier, 
updateTableRequest));
     LoadTableResponse loadTableResponse;
     try {
       loadTableResponse =
@@ -120,15 +113,12 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
     } catch (Exception e) {
       eventBus.dispatchEvent(
           new IcebergUpdateTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
updateTableRequest, e));
+              context, gravitinoNameIdentifier, updateTableRequest, e));
       throw e;
     }
     eventBus.dispatchEvent(
         new IcebergUpdateTableEvent(
-            PrincipalUtils.getCurrentUserName(),
-            gravitinoNameIdentifier,
-            updateTableRequest,
-            loadTableResponse));
+            context, gravitinoNameIdentifier, updateTableRequest, 
loadTableResponse));
     return loadTableResponse;
   }
 
@@ -137,21 +127,18 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
       IcebergRequestContext context, TableIdentifier tableIdentifier, boolean 
purgeRequested) {
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), tableIdentifier);
+            metalakeName, context.catalogName(), tableIdentifier);
     eventBus.dispatchEvent(
-        new IcebergDropTablePreEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
purgeRequested));
+        new IcebergDropTablePreEvent(context, gravitinoNameIdentifier, 
purgeRequested));
     try {
       icebergTableOperationDispatcher.dropTable(context, tableIdentifier, 
purgeRequested);
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergDropTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
purgeRequested, e));
+          new IcebergDropTableFailureEvent(context, gravitinoNameIdentifier, 
purgeRequested, e));
       throw e;
     }
     eventBus.dispatchEvent(
-        new IcebergDropTableEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
purgeRequested));
+        new IcebergDropTableEvent(context, gravitinoNameIdentifier, 
purgeRequested));
   }
 
   @Override
@@ -159,42 +146,33 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
       IcebergRequestContext context, TableIdentifier tableIdentifier) {
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), tableIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergLoadTablePreEvent(PrincipalUtils.getCurrentUserName(), 
gravitinoNameIdentifier));
+            metalakeName, context.catalogName(), tableIdentifier);
+    eventBus.dispatchEvent(new IcebergLoadTablePreEvent(context, 
gravitinoNameIdentifier));
     LoadTableResponse loadTableResponse;
     try {
       loadTableResponse = icebergTableOperationDispatcher.loadTable(context, 
tableIdentifier);
     } catch (Exception e) {
-      eventBus.dispatchEvent(
-          new IcebergLoadTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
e));
+      eventBus.dispatchEvent(new IcebergLoadTableFailureEvent(context, 
gravitinoNameIdentifier, e));
       throw e;
     }
     eventBus.dispatchEvent(
-        new IcebergLoadTableEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
loadTableResponse));
+        new IcebergLoadTableEvent(context, gravitinoNameIdentifier, 
loadTableResponse));
     return loadTableResponse;
   }
 
   @Override
   public ListTablesResponse listTable(IcebergRequestContext context, Namespace 
namespace) {
     NameIdentifier gravitinoNameIdentifier =
-        IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), namespace);
-    eventBus.dispatchEvent(
-        new IcebergListTablePreEvent(PrincipalUtils.getCurrentUserName(), 
gravitinoNameIdentifier));
+        IcebergRestUtils.getGravitinoNameIdentifier(metalakeName, 
context.catalogName(), namespace);
+    eventBus.dispatchEvent(new IcebergListTablePreEvent(context, 
gravitinoNameIdentifier));
     ListTablesResponse listTablesResponse;
     try {
       listTablesResponse = icebergTableOperationDispatcher.listTable(context, 
namespace);
     } catch (Exception e) {
-      eventBus.dispatchEvent(
-          new IcebergListTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
e));
+      eventBus.dispatchEvent(new IcebergListTableFailureEvent(context, 
gravitinoNameIdentifier, e));
       throw e;
     }
-    eventBus.dispatchEvent(
-        new IcebergListTableEvent(PrincipalUtils.getCurrentUserName(), 
gravitinoNameIdentifier));
+    eventBus.dispatchEvent(new IcebergListTableEvent(context, 
gravitinoNameIdentifier));
     return listTablesResponse;
   }
 
@@ -202,22 +180,17 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
   public boolean tableExists(IcebergRequestContext context, TableIdentifier 
tableIdentifier) {
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), tableIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergTableExistsPreEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier));
+            metalakeName, context.catalogName(), tableIdentifier);
+    eventBus.dispatchEvent(new IcebergTableExistsPreEvent(context, 
gravitinoNameIdentifier));
     boolean isExists;
     try {
       isExists = icebergTableOperationDispatcher.tableExists(context, 
tableIdentifier);
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergTableExistsFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
e));
+          new IcebergTableExistsFailureEvent(context, gravitinoNameIdentifier, 
e));
       throw e;
     }
-    eventBus.dispatchEvent(
-        new IcebergTableExistsEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
isExists));
+    eventBus.dispatchEvent(new IcebergTableExistsEvent(context, 
gravitinoNameIdentifier, isExists));
     return isExists;
   }
 
@@ -226,20 +199,18 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
     TableIdentifier sourceTable = renameTableRequest.source();
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
-            metalakeName, context.getCatalogName(), sourceTable);
+            metalakeName, context.catalogName(), sourceTable);
     eventBus.dispatchEvent(
-        new IcebergRenameTablePreEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
renameTableRequest));
+        new IcebergRenameTablePreEvent(context, gravitinoNameIdentifier, 
renameTableRequest));
     try {
       icebergTableOperationDispatcher.renameTable(context, renameTableRequest);
     } catch (Exception e) {
       eventBus.dispatchEvent(
           new IcebergRenameTableFailureEvent(
-              PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
renameTableRequest, e));
+              context, gravitinoNameIdentifier, renameTableRequest, e));
       throw e;
     }
     eventBus.dispatchEvent(
-        new IcebergRenameTableEvent(
-            PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier, 
renameTableRequest));
+        new IcebergRenameTableEvent(context, gravitinoNameIdentifier, 
renameTableRequest));
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
index 49b910960..34c0a7174 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
@@ -19,7 +19,7 @@
 
 package org.apache.gravitino.iceberg.service.dispatcher;
 
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.rest.requests.CreateTableRequest;
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
index d2993b13e..e6385bfdc 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
@@ -20,7 +20,7 @@
 package org.apache.gravitino.iceberg.service.dispatcher;
 
 import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.rest.requests.CreateTableRequest;
@@ -41,7 +41,7 @@ public class IcebergTableOperationExecutor implements 
IcebergTableOperationDispa
   public LoadTableResponse createTable(
       IcebergRequestContext context, Namespace namespace, CreateTableRequest 
createTableRequest) {
     return icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .createTable(namespace, createTableRequest);
   }
 
@@ -51,7 +51,7 @@ public class IcebergTableOperationExecutor implements 
IcebergTableOperationDispa
       TableIdentifier tableIdentifier,
       UpdateTableRequest updateTableRequest) {
     return icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .updateTable(tableIdentifier, updateTableRequest);
   }
 
@@ -60,11 +60,11 @@ public class IcebergTableOperationExecutor implements 
IcebergTableOperationDispa
       IcebergRequestContext context, TableIdentifier tableIdentifier, boolean 
purgeRequested) {
     if (purgeRequested) {
       icebergCatalogWrapperManager
-          .getCatalogWrapper(context.getCatalogName())
+          .getCatalogWrapper(context.catalogName())
           .purgeTable(tableIdentifier);
     } else {
       icebergCatalogWrapperManager
-          .getCatalogWrapper(context.getCatalogName())
+          .getCatalogWrapper(context.catalogName())
           .dropTable(tableIdentifier);
     }
   }
@@ -73,28 +73,28 @@ public class IcebergTableOperationExecutor implements 
IcebergTableOperationDispa
   public LoadTableResponse loadTable(
       IcebergRequestContext context, TableIdentifier tableIdentifier) {
     return icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .loadTable(tableIdentifier);
   }
 
   @Override
   public ListTablesResponse listTable(IcebergRequestContext context, Namespace 
namespace) {
     return icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .listTable(namespace);
   }
 
   @Override
   public boolean tableExists(IcebergRequestContext context, TableIdentifier 
tableIdentifier) {
     return icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .tableExists(tableIdentifier);
   }
 
   @Override
   public void renameTable(IcebergRequestContext context, RenameTableRequest 
renameTableRequest) {
     icebergCatalogWrapperManager
-        .getCatalogWrapper(context.getCatalogName())
+        .getCatalogWrapper(context.catalogName())
         .renameTable(renameTableRequest);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
index a9ffe1265..3ad5fa7ff 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
@@ -49,10 +49,10 @@ import org.apache.gravitino.credential.CredentialProvider;
 import org.apache.gravitino.credential.CredentialUtils;
 import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
 import org.apache.gravitino.iceberg.service.IcebergObjectMapper;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
 import org.apache.gravitino.iceberg.service.metrics.IcebergMetricsManager;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
@@ -104,7 +104,7 @@ public class IcebergTableOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("List Iceberg tables, catalog: {}, namespace: {}", catalogName, 
icebergNS);
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     ListTablesResponse listTablesResponse = 
tableOperationDispatcher.listTable(context, icebergNS);
     return IcebergRestUtils.ok(listTablesResponse);
   }
@@ -129,7 +129,7 @@ public class IcebergTableOperations {
         createTableRequest,
         accessDelegation,
         isCredentialVending);
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     LoadTableResponse loadTableResponse =
         tableOperationDispatcher.createTable(context, icebergNS, 
createTableRequest);
     if (isCredentialVending) {
@@ -163,7 +163,7 @@ public class IcebergTableOperations {
           table,
           SerializeUpdateTableRequest(updateTableRequest));
     }
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
     LoadTableResponse loadTableResponse =
         tableOperationDispatcher.updateTable(context, tableIdentifier, 
updateTableRequest);
@@ -189,7 +189,7 @@ public class IcebergTableOperations {
         table,
         purgeRequested);
     TableIdentifier tableIdentifier = TableIdentifier.of(namespace, table);
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     tableOperationDispatcher.dropTable(context, tableIdentifier, 
purgeRequested);
     return IcebergRestUtils.noContent();
   }
@@ -218,7 +218,7 @@ public class IcebergTableOperations {
         isCredentialVending);
     // todo support snapshots
     TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     LoadTableResponse loadTableResponse =
         tableOperationDispatcher.loadTable(context, tableIdentifier);
     if (isCredentialVending) {
@@ -245,7 +245,7 @@ public class IcebergTableOperations {
         catalogName,
         icebergNS,
         table);
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
     boolean exists = tableOperationDispatcher.tableExists(context, 
tableIdentifier);
     if (exists) {
@@ -269,6 +269,12 @@ public class IcebergTableOperations {
     return IcebergRestUtils.noContent();
   }
 
+  // HTTP request is null in Jersey test, override with a mock request when 
testing.
+  @VisibleForTesting
+  HttpServletRequest httpServletRequest() {
+    return httpRequest;
+  }
+
   private String SerializeUpdateTableRequest(UpdateTableRequest 
updateTableRequest) {
     try {
       return icebergObjectMapper.writeValueAsString(updateTableRequest);
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
index bced33e77..bd2021d74 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
@@ -20,6 +20,7 @@ package org.apache.gravitino.iceberg.service.rest;
 
 import com.codahale.metrics.annotation.ResponseMetered;
 import com.codahale.metrics.annotation.Timed;
+import com.google.common.annotations.VisibleForTesting;
 import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
@@ -30,9 +31,9 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
 import org.apache.iceberg.rest.requests.RenameTableRequest;
 import org.slf4j.Logger;
@@ -65,8 +66,14 @@ public class IcebergTableRenameOperations {
         catalogName,
         renameTableRequest.source(),
         renameTableRequest.destination());
-    IcebergRequestContext context = new IcebergRequestContext(httpRequest, 
catalogName);
+    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
     tableOperationDispatcher.renameTable(context, renameTableRequest);
     return IcebergRestUtils.okWithoutContent();
   }
+
+  // HTTP request is null in Jersey test, override with a mock request when 
testing.
+  @VisibleForTesting
+  HttpServletRequest httpServletRequest() {
+    return httpRequest;
+  }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
index 1ce2d8f77..46b8514b8 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
@@ -33,11 +33,11 @@ public class IcebergCreateTableEvent extends 
IcebergTableEvent {
   private LoadTableResponse loadTableResponse;
 
   public IcebergCreateTableEvent(
-      String user,
+      IcebergRequestContext icebergRequestContext,
       NameIdentifier resourceIdentifier,
       CreateTableRequest createTableRequest,
       LoadTableResponse loadTableResponse) {
-    super(user, resourceIdentifier);
+    super(icebergRequestContext, resourceIdentifier);
     this.createTableRequest =
         IcebergRestUtils.cloneIcebergRESTObject(createTableRequest, 
CreateTableRequest.class);
     this.loadTableResponse =
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
index bc67ef2d5..07b033d3d 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
@@ -30,11 +30,11 @@ public class IcebergCreateTableFailureEvent extends 
IcebergTableFailureEvent {
   private CreateTableRequest createTableRequest;
 
   public IcebergCreateTableFailureEvent(
-      String user,
+      IcebergRequestContext icebergRequestContext,
       NameIdentifier nameIdentifier,
       CreateTableRequest createTableRequest,
       Exception e) {
-    super(user, nameIdentifier, e);
+    super(icebergRequestContext, nameIdentifier, e);
     this.createTableRequest =
         IcebergRestUtils.cloneIcebergRESTObject(createTableRequest, 
CreateTableRequest.class);
   }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
index 81937e501..552f0d452 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergCreateTablePreEvent extends 
IcebergTablePreEvent {
   private CreateTableRequest createTableRequest;
 
   public IcebergCreateTablePreEvent(
-      String user, NameIdentifier resourceIdentifier, CreateTableRequest 
createTableRequest) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      CreateTableRequest createTableRequest) {
+    super(icebergRequestContext, resourceIdentifier);
     this.createTableRequest = createTableRequest;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
index 3b5c447bd..69f517676 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
@@ -28,8 +28,10 @@ public class IcebergDropTableEvent extends IcebergTableEvent 
{
   private boolean purgeRequested;
 
   public IcebergDropTableEvent(
-      String user, NameIdentifier resourceIdentifier, boolean purgeRequested) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      boolean purgeRequested) {
+    super(icebergRequestContext, resourceIdentifier);
     this.purgeRequested = purgeRequested;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
index e57ed35c5..8c58bc08f 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
@@ -28,8 +28,11 @@ public class IcebergDropTableFailureEvent extends 
IcebergTableFailureEvent {
   private boolean purgeRequested;
 
   public IcebergDropTableFailureEvent(
-      String user, NameIdentifier nameIdentifier, Boolean purgeRequested, 
Exception e) {
-    super(user, nameIdentifier, e);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier nameIdentifier,
+      Boolean purgeRequested,
+      Exception e) {
+    super(icebergRequestContext, nameIdentifier, e);
     this.purgeRequested = purgeRequested;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
index 5e90a88ba..b8301229a 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
@@ -28,8 +28,10 @@ public class IcebergDropTablePreEvent extends 
IcebergTablePreEvent {
   private boolean purgeRequested;
 
   public IcebergDropTablePreEvent(
-      String user, NameIdentifier tableIdentifier, boolean purgeRequested) {
-    super(user, tableIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier tableIdentifier,
+      boolean purgeRequested) {
+    super(icebergRequestContext, tableIdentifier);
     this.purgeRequested = purgeRequested;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
index 50ec07863..51088faa8 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represents an abstract post event in Gravitino Iceberg REST server. */
 @DeveloperApi
 public abstract class IcebergEvent extends Event {
-  protected IcebergEvent(String user, NameIdentifier resourceIdentifier) {
-    super(user, resourceIdentifier);
+  private IcebergRequestContext icebergRequestContext;
+
+  protected IcebergEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
resourceIdentifier) {
+    super(icebergRequestContext.userName(), resourceIdentifier);
+    this.icebergRequestContext = icebergRequestContext;
+  }
+
+  public IcebergRequestContext icebergRequestContext() {
+    return icebergRequestContext;
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
index e166bfdc9..b428e79bd 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represents an abstract failure event in Gravitino Iceberg REST server. */
 @DeveloperApi
 public abstract class IcebergFailureEvent extends FailureEvent {
-  protected IcebergFailureEvent(String user, NameIdentifier nameIdentifier, 
Exception e) {
-    super(user, nameIdentifier, e);
+  private IcebergRequestContext icebergRequestContext;
+
+  protected IcebergFailureEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
nameIdentifier, Exception e) {
+    super(icebergRequestContext.userName(), nameIdentifier, e);
+    this.icebergRequestContext = icebergRequestContext;
+  }
+
+  public IcebergRequestContext icebergRequestContext() {
+    return icebergRequestContext;
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
index 22589d2cd..1e03c5d43 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
@@ -31,7 +31,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
  */
 @DeveloperApi
 public class IcebergListTableEvent extends IcebergTableEvent {
-  public IcebergListTableEvent(String user, NameIdentifier resourceIdentifier) 
{
-    super(user, resourceIdentifier);
+  public IcebergListTableEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
resourceIdentifier) {
+    super(icebergRequestContext, resourceIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
index 3cbda0f44..0047886cb 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a failure event when listing Iceberg table failed. */
 @DeveloperApi
 public class IcebergListTableFailureEvent extends IcebergTableFailureEvent {
-  public IcebergListTableFailureEvent(String user, NameIdentifier 
nameIdentifier, Exception e) {
-    super(user, nameIdentifier, e);
+  public IcebergListTableFailureEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
nameIdentifier, Exception e) {
+    super(icebergRequestContext, nameIdentifier, e);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
index 7da059c7e..8657c8b2c 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a pre event before listing Iceberg table. */
 @DeveloperApi
 public class IcebergListTablePreEvent extends IcebergTablePreEvent {
-  public IcebergListTablePreEvent(String user, NameIdentifier tableIdentifier) 
{
-    super(user, tableIdentifier);
+  public IcebergListTablePreEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
tableIdentifier) {
+    super(icebergRequestContext, tableIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
index 7007fd706..16e5734c7 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
@@ -30,8 +30,10 @@ public class IcebergLoadTableEvent extends IcebergTableEvent 
{
   private LoadTableResponse loadTableResponse;
 
   public IcebergLoadTableEvent(
-      String user, NameIdentifier resourceIdentifier, LoadTableResponse 
loadTableResponse) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      LoadTableResponse loadTableResponse) {
+    super(icebergRequestContext, resourceIdentifier);
     this.loadTableResponse =
         IcebergRestUtils.cloneIcebergRESTObject(loadTableResponse, 
LoadTableResponse.class);
   }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
index 03402583b..f4c4c881f 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a failure event when loading Iceberg table failed. */
 @DeveloperApi
 public class IcebergLoadTableFailureEvent extends IcebergTableFailureEvent {
-  public IcebergLoadTableFailureEvent(String user, NameIdentifier 
nameIdentifier, Exception e) {
-    super(user, nameIdentifier, e);
+  public IcebergLoadTableFailureEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
nameIdentifier, Exception e) {
+    super(icebergRequestContext, nameIdentifier, e);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
index 9485b1b93..5c22884a4 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a pre event before loading Iceberg table. */
 @DeveloperApi
 public class IcebergLoadTablePreEvent extends IcebergTablePreEvent {
-  public IcebergLoadTablePreEvent(String user, NameIdentifier tableIdentifier) 
{
-    super(user, tableIdentifier);
+  public IcebergLoadTablePreEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
tableIdentifier) {
+    super(icebergRequestContext, tableIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
index e57edde65..dffe13685 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represents an abstract pre event in Gravitino Iceberg REST server. */
 @DeveloperApi
 public abstract class IcebergPreEvent extends PreEvent {
-  protected IcebergPreEvent(String user, NameIdentifier resourceIdentifier) {
-    super(user, resourceIdentifier);
+  private IcebergRequestContext icebergRequestContext;
+
+  protected IcebergPreEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
resourceIdentifier) {
+    super(icebergRequestContext.userName(), resourceIdentifier);
+    this.icebergRequestContext = icebergRequestContext;
+  }
+
+  public IcebergRequestContext icebergRequestContext() {
+    return icebergRequestContext;
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
index 70b7ef4e9..f26b79714 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
@@ -30,8 +30,10 @@ public class IcebergRenameTableEvent extends 
IcebergTableEvent {
   private RenameTableRequest renameTableRequest;
 
   public IcebergRenameTableEvent(
-      String user, NameIdentifier resourceIdentifier, RenameTableRequest 
renameTableRequest) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      RenameTableRequest renameTableRequest) {
+    super(icebergRequestContext, resourceIdentifier);
     this.renameTableRequest =
         IcebergRestUtils.cloneIcebergRESTObject(renameTableRequest, 
RenameTableRequest.class);
   }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
index 936e56d10..f64a85bac 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
@@ -29,11 +29,11 @@ public class IcebergRenameTableFailureEvent extends 
IcebergTableFailureEvent {
   private RenameTableRequest renameTableRequest;
 
   public IcebergRenameTableFailureEvent(
-      String user,
+      IcebergRequestContext icebergRequestContext,
       NameIdentifier resourceIdentifier,
       RenameTableRequest renameTableRequest,
       Exception e) {
-    super(user, resourceIdentifier, e);
+    super(icebergRequestContext, resourceIdentifier, e);
     this.renameTableRequest = renameTableRequest;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
index 8b654ab03..579f23182 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergRenameTablePreEvent extends 
IcebergTablePreEvent {
   private RenameTableRequest renameTableRequest;
 
   public IcebergRenameTablePreEvent(
-      String user, NameIdentifier resourceIdentifier, RenameTableRequest 
renameTableRequest) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      RenameTableRequest renameTableRequest) {
+    super(icebergRequestContext, resourceIdentifier);
     this.renameTableRequest = renameTableRequest;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
new file mode 100644
index 000000000..c0849a117
--- /dev/null
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
@@ -0,0 +1,98 @@
+/*
+ *  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.gravitino.listener.api.event;
+
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.gravitino.iceberg.service.IcebergRestUtils;
+import org.apache.gravitino.utils.PrincipalUtils;
+
+/** The general request context information for Iceberg REST operations. */
+public class IcebergRequestContext {
+
+  // To keep compatibility with old IcebergRequestContext, will remove in new 
release.
+  @Deprecated private final HttpServletRequest httpServletRequest;
+  private final String catalogName;
+  private final String userName;
+  private final String remoteHostName;
+  private final Map<String, String> httpHeaders;
+
+  /**
+   * Constructs a new {@code IcebergRequestContext} with specified HTTP 
request and catalog name.
+   *
+   * @param httpRequest The HttpServletRequest object containing request 
details.
+   * @param catalogName The name of the catalog to be accessed in the request.
+   */
+  public IcebergRequestContext(HttpServletRequest httpRequest, String 
catalogName) {
+    this.httpServletRequest = httpRequest;
+    this.remoteHostName = httpRequest.getRemoteHost();
+    this.httpHeaders = IcebergRestUtils.getHttpHeaders(httpRequest);
+    this.catalogName = catalogName;
+    this.userName = PrincipalUtils.getCurrentUserName();
+  }
+
+  /**
+   * Returns the catalog name.
+   *
+   * @return The catalog name.
+   */
+  public String catalogName() {
+    return catalogName;
+  }
+
+  /**
+   * Returns the username of the HTTP client.
+   *
+   * @return The username.
+   */
+  public String userName() {
+    return userName;
+  }
+
+  /**
+   * Returns the hostname of the HTTP client.
+   *
+   * @return The remote host name.
+   */
+  public String remoteHostName() {
+    return remoteHostName;
+  }
+
+  /**
+   * Returns the Map of the HTTP headers.
+   *
+   * @return The HTTP header.
+   */
+  public Map<String, String> httpHeaders() {
+    return httpHeaders;
+  }
+
+  /**
+   * Retrieves the HttpServletRequest object. This method is deprecated and 
should be used
+   * cautiously.
+   *
+   * @return The HttpServletRequest associated with this context.
+   * @deprecated Use other methods to access specific request details instead.
+   */
+  @Deprecated
+  public HttpServletRequest getHttpServletRequest() {
+    return httpServletRequest;
+  }
+}
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
index e94a1938c..adbe02497 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
@@ -23,7 +23,8 @@ import org.apache.gravitino.NameIdentifier;
 
 /** Represents an abstract table post event in Gravitino Iceberg REST server. 
*/
 public abstract class IcebergTableEvent extends IcebergEvent {
-  protected IcebergTableEvent(String user, NameIdentifier resourceIdentifier) {
-    super(user, resourceIdentifier);
+  protected IcebergTableEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
resourceIdentifier) {
+    super(icebergRequestContext, resourceIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
index 512deac06..4e54945f2 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
@@ -27,8 +27,11 @@ import org.apache.gravitino.annotation.DeveloperApi;
 public class IcebergTableExistsEvent extends IcebergTableEvent {
   private boolean isExists;
 
-  public IcebergTableExistsEvent(String user, NameIdentifier 
resourceIdentifier, boolean isExists) {
-    super(user, resourceIdentifier);
+  public IcebergTableExistsEvent(
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      boolean isExists) {
+    super(icebergRequestContext, resourceIdentifier);
     this.isExists = isExists;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
index 04cb0d7e5..a482072c7 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a failure event when check Iceberg table exist failed. */
 @DeveloperApi
 public class IcebergTableExistsFailureEvent extends IcebergTableFailureEvent {
-  public IcebergTableExistsFailureEvent(String user, NameIdentifier 
nameIdentifier, Exception e) {
-    super(user, nameIdentifier, e);
+  public IcebergTableExistsFailureEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
nameIdentifier, Exception e) {
+    super(icebergRequestContext, nameIdentifier, e);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
index bdd666776..87317c464 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a pre event before checking Iceberg table exists. */
 @DeveloperApi
 public class IcebergTableExistsPreEvent extends IcebergTablePreEvent {
-  public IcebergTableExistsPreEvent(String user, NameIdentifier 
tableIdentifier) {
-    super(user, tableIdentifier);
+  public IcebergTableExistsPreEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
tableIdentifier) {
+    super(icebergRequestContext, tableIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
index f052b0060..4e2187f1a 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represent a failure event when do Iceberg table operation failed. */
 @DeveloperApi
 public class IcebergTableFailureEvent extends IcebergFailureEvent {
-  protected IcebergTableFailureEvent(String user, NameIdentifier 
nameIdentifier, Exception e) {
-    super(user, nameIdentifier, e);
+  protected IcebergTableFailureEvent(
+      IcebergRequestContext icebergRequestContext, NameIdentifier 
nameIdentifier, Exception e) {
+    super(icebergRequestContext, nameIdentifier, e);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
index 486c6f094..3e7bcaf50 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
@@ -25,7 +25,7 @@ import org.apache.gravitino.annotation.DeveloperApi;
 /** Represents an abstract table pre event in Gravitino Iceberg REST server. */
 @DeveloperApi
 public abstract class IcebergTablePreEvent extends IcebergPreEvent {
-  protected IcebergTablePreEvent(String user, NameIdentifier 
resourceIdentifier) {
-    super(user, resourceIdentifier);
+  protected IcebergTablePreEvent(IcebergRequestContext context, NameIdentifier 
resourceIdentifier) {
+    super(context, resourceIdentifier);
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
index 82ea7732f..7e675213a 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
@@ -33,11 +33,11 @@ public class IcebergUpdateTableEvent extends 
IcebergTableEvent {
   private LoadTableResponse loadTableResponse;
 
   public IcebergUpdateTableEvent(
-      String user,
+      IcebergRequestContext icebergRequestContext,
       NameIdentifier resourceIdentifier,
       UpdateTableRequest updateTableRequest,
       LoadTableResponse loadTableResponse) {
-    super(user, resourceIdentifier);
+    super(icebergRequestContext, resourceIdentifier);
     this.updateTableRequest =
         IcebergRestUtils.cloneIcebergRESTObject(updateTableRequest, 
UpdateTableRequest.class);
     this.loadTableResponse =
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
index 7f5b478ce..7624e248e 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
@@ -30,11 +30,11 @@ public class IcebergUpdateTableFailureEvent extends 
IcebergTableFailureEvent {
   private UpdateTableRequest updateTableRequest;
 
   public IcebergUpdateTableFailureEvent(
-      String user,
+      IcebergRequestContext icebergRequestContext,
       NameIdentifier nameIdentifier,
       UpdateTableRequest updateTableRequest,
       Exception e) {
-    super(user, nameIdentifier, e);
+    super(icebergRequestContext, nameIdentifier, e);
     this.updateTableRequest =
         IcebergRestUtils.cloneIcebergRESTObject(updateTableRequest, 
UpdateTableRequest.class);
   }
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
index 4681efbdb..a877a72fc 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergUpdateTablePreEvent extends 
IcebergTablePreEvent {
   private UpdateTableRequest updateTableRequest;
 
   public IcebergUpdateTablePreEvent(
-      String user, NameIdentifier resourceIdentifier, UpdateTableRequest 
updateTableRequest) {
-    super(user, resourceIdentifier);
+      IcebergRequestContext icebergRequestContext,
+      NameIdentifier resourceIdentifier,
+      UpdateTableRequest updateTableRequest) {
+    super(icebergRequestContext, resourceIdentifier);
     this.updateTableRequest = updateTableRequest;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
new file mode 100644
index 000000000..84f96402f
--- /dev/null
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
@@ -0,0 +1,74 @@
+/*
+ * 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.gravitino.iceberg.service.rest;
+
+import java.util.LinkedList;
+import java.util.Map;
+import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
+import org.junit.jupiter.api.Assertions;
+
+public class DummyEventListener implements EventListenerPlugin {
+  Map<String, String> properties;
+  LinkedList<Event> postEvents = new LinkedList<>();
+  LinkedList<PreEvent> preEvents = new LinkedList<>();
+
+  @Override
+  public void init(Map<String, String> properties) {
+    this.properties = properties;
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {}
+
+  @Override
+  public void onPostEvent(Event event) {
+    postEvents.add(event);
+  }
+
+  @Override
+  public void onPreEvent(PreEvent preEvent) {
+    preEvents.add(preEvent);
+  }
+
+  @Override
+  public Mode mode() {
+    return Mode.SYNC;
+  }
+
+  public Event popPostEvent() {
+    Assertions.assertTrue(postEvents.size() > 0, "No post events to pop");
+    return postEvents.removeLast();
+  }
+
+  public PreEvent popPreEvent() {
+    Assertions.assertTrue(preEvents.size() > 0, "No pre events to pop");
+    return preEvents.removeLast();
+  }
+
+  public void clearEvent() {
+    preEvents.clear();
+    postEvents.clear();
+  }
+}
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
index 1314a3bac..a2ee3d888 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
@@ -19,11 +19,17 @@
 
 package org.apache.gravitino.iceberg.service.rest;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import com.google.common.collect.Maps;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.servlet.http.HttpServletRequest;
 import org.apache.gravitino.catalog.lakehouse.iceberg.IcebergConstants;
 import org.apache.gravitino.credential.CredentialConstants;
 import org.apache.gravitino.iceberg.common.IcebergConfig;
@@ -39,6 +45,7 @@ import 
org.apache.gravitino.iceberg.service.provider.IcebergConfigProvider;
 import 
org.apache.gravitino.iceberg.service.provider.IcebergConfigProviderFactory;
 import 
org.apache.gravitino.iceberg.service.provider.StaticIcebergConfigProvider;
 import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.EventListenerPlugin;
 import org.glassfish.hk2.utilities.binding.AbstractBinder;
 import org.glassfish.jersey.jackson.JacksonFeature;
 import org.glassfish.jersey.logging.LoggingFeature;
@@ -64,10 +71,11 @@ public class IcebergRestTestUtil {
   public static final boolean DEBUG_SERVER_LOG_ENABLED = true;
 
   public static ResourceConfig getIcebergResourceConfig(Class c) {
-    return getIcebergResourceConfig(c, true);
+    return getIcebergResourceConfig(c, true, Arrays.asList());
   }
 
-  public static ResourceConfig getIcebergResourceConfig(Class c, boolean 
bindIcebergTableOps) {
+  public static ResourceConfig getIcebergResourceConfig(
+      Class c, boolean bindIcebergTableOps, List<EventListenerPlugin> 
eventListenerPlugins) {
     ResourceConfig resourceConfig = new ResourceConfig();
     resourceConfig.register(c);
     
resourceConfig.register(IcebergObjectMapperProvider.class).register(JacksonFeature.class);
@@ -98,7 +106,7 @@ public class IcebergRestTestUtil {
       IcebergCatalogWrapperManager icebergCatalogWrapperManager =
           new IcebergCatalogWrapperManagerForTest(catalogConf, configProvider);
 
-      EventBus eventBus = new EventBus(Arrays.asList());
+      EventBus eventBus = new EventBus(eventListenerPlugins);
 
       IcebergTableOperationExecutor icebergTableOperationExecutor =
           new IcebergTableOperationExecutor(icebergCatalogWrapperManager);
@@ -119,4 +127,11 @@ public class IcebergRestTestUtil {
     }
     return resourceConfig;
   }
+
+  static HttpServletRequest createMockHttpRequest() {
+    HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+    when(mockRequest.getRemoteHost()).thenReturn("localhost");
+    
when(mockRequest.getHeaderNames()).thenReturn(Collections.emptyEnumeration());
+    return mockRequest;
+  }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
new file mode 100644
index 000000000..9b9bd9306
--- /dev/null
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
@@ -0,0 +1,43 @@
+/*
+ *  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.gravitino.iceberg.service.rest;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
+import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
+import org.apache.gravitino.iceberg.service.metrics.IcebergMetricsManager;
+
+public class MockIcebergTableOperations extends IcebergTableOperations {
+
+  @Inject
+  public MockIcebergTableOperations(
+      IcebergCatalogWrapperManager icebergCatalogWrapperManager,
+      IcebergMetricsManager icebergMetricsManager,
+      IcebergTableOperationDispatcher tableOperationDispatcher) {
+    super(icebergCatalogWrapperManager, icebergMetricsManager, 
tableOperationDispatcher);
+  }
+
+  // HTTP request is null in Jersey test, create a mock request
+  @Override
+  HttpServletRequest httpServletRequest() {
+    return IcebergRestTestUtil.createMockHttpRequest();
+  }
+}
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
similarity index 59%
rename from 
iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
rename to 
iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
index ad8d7692f..8a71b8d70 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
@@ -17,18 +17,22 @@
  *  under the License.
  */
 
-package org.apache.gravitino.iceberg.service;
+package org.apache.gravitino.iceberg.service.rest;
 
+import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
-import lombok.Getter;
+import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
 
-/** The general request context information for Iceberg REST operations. */
-public class IcebergRequestContext {
-  @Getter private final HttpServletRequest httpRequest;
-  @Getter private final String catalogName;
+public class MockIcebergTableRenameOperations extends 
IcebergTableRenameOperations {
+  @Inject
+  public MockIcebergTableRenameOperations(
+      IcebergTableOperationDispatcher tableOperationDispatcher) {
+    super(tableOperationDispatcher);
+  }
 
-  public IcebergRequestContext(HttpServletRequest httpRequest, String 
catalogName) {
-    this.httpRequest = httpRequest;
-    this.catalogName = catalogName;
+  // HTTP request is null in Jersey test, create a mock request
+  @Override
+  HttpServletRequest httpServletRequest() {
+    return IcebergRestTestUtil.createMockHttpRequest();
   }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
index 809a4ff2c..59822d4bf 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
@@ -20,6 +20,7 @@
 package org.apache.gravitino.iceberg.service.rest;
 
 import com.google.common.collect.ImmutableSet;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -31,6 +32,27 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import org.apache.gravitino.credential.Credential;
 import org.apache.gravitino.iceberg.service.extension.DummyCredentialProvider;
+import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.IcebergCreateTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergCreateTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergCreateTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergTableExistsEvent;
+import org.apache.gravitino.listener.api.event.IcebergTableExistsPreEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTablePreEvent;
 import org.apache.iceberg.MetadataUpdate;
 import org.apache.iceberg.Schema;
 import org.apache.iceberg.TableMetadata;
@@ -63,13 +85,17 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
   private static final Schema newTableSchema =
       new Schema(NestedField.of(2, false, "foo_string1", StringType.get()));
 
+  private DummyEventListener dummyEventListener;
+
   @Override
   protected Application configure() {
+    this.dummyEventListener = new DummyEventListener();
     ResourceConfig resourceConfig =
-        
IcebergRestTestUtil.getIcebergResourceConfig(IcebergTableOperations.class);
+        IcebergRestTestUtil.getIcebergResourceConfig(
+            MockIcebergTableOperations.class, true, 
Arrays.asList(dummyEventListener));
     // create namespace before each table test
     resourceConfig.register(IcebergNamespaceOperations.class);
-    resourceConfig.register(IcebergTableRenameOperations.class);
+    resourceConfig.register(MockIcebergTableRenameOperations.class);
 
     return resourceConfig;
   }
@@ -77,10 +103,15 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
   @Test
   void testCreateTable() {
     verifyCreateTableFail("create_foo1", 404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergCreateTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergCreateTableFailureEvent);
 
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
 
     verifyCreateTableSucc("create_foo1");
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergCreateTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergCreateTableEvent);
 
     verifyCreateTableFail("create_foo1", 409);
     verifyCreateTableFail("", 400);
@@ -89,10 +120,17 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
   @Test
   void testLoadTable() {
     verifyLoadTableFail("load_foo1", 404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergLoadTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergLoadTableFailureEvent);
 
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyCreateTableSucc("load_foo1");
+
+    dummyEventListener.clearEvent();
     verifyLoadTableSucc("load_foo1");
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergLoadTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergLoadTableEvent);
 
     verifyLoadTableFail("load_foo2", 404);
   }
@@ -100,11 +138,20 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
   @Test
   void testDropTable() {
     verifyDropTableFail("drop_foo1", 404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergDropTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergDropTableFailureEvent);
+
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyDropTableFail("drop_foo1", 404);
 
     verifyCreateTableSucc("drop_foo1");
+
+    dummyEventListener.clearEvent();
     verifyDropTableSucc("drop_foo1");
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergDropTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergDropTableEvent);
+
     verifyLoadTableFail("drop_foo1", 404);
   }
 
@@ -113,10 +160,19 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyCreateTableSucc("update_foo1");
     TableMetadata metadata = getTableMeta("update_foo1");
+
+    dummyEventListener.clearEvent();
     verifyUpdateSucc("update_foo1", metadata);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergUpdateTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergUpdateTableEvent);
 
     verifyDropTableSucc("update_foo1");
+
+    dummyEventListener.clearEvent();
     verifyUpdateTableFail("update_foo1", 404, metadata);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergUpdateTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergUpdateTableFailureEvent);
 
     verifyDropNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyUpdateTableFail("update_foo1", 404, metadata);
@@ -127,21 +183,39 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
   void testListTables(String prefix) {
     setUrlPathWithPrefix(prefix);
     verifyListTableFail(404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergListTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergListTableFailureEvent);
 
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyCreateTableSucc("list_foo1");
     verifyCreateTableSucc("list_foo2");
+
+    dummyEventListener.clearEvent();
     verifyListTableSucc(ImmutableSet.of("list_foo1", "list_foo2"));
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergListTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergListTableEvent);
   }
 
   @Test
   void testTableExits() {
     verifyTableExistsStatusCode("exists_foo2", 404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergTableExistsPreEvent);
+    Event postEvent = dummyEventListener.popPostEvent();
+    Assertions.assertTrue(postEvent instanceof IcebergTableExistsEvent);
+    Assertions.assertEquals(false, ((IcebergTableExistsEvent) 
postEvent).isExists());
+
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyTableExistsStatusCode("exists_foo2", 404);
 
     verifyCreateTableSucc("exists_foo1");
+    dummyEventListener.clearEvent();
     verifyTableExistsStatusCode("exists_foo1", 200);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergTableExistsPreEvent);
+    postEvent = dummyEventListener.popPostEvent();
+    Assertions.assertTrue(postEvent instanceof IcebergTableExistsEvent);
+    Assertions.assertEquals(true, ((IcebergTableExistsEvent) 
postEvent).isExists());
+
     verifyLoadTableSucc("exists_foo1");
   }
 
@@ -151,11 +225,19 @@ public class TestIcebergTableOperations extends 
TestIcebergNamespaceOperations {
     setUrlPathWithPrefix(prefix);
     // namespace not exits
     verifyRenameTableFail("rename_foo1", "rename_foo3", 404);
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergRenameTablePreEvent);
+    Assertions.assertTrue(
+        dummyEventListener.popPostEvent() instanceof 
IcebergRenameTableFailureEvent);
 
     verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
     verifyCreateTableSucc("rename_foo1");
+
+    dummyEventListener.clearEvent();
     // rename
     verifyRenameTableSucc("rename_foo1", "rename_foo2");
+    Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof 
IcebergRenameTablePreEvent);
+    Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof 
IcebergRenameTableEvent);
+
     verifyLoadTableFail("rename_foo1", 404);
     verifyLoadTableSucc("rename_foo2");
 

Reply via email to