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

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


The following commit(s) were added to refs/heads/branch-0.9 by this push:
     new f5662ec20b [#7314] Implement ListFilesEvent in FilesetEventDispatcher 
(#7435)
f5662ec20b is described below

commit f5662ec20bf3d7de1b383db202b3bbf18715260e
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Jun 18 16:39:43 2025 -0700

    [#7314] Implement ListFilesEvent in FilesetEventDispatcher (#7435)
    
    ### What changes were proposed in this pull request?
    
    Implement `ListFilesEvent` in `FilesetEventDispatcher`.
    
    ### Why are the changes needed?
    
    Fix: #7314
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    Tests added.
    
    Co-authored-by: Yunchi Pang <[email protected]>
---
 .../gravitino/listener/FilesetEventDispatcher.java | 18 +++++-
 .../listener/api/event/ListFilesEvent.java         | 64 ++++++++++++++++++++++
 .../listener/api/event/ListFilesFailureEvent.java  | 64 ++++++++++++++++++++++
 .../listener/api/event/ListFilesPreEvent.java      | 53 ++++++++++++++++++
 .../listener/api/event/OperationType.java          |  1 +
 .../listener/api/event/TestFilesetEvent.java       | 43 +++++++++++++++
 docs/gravitino-server-config.md                    |  4 +-
 7 files changed, 243 insertions(+), 4 deletions(-)

diff --git 
a/core/src/main/java/org/apache/gravitino/listener/FilesetEventDispatcher.java 
b/core/src/main/java/org/apache/gravitino/listener/FilesetEventDispatcher.java
index f332f84c10..77bbe390ae 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/FilesetEventDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/FilesetEventDispatcher.java
@@ -45,6 +45,9 @@ import 
org.apache.gravitino.listener.api.event.DropFilesetPreEvent;
 import org.apache.gravitino.listener.api.event.GetFileLocationEvent;
 import org.apache.gravitino.listener.api.event.GetFileLocationFailureEvent;
 import org.apache.gravitino.listener.api.event.GetFileLocationPreEvent;
+import org.apache.gravitino.listener.api.event.ListFilesEvent;
+import org.apache.gravitino.listener.api.event.ListFilesFailureEvent;
+import org.apache.gravitino.listener.api.event.ListFilesPreEvent;
 import org.apache.gravitino.listener.api.event.ListFilesetEvent;
 import org.apache.gravitino.listener.api.event.ListFilesetFailureEvent;
 import org.apache.gravitino.listener.api.event.ListFilesetPreEvent;
@@ -86,8 +89,19 @@ public class FilesetEventDispatcher implements 
FilesetDispatcher {
   @Override
   public FileInfo[] listFiles(NameIdentifier ident, String locationName, 
String subPath)
       throws NoSuchFilesetException, IOException {
-    // TODO: implement the ListFilesEvent
-    return dispatcher.listFiles(ident, locationName, subPath);
+    eventBus.dispatchEvent(
+        new ListFilesPreEvent(PrincipalUtils.getCurrentUserName(), ident, 
locationName, subPath));
+    try {
+      FileInfo[] fileInfos = dispatcher.listFiles(ident, locationName, 
subPath);
+      eventBus.dispatchEvent(
+          new ListFilesEvent(PrincipalUtils.getCurrentUserName(), ident, 
locationName, subPath));
+      return fileInfos;
+    } catch (Exception e) {
+      eventBus.dispatchEvent(
+          new ListFilesFailureEvent(
+              PrincipalUtils.getCurrentUserName(), ident, locationName, 
subPath, e));
+      throw e;
+    }
   }
 
   @Override
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesEvent.java
new file mode 100644
index 0000000000..6ec8712a7a
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesEvent.java
@@ -0,0 +1,64 @@
+/*
+ * 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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/**
+ * Represents an event that is triggered upon the successful listing of files 
and directories under
+ * a filesets within a system.
+ */
+@DeveloperApi
+public final class ListFilesEvent extends FilesetEvent {
+  private final String subPath;
+  private final String locationName;
+
+  /**
+   * Constructs a new {@code ListFilesEvent}.
+   *
+   * @param user The user who initiated the listing of files/directories under 
the fileset.
+   * @param ident The identifier of the fileset.
+   * @param locationName The name of the location.
+   * @param subPath The subPath of the fileset
+   */
+  public ListFilesEvent(String user, NameIdentifier ident, String 
locationName, String subPath) {
+    super(user, ident);
+    this.locationName = locationName;
+    this.subPath = subPath;
+  }
+
+  public String locationName() {
+    return locationName;
+  }
+
+  public String subPath() {
+    return subPath;
+  }
+
+  /**
+   * Returns the type of operation.
+   *
+   * @return the operation type.
+   */
+  @Override
+  public OperationType operationType() {
+    return OperationType.LIST_FILESET_FILES;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesFailureEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesFailureEvent.java
new file mode 100644
index 0000000000..46b5ebfd8d
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesFailureEvent.java
@@ -0,0 +1,64 @@
+/*
+ * 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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+@DeveloperApi
+public class ListFilesFailureEvent extends FilesetFailureEvent {
+  private final String locationName;
+  private final String subPath;
+
+  /**
+   * Constructs a new {@code ListFilesFailureEvent}.
+   *
+   * @param user The user who initiated the listing of files/directories under 
the fileset.
+   * @param ident The identifier of the fileset.
+   * @param locationName The name of the location.
+   * @param subPath The subPath of the fileset.
+   * @param exception The exception encountered during the files listing 
attempt, which serves as an
+   *     indicator of the issues that caused the failure.
+   */
+  public ListFilesFailureEvent(
+      String user, NameIdentifier ident, String locationName, String subPath, 
Exception exception) {
+    super(user, ident, exception);
+    this.locationName = locationName;
+    this.subPath = subPath;
+  }
+
+  public String locationName() {
+    return locationName;
+  }
+
+  public String subPath() {
+    return subPath;
+  }
+
+  /**
+   * Returns the type of operation.
+   *
+   * @return the operation type.
+   */
+  @Override
+  public OperationType operationType() {
+    return OperationType.LIST_FILESET_FILES;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesPreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesPreEvent.java
new file mode 100644
index 0000000000..8a454fd9ca
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListFilesPreEvent.java
@@ -0,0 +1,53 @@
+/*
+ * 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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+@DeveloperApi
+public class ListFilesPreEvent extends FilesetPreEvent {
+  private final String locationName;
+  private final String subPath;
+
+  public ListFilesPreEvent(String user, NameIdentifier ident, String 
locationName, String subPath) {
+    super(user, ident);
+    this.locationName = locationName;
+    this.subPath = subPath;
+  }
+
+  public String locationName() {
+    return locationName;
+  }
+
+  public String subPath() {
+    return subPath;
+  }
+
+  /**
+   * Returns the type of operation.
+   *
+   * @return the operation type.
+   */
+  @Override
+  public OperationType operationType() {
+    return OperationType.LIST_FILESET_FILES;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/OperationType.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OperationType.java
index e5b443df51..6adc7b91f5 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/api/event/OperationType.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OperationType.java
@@ -57,6 +57,7 @@ public enum OperationType {
   ALTER_FILESET,
   CREATE_FILESET,
   LIST_FILESET,
+  LIST_FILESET_FILES,
   LOAD_FILESET,
   GET_FILESET_LOCATION,
 
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
index 1f0795652b..967758e99b 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestFilesetEvent.java
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Map;
 import org.apache.gravitino.NameIdentifier;
@@ -173,6 +174,29 @@ public class TestFilesetEvent {
     Assertions.assertEquals(OperationStatus.UNPROCESSED, 
preEvent.operationStatus());
   }
 
+  @Test
+  void testListFilesetFilesEvent() throws IOException {
+    NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
fileset.name());
+    String locationName = "default";
+    String subPath = "/";
+    dispatcher.listFiles(identifier, locationName, subPath);
+    Event event = dummyEventListener.popPostEvent();
+    Assertions.assertEquals(identifier, event.identifier());
+    Assertions.assertEquals(ListFilesEvent.class, event.getClass());
+    Assertions.assertEquals(locationName, ((ListFilesEvent) 
event).locationName());
+    Assertions.assertEquals(subPath, ((ListFilesEvent) event).subPath());
+    Assertions.assertEquals(OperationType.LIST_FILESET_FILES, 
event.operationType());
+    Assertions.assertEquals(OperationStatus.SUCCESS, event.operationStatus());
+
+    PreEvent preEvent = dummyEventListener.popPreEvent();
+    Assertions.assertEquals(ListFilesPreEvent.class, preEvent.getClass());
+    Assertions.assertEquals(identifier, preEvent.identifier());
+    Assertions.assertEquals(locationName, ((ListFilesPreEvent) 
preEvent).locationName());
+    Assertions.assertEquals(subPath, ((ListFilesPreEvent) preEvent).subPath());
+    Assertions.assertEquals(OperationType.LIST_FILESET_FILES, 
preEvent.operationType());
+    Assertions.assertEquals(OperationStatus.UNPROCESSED, 
preEvent.operationStatus());
+  }
+
   @Test
   void testGetFileLocationEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
fileset.name());
@@ -305,6 +329,25 @@ public class TestFilesetEvent {
     Assertions.assertEquals(OperationStatus.FAILURE, event.operationStatus());
   }
 
+  @Test
+  void testListFilesetFilesFailureEvent() {
+    NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"fileset");
+    String locationName = "default";
+    String subPath = "/";
+    Assertions.assertThrowsExactly(
+        GravitinoRuntimeException.class,
+        () -> failureDispatcher.listFiles(identifier, locationName, subPath));
+    Event event = dummyEventListener.popPostEvent();
+    Assertions.assertEquals(identifier, event.identifier());
+    Assertions.assertEquals(ListFilesFailureEvent.class, event.getClass());
+    Assertions.assertEquals(
+        GravitinoRuntimeException.class, ((ListFilesFailureEvent) 
event).exception().getClass());
+    Assertions.assertEquals(locationName, ((ListFilesFailureEvent) 
event).locationName());
+    Assertions.assertEquals(subPath, ((ListFilesFailureEvent) 
event).subPath());
+    Assertions.assertEquals(OperationType.LIST_FILESET_FILES, 
event.operationType());
+    Assertions.assertEquals(OperationStatus.FAILURE, event.operationStatus());
+  }
+
   @Test
   void testGetFileLocationFailureEvent() {
     NameIdentifier identifier = NameIdentifier.of("metalake", "catalog", 
"fileset");
diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index 26be0f4ff9..363f175bc1 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -121,7 +121,7 @@ Gravitino triggers a pre-event before the operation, a 
post-event after the comp
 | Operation type                      | Post-event                             
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
 
|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [...]
 | table operation                     | `CreateTableEvent`, `AlterTableEvent`, 
`DropTableEvent`, `LoadTableEvent`, `ListTableEvent`, `PurgeTableFailureEvent`, 
`CreateTableFailureEvent`, `AlterTableFailureEvent`, `DropTableFailureEvent`, 
`LoadTableFailureEvent`, `ListTableFailureEvent`, `PurgeTableFailureEvent`      
                                                                                
                                                                                
                [...]
-| fileset operation                   | `CreateFileSetEvent`, 
`AlterFileSetEvent`, `DropFileSetEvent`, `LoadFileSetEvent`, 
`ListFileSetEvent`, `CreateFileSetFailureEvent`, `AlterFileSetFailureEvent`, 
`DropFileSetFailureEvent`, `LoadFileSetFailureEvent`, `ListFileSetFailureEvent` 
                                                                                
                                                                                
                                                     [...]
+| fileset operation                   | `CreateFileSetEvent`, 
`AlterFileSetEvent`, `DropFileSetEvent`, `LoadFileSetEvent`, 
`ListFileSetEvent`, `CreateFileSetFailureEvent`, `AlterFileSetFailureEvent`, 
`DropFileSetFailureEvent`, `LoadFileSetFailureEvent`, 
`ListFileSetFailureEvent`, `ListFilesFailureEvent`                              
                                                                                
                                                                               
[...]
 | topic operation                     | `CreateTopicEvent`, `AlterTopicEvent`, 
`DropTopicEvent`, `LoadTopicEvent`, `ListTopicEvent`, 
`CreateTopicFailureEvent`, `AlterTopicFailureEvent`, `DropTopicFailureEvent`, 
`LoadTopicFailureEvent`, `ListTopicFailureEvent`                                
                                                                                
                                                                                
                                          [...]
 | schema operation                    | `CreateSchemaEvent`, 
`AlterSchemaEvent`, `DropSchemaEvent`, `LoadSchemaEvent`, `ListSchemaEvent`, 
`CreateSchemaFailureEvent`, `AlterSchemaFailureEvent`, 
`DropSchemaFailureEvent`, `LoadSchemaFailureEvent`, `ListSchemaFailureEvent`    
                                                                                
                                                                                
                                                            [...]
 | catalog operation                   | `CreateCatalogEvent`, 
`AlterCatalogEvent`, `DropCatalogEvent`, `LoadCatalogEvent`, 
`ListCatalogEvent`, `CreateCatalogFailureEvent`, `AlterCatalogFailureEvent`, 
`DropCatalogFailureEvent`, `LoadCatalogFailureEvent`, `ListCatalogFailureEvent` 
                                                                                
                                                                                
                                                     [...]
@@ -145,7 +145,7 @@ Gravitino triggers a pre-event before the operation, a 
post-event after the comp
 | Gravitino server catalog operation   | `CreateCatalogPreEvent`, 
`AlterCatalogPreEvent`, `DropCatalogPreEvent`, `LoadCatalogPreEvent`, 
`ListCatalogPreEvent`                                                           
                                                                                
                                                            | 0.8.0-incubating |
 | Gravitino server metalake operation  | `CreateMetalakePreEvent`, 
`AlterMetalakePreEvent`,`DropMetalakePreEvent`,`LoadMetalakePreEvent`,`ListMetalakePreEvent`
                                                                                
                                                                                
                                     | 0.8.0-incubating |
 | Gravitino server partition operation | `AddPartitionPreEvent`, 
`DropPartitionPreEvent`, `GetPartitionPreEvent`, 
`PurgePartitionPreEvent`,`ListPartitionPreEvent`,`ListPartitionNamesPreEvent`   
                                                                                
                                                                                
  | 0.8.0-incubating |
-| Gravitino server fileset operation   | `CreateFilesetPreEvent`, 
`AlterFilesetPreEvent`, `DropFilesetPreEvent`, 
`LoadFilesetPreEvent`,`ListFilesetPreEvent`,`GetFileLocationPreEvent`           
                                                                                
                                                                                
   | 0.8.0-incubating |
+| Gravitino server fileset operation   | `CreateFilesetPreEvent`, 
`AlterFilesetPreEvent`, `DropFilesetPreEvent`, 
`LoadFilesetPreEvent`,`ListFilesetPreEvent`,`GetFileLocationPreEvent`, 
`ListFilesPreEvent`                                                             
                                                                                
                                 | 0.8.0-incubating |
 | Gravitino server model operation     | `DeleteModelPreEvent`, 
`DeleteModelVersionPreEvent`, 
`RegisterAndLinkModelPreEvent`,`GetModelPreEvent`, 
`GetModelVersionPreEvent`,`LinkModelVersionPreEvent`,`ListModelPreEvent`,`RegisterModelPreEvent`,
 `AlterModelPreEvent`, `AlterModelVersionPreEvent`, `AlterModelVersionPreEvent` 
                                  | 0.9.0-incubating |
 | Gravitino server tag operation       | `ListTagsPreEvent`, 
`ListTagsInfoPreEvent`, `CreateTagPreEvent`, `GetTagPreEvent`, 
`AlterTagPreEvent`, `DeleteTagPreEvent`, `ListMetadataObjectsForTagPreEvent`, 
`ListTagsForMetadataObjectPreEvent`, `ListTagsInfoForMetadataObjectPreEvent`, 
`AssociateTagsForMetadataObjectPreEvent`, `GetTagForMetadataObjectPreEvent` | 
0.9.0-incubating |
 | Gravitino server user operation      | `AddUserPreEvent`, `GetUserPreEvent`, 
`ListUserNamesPreEvent`, `ListUsersPreEvent`, `RemoveUserPreEvent`, 
`GrantUserRolesPreEvent`, `RevokeUserRolesPreEvent`                             
                                                                                
                                                 | 0.9.0-incubating |

Reply via email to