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(