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 e191d28a5e [#6486] feat(iceberg): supports change Iceberg request in 
pre event listener (#6485)
e191d28a5e is described below

commit e191d28a5e0f43b98a7555f59c8bec2bc6c8b82b
Author: FANNG <[email protected]>
AuthorDate: Wed Jul 9 11:49:10 2025 +0800

    [#6486] feat(iceberg): supports change Iceberg request in pre event 
listener (#6485)
    
    ### What changes were proposed in this pull request?
    
    Adding `transformPreEvent` method to `EventListenerPlugin` to make event
    listener modify pre-events.
    
    ```java
    public interface EventListenerPlugin {
      default SupportsChangingPreEvent 
transformPreEvent(SupportsChangingPreEvent preEvent) {
        return preEvent;
      }
    }
    ```
    
    ### Why are the changes needed?
    
    Fix: #6486
    
    ### Does this PR introduce _any_ user-facing change?
    no
    
    ### How was this patch tested?
    change the iceberg request and it take affects when creating table in
    local enviroment
---
 .../workflows/backend-integration-test-action.yml  |  2 +-
 .../org/apache/gravitino/listener/EventBus.java    | 39 +++++++++++++++++--
 .../listener/EventListenerPluginWrapper.java       | 10 +++++
 .../listener/api/EventListenerPlugin.java          | 15 ++++++++
 .../api/event/SupportsChangingPreEvent.java        | 34 ++++------------
 .../gravitino/listener/CountingPreEvent.java       | 30 +++++----------
 .../gravitino/listener/DummyEventListener.java     | 12 ++++++
 .../listener/TestEventListenerManager.java         | 20 ++++++++++
 .../IcebergNamespaceEventDispatcher.java           | 45 +++++++++++++++++-----
 .../dispatcher/IcebergTableEventDispatcher.java    | 37 +++++++++++++-----
 .../dispatcher/IcebergViewEventDispatcher.java     | 35 ++++++++++++-----
 .../api/event/IcebergCreateNamespacePreEvent.java  |  3 +-
 .../api/event/IcebergCreateTablePreEvent.java      |  3 +-
 .../api/event/IcebergCreateViewPreEvent.java       |  3 +-
 .../api/event/IcebergReplaceViewPreEvent.java      |  3 +-
 .../api/event/IcebergUpdateNamespacePreEvent.java  |  3 +-
 .../api/event/IcebergUpdateTablePreEvent.java      |  3 +-
 17 files changed, 211 insertions(+), 86 deletions(-)

diff --git a/.github/workflows/backend-integration-test-action.yml 
b/.github/workflows/backend-integration-test-action.yml
index 18adeae34b..9d69a2914e 100644
--- a/.github/workflows/backend-integration-test-action.yml
+++ b/.github/workflows/backend-integration-test-action.yml
@@ -75,4 +75,4 @@ jobs:
             distribution/package/logs/*.log
             catalogs/**/*.log
             catalogs/**/*.tar
-            distribution/**/*.log
\ No newline at end of file
+            distribution/**/*.log
diff --git a/core/src/main/java/org/apache/gravitino/listener/EventBus.java 
b/core/src/main/java/org/apache/gravitino/listener/EventBus.java
index 24277c8462..b0f34d03ba 100644
--- a/core/src/main/java/org/apache/gravitino/listener/EventBus.java
+++ b/core/src/main/java/org/apache/gravitino/listener/EventBus.java
@@ -20,13 +20,16 @@
 package org.apache.gravitino.listener;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
 import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
 import org.apache.gravitino.listener.api.event.PreEvent;
+import org.apache.gravitino.listener.api.event.SupportsChangingPreEvent;
 
 /**
  * The {@code EventBus} class serves as a mechanism to dispatch events to 
registered listeners. It
@@ -67,12 +70,15 @@ public class EventBus {
    * implementation, which could be either synchronous or asynchronous.
    *
    * @param baseEvent The event to be dispatched to all registered listeners.
+   * @return an Optional containing the transformed pre-event if it implements 
{@link
+   *     SupportsChangingPreEvent}, otherwise {@link Optional#empty() empty}
    */
-  public void dispatchEvent(BaseEvent baseEvent) {
+  public Optional<BaseEvent> dispatchEvent(BaseEvent baseEvent) {
     if (baseEvent instanceof PreEvent) {
-      dispatchPreEvent((PreEvent) baseEvent);
+      return dispatchAndTransformPreEvent((PreEvent) baseEvent);
     } else if (baseEvent instanceof Event) {
       dispatchPostEvent((Event) baseEvent);
+      return Optional.empty();
     } else {
       throw new RuntimeException("Unknown event type:" + 
baseEvent.getClass().getSimpleName());
     }
@@ -98,7 +104,34 @@ public class EventBus {
     eventListeners.forEach(eventListener -> 
eventListener.onPostEvent(postEvent));
   }
 
-  private void dispatchPreEvent(PreEvent preEvent) throws ForbiddenException {
+  private Optional<BaseEvent> dispatchAndTransformPreEvent(PreEvent 
originalEvent)
+      throws ForbiddenException {
+    boolean supportsChangePreEvent = originalEvent instanceof 
SupportsChangingPreEvent;
+    PreEvent preEvent;
+    if (supportsChangePreEvent) {
+      preEvent = (PreEvent) transformPreEvent((SupportsChangingPreEvent) 
originalEvent);
+    } else {
+      preEvent = originalEvent;
+    }
     eventListeners.forEach(eventListener -> 
eventListener.onPreEvent(preEvent));
+    return supportsChangePreEvent ? Optional.of(preEvent) : Optional.empty();
+  }
+
+  private SupportsChangingPreEvent transformPreEvent(SupportsChangingPreEvent 
preEvent) {
+    SupportsChangingPreEvent tmpPreEvent = preEvent;
+    for (EventListenerPlugin eventListener : eventListeners) {
+      tmpPreEvent = eventListener.transformPreEvent(tmpPreEvent);
+      Preconditions.checkNotNull(
+          tmpPreEvent,
+          String.format("%s transformPreEvent return null", 
getListenerName(eventListener)));
+    }
+    return tmpPreEvent;
+  }
+
+  private String getListenerName(EventListenerPlugin eventListener) {
+    if (eventListener instanceof EventListenerPluginWrapper) {
+      return ((EventListenerPluginWrapper) eventListener).listenerName();
+    }
+    return eventListener.getClass().getSimpleName();
   }
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
 
b/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
index a170d727bb..dd1dd2302c 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/EventListenerPluginWrapper.java
@@ -26,6 +26,7 @@ import org.apache.gravitino.listener.api.EventListenerPlugin;
 import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
 import org.apache.gravitino.listener.api.event.PreEvent;
+import org.apache.gravitino.listener.api.event.SupportsChangingPreEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,6 +95,15 @@ public class EventListenerPluginWrapper implements 
EventListenerPlugin {
     }
   }
 
+  @Override
+  public SupportsChangingPreEvent transformPreEvent(SupportsChangingPreEvent 
preEvent) {
+    return userEventListener.transformPreEvent(preEvent);
+  }
+
+  public String listenerName() {
+    return listenerName;
+  }
+
   @VisibleForTesting
   public EventListenerPlugin getUserEventListener() {
     return userEventListener;
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java 
b/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
index 06d5b44401..ec54268f38 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/EventListenerPlugin.java
@@ -20,10 +20,12 @@
 package org.apache.gravitino.listener.api;
 
 import java.util.Map;
+import javax.validation.constraints.NotNull;
 import org.apache.gravitino.annotation.DeveloperApi;
 import org.apache.gravitino.exceptions.ForbiddenException;
 import org.apache.gravitino.listener.api.event.Event;
 import org.apache.gravitino.listener.api.event.PreEvent;
+import org.apache.gravitino.listener.api.event.SupportsChangingPreEvent;
 
 /**
  * Defines an interface for event listeners that manage the lifecycle and 
state of a plugin,
@@ -121,6 +123,19 @@ public interface EventListenerPlugin {
    */
   default void onPreEvent(PreEvent preEvent) throws ForbiddenException {}
 
+  /**
+   * Transforms a pre-event before listener processing.
+   *
+   * <p>Plugins can modify the pre-event through this method. Transformation 
order follows the event
+   * listener configuration sequence.
+   *
+   * @param preEvent Pre-event to transform
+   * @return Transformed pre-event
+   */
+  default @NotNull SupportsChangingPreEvent 
transformPreEvent(SupportsChangingPreEvent preEvent) {
+    return preEvent;
+  }
+
   /**
    * Specifies the default operational mode for event processing by the 
plugin. The default
    * implementation is synchronous, but implementers can override this to 
utilize asynchronous
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SupportsChangingPreEvent.java
similarity index 51%
copy from 
iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
copy to 
core/src/main/java/org/apache/gravitino/listener/api/event/SupportsChangingPreEvent.java
index ce8f529ae1..3b8f21386e 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SupportsChangingPreEvent.java
@@ -19,29 +19,11 @@
 
 package org.apache.gravitino.listener.api.event;
 
-import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.annotation.DeveloperApi;
-import org.apache.iceberg.rest.requests.CreateViewRequest;
-
-/** Represent a pre event before creating Iceberg view. */
-@DeveloperApi
-public class IcebergCreateViewPreEvent extends IcebergViewPreEvent {
-  private final CreateViewRequest createViewRequest;
-
-  public IcebergCreateViewPreEvent(
-      IcebergRequestContext icebergRequestContext,
-      NameIdentifier viewIdentifier,
-      CreateViewRequest createViewRequest) {
-    super(icebergRequestContext, viewIdentifier);
-    this.createViewRequest = createViewRequest;
-  }
-
-  public CreateViewRequest createViewRequest() {
-    return createViewRequest;
-  }
-
-  @Override
-  public OperationType operationType() {
-    return OperationType.CREATE_VIEW;
-  }
-}
+/**
+ * Marks pre-events that can be modified.
+ *
+ * <p>Pre-events implementing this interface can be transformed in {@link
+ * 
org.apache.gravitino.listener.api.EventListenerPlugin#transformPreEvent(SupportsChangingPreEvent)}.
+ * All subsequent operations will use the transformed event instead of the 
original.
+ */
+public interface SupportsChangingPreEvent {}
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
 b/core/src/test/java/org/apache/gravitino/listener/CountingPreEvent.java
similarity index 52%
copy from 
iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
copy to core/src/test/java/org/apache/gravitino/listener/CountingPreEvent.java
index ce8f529ae1..ca77b0e912 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
+++ b/core/src/test/java/org/apache/gravitino/listener/CountingPreEvent.java
@@ -17,31 +17,21 @@
  *  under the License.
  */
 
-package org.apache.gravitino.listener.api.event;
+package org.apache.gravitino.listener;
 
 import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.annotation.DeveloperApi;
-import org.apache.iceberg.rest.requests.CreateViewRequest;
+import org.apache.gravitino.listener.api.event.PreEvent;
+import org.apache.gravitino.listener.api.event.SupportsChangingPreEvent;
 
-/** Represent a pre event before creating Iceberg view. */
-@DeveloperApi
-public class IcebergCreateViewPreEvent extends IcebergViewPreEvent {
-  private final CreateViewRequest createViewRequest;
+public class CountingPreEvent extends PreEvent implements 
SupportsChangingPreEvent {
+  private final int count;
 
-  public IcebergCreateViewPreEvent(
-      IcebergRequestContext icebergRequestContext,
-      NameIdentifier viewIdentifier,
-      CreateViewRequest createViewRequest) {
-    super(icebergRequestContext, viewIdentifier);
-    this.createViewRequest = createViewRequest;
+  protected CountingPreEvent(String user, NameIdentifier identifier, int 
count) {
+    super(user, identifier);
+    this.count = count;
   }
 
-  public CreateViewRequest createViewRequest() {
-    return createViewRequest;
-  }
-
-  @Override
-  public OperationType operationType() {
-    return OperationType.CREATE_VIEW;
+  public int count() {
+    return count;
   }
 }
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java 
b/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
index 2e34362ad6..44ffa7dd67 100644
--- a/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
+++ b/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
@@ -28,6 +28,7 @@ import org.apache.gravitino.exceptions.ForbiddenException;
 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.apache.gravitino.listener.api.event.SupportsChangingPreEvent;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Assertions;
 
@@ -52,6 +53,17 @@ public class DummyEventListener implements 
EventListenerPlugin {
     postEvents.add(event);
   }
 
+  @Override
+  public SupportsChangingPreEvent transformPreEvent(
+      SupportsChangingPreEvent supportsChangingPreEvent) {
+    if (supportsChangingPreEvent instanceof CountingPreEvent) {
+      PreEvent preEvent = (PreEvent) supportsChangingPreEvent;
+      return new CountingPreEvent(
+          preEvent.user(), preEvent.identifier(), ((CountingPreEvent) 
preEvent).count() + 1);
+    }
+    return supportsChangingPreEvent;
+  }
+
   @Override
   public void onPreEvent(PreEvent preEvent) {
     if 
(preEvent.equals(TestEventListenerManager.DUMMY_FORBIDDEN_PRE_EVENT_INSTANCE)) {
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
 
b/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
index 5f1905dd2b..30faada6be 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/TestEventListenerManager.java
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.gravitino.NameIdentifier;
@@ -30,6 +31,7 @@ import org.apache.gravitino.exceptions.ForbiddenException;
 import 
org.apache.gravitino.listener.DummyEventListener.DummyAsyncEventListener;
 import 
org.apache.gravitino.listener.DummyEventListener.DummyAsyncIsolatedEventListener;
 import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.Event;
 import org.apache.gravitino.listener.api.event.OperationStatus;
 import org.apache.gravitino.listener.api.event.PreEvent;
@@ -250,6 +252,24 @@ public class TestEventListenerManager {
     eventListenerManager.stop();
   }
 
+  @Test
+  void testTransformPreEvent() {
+    String sync1 = "sync1";
+    String sync2 = "sync2";
+    Map<String, String> properties = createSyncEventListenerConfig(sync1, 
sync2);
+
+    EventListenerManager eventListenerManager = new EventListenerManager();
+    eventListenerManager.init(properties);
+    eventListenerManager.start();
+
+    EventBus eventBus = eventListenerManager.createEventBus();
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(new CountingPreEvent("user1", 
NameIdentifier.of("ns", "name"), 0));
+    Assertions.assertTrue(transformedEvent.isPresent());
+    Assertions.assertTrue(transformedEvent.get() instanceof CountingPreEvent);
+    Assertions.assertEquals(2, ((CountingPreEvent) 
transformedEvent.get()).count());
+  }
+
   private Map<String, String> createIsolatedAsyncEventListenerConfig(String 
async1, String async2) {
     Map<String, String> config = new HashMap<>();
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergNamespaceEventDispatcher.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergNamespaceEventDispatcher.java
index 57fa916b7d..4cba4499a7 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergNamespaceEventDispatcher.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergNamespaceEventDispatcher.java
@@ -19,9 +19,11 @@
 
 package org.apache.gravitino.iceberg.service.dispatcher;
 
+import java.util.Optional;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateNamespaceEvent;
 import 
org.apache.gravitino.listener.api.event.IcebergCreateNamespaceFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateNamespacePreEvent;
@@ -82,20 +84,30 @@ public class IcebergNamespaceEventDispatcher implements 
IcebergNamespaceOperatio
         IcebergRestUtils.getGravitinoNameIdentifier(
             metalakeName, context.catalogName(), createRequest.namespace());
 
-    eventBus.dispatchEvent(
-        new IcebergCreateNamespacePreEvent(context, nameIdentifier, 
createRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergCreateNamespacePreEvent(context, nameIdentifier, 
createRequest));
+    IcebergCreateNamespacePreEvent transformedCreateEvent =
+        (IcebergCreateNamespacePreEvent) transformedEvent.get();
 
     CreateNamespaceResponse createResponse;
     try {
-      createResponse = operationDispatcher.createNamespace(context, 
createRequest);
+      createResponse =
+          operationDispatcher.createNamespace(
+              context, transformedCreateEvent.createNamespaceRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergCreateNamespaceFailureEvent(context, nameIdentifier, 
createRequest, e));
+          new IcebergCreateNamespaceFailureEvent(
+              context, nameIdentifier, 
transformedCreateEvent.createNamespaceRequest(), e));
       throw e;
     }
 
     eventBus.dispatchEvent(
-        new IcebergCreateNamespaceEvent(context, nameIdentifier, 
createRequest, createResponse));
+        new IcebergCreateNamespaceEvent(
+            context,
+            nameIdentifier,
+            transformedCreateEvent.createNamespaceRequest(),
+            createResponse));
     return createResponse;
   }
 
@@ -107,20 +119,33 @@ public class IcebergNamespaceEventDispatcher implements 
IcebergNamespaceOperatio
     NameIdentifier nameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(metalakeName, 
context.catalogName(), namespace);
 
-    eventBus.dispatchEvent(
-        new IcebergUpdateNamespacePreEvent(context, nameIdentifier, 
updateRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergUpdateNamespacePreEvent(context, nameIdentifier, 
updateRequest));
+    IcebergUpdateNamespacePreEvent transformedUpdateEvent =
+        (IcebergUpdateNamespacePreEvent) transformedEvent.get();
 
     UpdateNamespacePropertiesResponse updateResponse;
     try {
-      updateResponse = operationDispatcher.updateNamespace(context, namespace, 
updateRequest);
+      updateResponse =
+          operationDispatcher.updateNamespace(
+              context, namespace, 
transformedUpdateEvent.updateNamespacePropertiesRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergUpdateNamespaceFailureEvent(context, nameIdentifier, 
updateRequest, e));
+          new IcebergUpdateNamespaceFailureEvent(
+              context,
+              nameIdentifier,
+              transformedUpdateEvent.updateNamespacePropertiesRequest(),
+              e));
       throw e;
     }
 
     eventBus.dispatchEvent(
-        new IcebergUpdateNamespaceEvent(context, nameIdentifier, 
updateRequest, updateResponse));
+        new IcebergUpdateNamespaceEvent(
+            context,
+            nameIdentifier,
+            transformedUpdateEvent.updateNamespacePropertiesRequest(),
+            updateResponse));
     return updateResponse;
   }
 
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 aae0214a2e..1dddce8904 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
@@ -19,9 +19,11 @@
 
 package org.apache.gravitino.iceberg.service.dispatcher;
 
+import java.util.Optional;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateTableEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateTableFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateTablePreEvent;
@@ -79,20 +81,28 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
     NameIdentifier nameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
             metalakeName, context.catalogName(), tableIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergCreateTablePreEvent(context, nameIdentifier, 
createTableRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergCreateTablePreEvent(context, nameIdentifier, 
createTableRequest));
+    IcebergCreateTablePreEvent transformedCreateEvent =
+        (IcebergCreateTablePreEvent) transformedEvent.get();
     LoadTableResponse loadTableResponse;
     try {
       loadTableResponse =
-          icebergTableOperationDispatcher.createTable(context, namespace, 
createTableRequest);
+          icebergTableOperationDispatcher.createTable(
+              context, namespace, transformedCreateEvent.createTableRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergCreateTableFailureEvent(context, nameIdentifier, 
createTableRequest, e));
+          new IcebergCreateTableFailureEvent(
+              context, nameIdentifier, 
transformedCreateEvent.createTableRequest(), e));
       throw e;
     }
     eventBus.dispatchEvent(
         new IcebergCreateTableEvent(
-            context, nameIdentifier, createTableRequest, loadTableResponse));
+            context,
+            nameIdentifier,
+            transformedCreateEvent.createTableRequest(),
+            loadTableResponse));
     return loadTableResponse;
   }
 
@@ -104,21 +114,28 @@ public class IcebergTableEventDispatcher implements 
IcebergTableOperationDispatc
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
             metalakeName, context.catalogName(), tableIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergUpdateTablePreEvent(context, gravitinoNameIdentifier, 
updateTableRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergUpdateTablePreEvent(context, gravitinoNameIdentifier, 
updateTableRequest));
+    IcebergUpdateTablePreEvent transformedUpdateEvent =
+        (IcebergUpdateTablePreEvent) transformedEvent.get();
     LoadTableResponse loadTableResponse;
     try {
       loadTableResponse =
-          icebergTableOperationDispatcher.updateTable(context, 
tableIdentifier, updateTableRequest);
+          icebergTableOperationDispatcher.updateTable(
+              context, tableIdentifier, 
transformedUpdateEvent.updateTableRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
           new IcebergUpdateTableFailureEvent(
-              context, gravitinoNameIdentifier, updateTableRequest, e));
+              context, gravitinoNameIdentifier, 
transformedUpdateEvent.updateTableRequest(), e));
       throw e;
     }
     eventBus.dispatchEvent(
         new IcebergUpdateTableEvent(
-            context, gravitinoNameIdentifier, updateTableRequest, 
loadTableResponse));
+            context,
+            gravitinoNameIdentifier,
+            transformedUpdateEvent.updateTableRequest(),
+            loadTableResponse));
     return loadTableResponse;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergViewEventDispatcher.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergViewEventDispatcher.java
index 89137ea912..761021e441 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergViewEventDispatcher.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergViewEventDispatcher.java
@@ -19,9 +19,11 @@
 
 package org.apache.gravitino.iceberg.service.dispatcher;
 
+import java.util.Optional;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.event.BaseEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateViewEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateViewFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergCreateViewPreEvent;
@@ -79,19 +81,25 @@ public class IcebergViewEventDispatcher implements 
IcebergViewOperationDispatche
     NameIdentifier nameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
             metalakeName, context.catalogName(), viewIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergCreateViewPreEvent(context, nameIdentifier, 
createViewRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergCreateViewPreEvent(context, nameIdentifier, 
createViewRequest));
+    IcebergCreateViewPreEvent transformedCreateEvent =
+        (IcebergCreateViewPreEvent) transformedEvent.get();
     LoadViewResponse loadViewResponse;
     try {
       loadViewResponse =
-          icebergViewOperationDispatcher.createView(context, namespace, 
createViewRequest);
+          icebergViewOperationDispatcher.createView(
+              context, namespace, transformedCreateEvent.createViewRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
-          new IcebergCreateViewFailureEvent(context, nameIdentifier, 
createViewRequest, e));
+          new IcebergCreateViewFailureEvent(
+              context, nameIdentifier, 
transformedCreateEvent.createViewRequest(), e));
       throw e;
     }
     eventBus.dispatchEvent(
-        new IcebergCreateViewEvent(context, nameIdentifier, createViewRequest, 
loadViewResponse));
+        new IcebergCreateViewEvent(
+            context, nameIdentifier, 
transformedCreateEvent.createViewRequest(), loadViewResponse));
     return loadViewResponse;
   }
 
@@ -103,21 +111,28 @@ public class IcebergViewEventDispatcher implements 
IcebergViewOperationDispatche
     NameIdentifier gravitinoNameIdentifier =
         IcebergRestUtils.getGravitinoNameIdentifier(
             metalakeName, context.catalogName(), viewIdentifier);
-    eventBus.dispatchEvent(
-        new IcebergReplaceViewPreEvent(context, gravitinoNameIdentifier, 
replaceViewRequest));
+    Optional<BaseEvent> transformedEvent =
+        eventBus.dispatchEvent(
+            new IcebergReplaceViewPreEvent(context, gravitinoNameIdentifier, 
replaceViewRequest));
+    IcebergReplaceViewPreEvent transformedReplaceEvent =
+        (IcebergReplaceViewPreEvent) transformedEvent.get();
     LoadViewResponse loadViewResponse;
     try {
       loadViewResponse =
-          icebergViewOperationDispatcher.replaceView(context, viewIdentifier, 
replaceViewRequest);
+          icebergViewOperationDispatcher.replaceView(
+              context, viewIdentifier, 
transformedReplaceEvent.replaceViewRequest());
     } catch (Exception e) {
       eventBus.dispatchEvent(
           new IcebergReplaceViewFailureEvent(
-              context, gravitinoNameIdentifier, replaceViewRequest, e));
+              context, gravitinoNameIdentifier, 
transformedReplaceEvent.replaceViewRequest(), e));
       throw e;
     }
     eventBus.dispatchEvent(
         new IcebergReplaceViewEvent(
-            context, gravitinoNameIdentifier, replaceViewRequest, 
loadViewResponse));
+            context,
+            gravitinoNameIdentifier,
+            transformedReplaceEvent.replaceViewRequest(),
+            loadViewResponse));
     return loadViewResponse;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateNamespacePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateNamespacePreEvent.java
index a908582c63..77b3f53fec 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateNamespacePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateNamespacePreEvent.java
@@ -25,7 +25,8 @@ import 
org.apache.iceberg.rest.requests.CreateNamespaceRequest;
 
 /** Represent a pre event before creating Iceberg namespace. */
 @DeveloperApi
-public class IcebergCreateNamespacePreEvent extends IcebergNamespacePreEvent {
+public class IcebergCreateNamespacePreEvent extends IcebergNamespacePreEvent
+    implements SupportsChangingPreEvent {
   private final CreateNamespaceRequest createNamespaceRequest;
 
   public IcebergCreateNamespacePreEvent(
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 7c34833298..c9dd31d03d 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
@@ -25,7 +25,8 @@ import org.apache.iceberg.rest.requests.CreateTableRequest;
 
 /** Represent a pre event before creating Iceberg table. */
 @DeveloperApi
-public class IcebergCreateTablePreEvent extends IcebergTablePreEvent {
+public class IcebergCreateTablePreEvent extends IcebergTablePreEvent
+    implements SupportsChangingPreEvent {
   private final CreateTableRequest createTableRequest;
 
   public IcebergCreateTablePreEvent(
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
index ce8f529ae1..141c82219f 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateViewPreEvent.java
@@ -25,7 +25,8 @@ import org.apache.iceberg.rest.requests.CreateViewRequest;
 
 /** Represent a pre event before creating Iceberg view. */
 @DeveloperApi
-public class IcebergCreateViewPreEvent extends IcebergViewPreEvent {
+public class IcebergCreateViewPreEvent extends IcebergViewPreEvent
+    implements SupportsChangingPreEvent {
   private final CreateViewRequest createViewRequest;
 
   public IcebergCreateViewPreEvent(
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergReplaceViewPreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergReplaceViewPreEvent.java
index 439a88c860..622d86f63a 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergReplaceViewPreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergReplaceViewPreEvent.java
@@ -25,7 +25,8 @@ import org.apache.iceberg.rest.requests.UpdateTableRequest;
 
 /** Represent a pre event before updating Iceberg view. */
 @DeveloperApi
-public class IcebergReplaceViewPreEvent extends IcebergViewPreEvent {
+public class IcebergReplaceViewPreEvent extends IcebergViewPreEvent
+    implements SupportsChangingPreEvent {
   private final UpdateTableRequest replaceViewRequest;
 
   public IcebergReplaceViewPreEvent(
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateNamespacePreEvent.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateNamespacePreEvent.java
index 04e3b1392e..656484f6cb 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateNamespacePreEvent.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateNamespacePreEvent.java
@@ -25,7 +25,8 @@ import 
org.apache.iceberg.rest.requests.UpdateNamespacePropertiesRequest;
 
 /** Represent a pre event before updating Iceberg namespace. */
 @DeveloperApi
-public class IcebergUpdateNamespacePreEvent extends IcebergNamespacePreEvent {
+public class IcebergUpdateNamespacePreEvent extends IcebergNamespacePreEvent
+    implements SupportsChangingPreEvent {
   private final UpdateNamespacePropertiesRequest 
updateNamespacePropertiesRequest;
 
   public IcebergUpdateNamespacePreEvent(
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 83f5b87895..75a1c7765d 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
@@ -25,7 +25,8 @@ import org.apache.iceberg.rest.requests.UpdateTableRequest;
 
 /** Represent a pre event before updating Iceberg table. */
 @DeveloperApi
-public class IcebergUpdateTablePreEvent extends IcebergTablePreEvent {
+public class IcebergUpdateTablePreEvent extends IcebergTablePreEvent
+    implements SupportsChangingPreEvent {
   private final UpdateTableRequest updateTableRequest;
 
   public IcebergUpdateTablePreEvent(


Reply via email to