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

yuqi4733 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 f1395433f2 [#7646] feat(core): Support event for setowner/getowner 
operation. (#7672)
f1395433f2 is described below

commit f1395433f228b45df465ddc7db71c48505a74816
Author: Mini Yu <[email protected]>
AuthorDate: Tue Jul 15 14:11:43 2025 +0800

    [#7646] feat(core): Support event for setowner/getowner operation. (#7672)
    
    ### What changes were proposed in this pull request?
    
    Support event for `setOwner` and `getOwner` operations.
    
    ### Why are the changes needed?
    
    To refine event and listener system.
    
    Fix: #7646
    
    ### Does this PR introduce _any_ user-facing change?
    
    N/A.
    
    ### How was this patch tested?
    
    UTs.
---
 .../java/org/apache/gravitino/GravitinoEnv.java    |  15 +-
 .../authorization/FutureGrantManager.java          |   8 +-
 .../gravitino/authorization/OwnerDispatcher.java   |  47 ++++
 .../gravitino/authorization/OwnerEventManager.java |  90 ++++++++
 .../gravitino/authorization/OwnerManager.java      |   7 +-
 .../hook/AccessControlHookDispatcher.java          |   8 +-
 .../gravitino/hook/CatalogHookDispatcher.java      |   8 +-
 .../gravitino/hook/FilesetHookDispatcher.java      |   4 +-
 .../gravitino/hook/MetalakeHookDispatcher.java     |   8 +-
 .../apache/gravitino/hook/ModelHookDispatcher.java |   6 +-
 .../gravitino/hook/SchemaHookDispatcher.java       |   4 +-
 .../apache/gravitino/hook/TableHookDispatcher.java |   4 +-
 .../apache/gravitino/hook/TopicHookDispatcher.java |   4 +-
 .../listener/api/event/GetOwnerEvent.java          |  43 ++++
 .../listener/api/event/GetOwnerFailureEvent.java   |  43 ++++
 .../listener/api/event/GetOwnerPreEvent.java       |  39 ++++
 .../listener/api/event/OperationType.java          |   4 +
 .../gravitino/listener/api/event/OwnerEvent.java   |  52 +++++
 .../listener/api/event/OwnerFailureEvent.java      |  51 +++++
 .../listener/api/event/OwnerPreEvent.java          |  47 ++++
 .../listener/api/event/SetOwnerEvent.java          |  42 ++++
 .../listener/api/event/SetOwnerFailureEvent.java   |  43 ++++
 .../listener/api/event/SetOwnerPreEvent.java       |  39 ++++
 .../gravitino/listener/api/info/OwnerInfo.java     |  61 +++++
 .../apache/gravitino/utils/MetadataObjectUtil.java |  14 ++
 .../gravitino/listener/DummyEventListener.java     |   5 +
 .../listener/api/event/TestOwnerEvent.java         | 247 +++++++++++++++++++++
 .../gravitino/utils/TestMetadataObjectUtil.java    |   2 +-
 docs/gravitino-server-config.md                    |   6 +-
 .../gravitino/server/web/rest/OwnerOperations.java |  10 +-
 .../server/web/rest/TestOwnerOperations.java       |   2 +-
 31 files changed, 919 insertions(+), 44 deletions(-)

diff --git a/core/src/main/java/org/apache/gravitino/GravitinoEnv.java 
b/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
index 91febb4220..e8b9f06ed3 100644
--- a/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
+++ b/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
@@ -23,6 +23,8 @@ import org.apache.gravitino.audit.AuditLogManager;
 import org.apache.gravitino.authorization.AccessControlDispatcher;
 import org.apache.gravitino.authorization.AccessControlManager;
 import org.apache.gravitino.authorization.FutureGrantManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
+import org.apache.gravitino.authorization.OwnerEventManager;
 import org.apache.gravitino.authorization.OwnerManager;
 import org.apache.gravitino.auxiliary.AuxiliaryServiceManager;
 import org.apache.gravitino.catalog.CatalogDispatcher;
@@ -132,7 +134,7 @@ public class GravitinoEnv {
   private AuditLogManager auditLogManager;
 
   private EventBus eventBus;
-  private OwnerManager ownerManager;
+  private OwnerDispatcher ownerDispatcher;
   private FutureGrantManager futureGrantManager;
 
   protected GravitinoEnv() {}
@@ -338,12 +340,12 @@ public class GravitinoEnv {
   }
 
   /**
-   * Get the OwnerManager associated with the Gravitino environment.
+   * Get the Owner dispatcher associated with the Gravitino environment.
    *
    * @return The OwnerManager instance.
    */
-  public OwnerManager ownerManager() {
-    return ownerManager;
+  public OwnerDispatcher ownerDispatcher() {
+    return ownerDispatcher;
   }
 
   /**
@@ -509,11 +511,12 @@ public class GravitinoEnv {
           new AccessControlHookDispatcher(accessControlManager);
       this.accessControlDispatcher =
           new AccessControlEventDispatcher(eventBus, 
accessControlHookDispatcher);
-      this.ownerManager = new OwnerManager(entityStore);
+      OwnerDispatcher ownerManager = new OwnerManager(entityStore);
+      this.ownerDispatcher = new OwnerEventManager(eventBus, ownerManager);
       this.futureGrantManager = new FutureGrantManager(entityStore, 
ownerManager);
     } else {
       this.accessControlDispatcher = null;
-      this.ownerManager = null;
+      this.ownerDispatcher = null;
       this.futureGrantManager = null;
     }
 
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/FutureGrantManager.java 
b/core/src/main/java/org/apache/gravitino/authorization/FutureGrantManager.java
index b838e19568..99fe336976 100644
--- 
a/core/src/main/java/org/apache/gravitino/authorization/FutureGrantManager.java
+++ 
b/core/src/main/java/org/apache/gravitino/authorization/FutureGrantManager.java
@@ -48,18 +48,18 @@ import org.apache.gravitino.meta.UserEntity;
  */
 public class FutureGrantManager {
   EntityStore entityStore;
-  OwnerManager ownerManager;
+  OwnerDispatcher ownerDispatcher;
 
-  public FutureGrantManager(EntityStore entityStore, OwnerManager 
ownerManager) {
+  public FutureGrantManager(EntityStore entityStore, OwnerDispatcher 
ownerDispatcher) {
     this.entityStore = entityStore;
-    this.ownerManager = ownerManager;
+    this.ownerDispatcher = ownerDispatcher;
   }
 
   public void grantNewlyCreatedCatalog(String metalake, BaseCatalog catalog) {
     try {
       MetadataObject metalakeObject =
           MetadataObjects.of(null, metalake, MetadataObject.Type.METALAKE);
-      Optional<Owner> ownerOptional = ownerManager.getOwner(metalake, 
metalakeObject);
+      Optional<Owner> ownerOptional = ownerDispatcher.getOwner(metalake, 
metalakeObject);
       ownerOptional.ifPresent(
           owner -> {
             AuthorizationPlugin authorizationPlugin = 
catalog.getAuthorizationPlugin();
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/OwnerDispatcher.java 
b/core/src/main/java/org/apache/gravitino/authorization/OwnerDispatcher.java
new file mode 100644
index 0000000000..b78c278783
--- /dev/null
+++ b/core/src/main/java/org/apache/gravitino/authorization/OwnerDispatcher.java
@@ -0,0 +1,47 @@
+/*
+ *  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.authorization;
+
+import java.util.Optional;
+import org.apache.gravitino.MetadataObject;
+
+/** Dispatcher interface for managing owners of metadata objects. */
+public interface OwnerDispatcher {
+
+  /**
+   * Sets the owner of a metadata object.
+   *
+   * @param metalake the name of the metalake
+   * @param metadataObject the metadata object for which the owner is being set
+   * @param ownerName the name of the owner
+   * @param ownerType the type of the owner (e.g., USER, GROUP)
+   */
+  void setOwner(
+      String metalake, MetadataObject metadataObject, String ownerName, 
Owner.Type ownerType);
+
+  /**
+   * Retrieves the owner of a metadata object.
+   *
+   * @param metalake the name of the metalake
+   * @param metadataObject the metadata object for which the owner is being 
retrieved
+   * @return an Optional containing the owner if it exists, otherwise an empty 
Optional
+   */
+  Optional<Owner> getOwner(String metalake, MetadataObject metadataObject);
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/OwnerEventManager.java 
b/core/src/main/java/org/apache/gravitino/authorization/OwnerEventManager.java
new file mode 100644
index 0000000000..71a1f611cc
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/authorization/OwnerEventManager.java
@@ -0,0 +1,90 @@
+/*
+ *  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.authorization;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.Optional;
+import lombok.Getter;
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.event.GetOwnerEvent;
+import org.apache.gravitino.listener.api.event.GetOwnerFailureEvent;
+import org.apache.gravitino.listener.api.event.GetOwnerPreEvent;
+import org.apache.gravitino.listener.api.event.SetOwnerEvent;
+import org.apache.gravitino.listener.api.event.SetOwnerFailureEvent;
+import org.apache.gravitino.listener.api.event.SetOwnerPreEvent;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+import org.apache.gravitino.utils.MetadataObjectUtil;
+import org.apache.gravitino.utils.PrincipalUtils;
+
+public class OwnerEventManager implements OwnerDispatcher {
+  private final EventBus eventBus;
+
+  @Getter private OwnerDispatcher ownerDispatcher;
+
+  public OwnerEventManager(EventBus eventBus, OwnerDispatcher ownerDispatcher) 
{
+    this.eventBus = eventBus;
+    this.ownerDispatcher = ownerDispatcher;
+  }
+
+  @VisibleForTesting
+  public void setOwnerManager(OwnerDispatcher ownerDispatcher) {
+    this.ownerDispatcher = ownerDispatcher;
+  }
+
+  @Override
+  public void setOwner(
+      String metalake, MetadataObject metadataObject, String ownerName, 
Owner.Type ownerType) {
+    NameIdentifier identifier = MetadataObjectUtil.toEntityIdent(metalake, 
metadataObject);
+    String user = PrincipalUtils.getCurrentUserName();
+    OwnerInfo ownerInfo = new OwnerInfo(ownerName, ownerType);
+    MetadataObject.Type type = metadataObject.type();
+    eventBus.dispatchEvent(new SetOwnerPreEvent(user, identifier, ownerInfo, 
type));
+    try {
+      ownerDispatcher.setOwner(metalake, metadataObject, ownerName, ownerType);
+      eventBus.dispatchEvent(new SetOwnerEvent(user, identifier, ownerInfo, 
type));
+    } catch (Exception e) {
+      eventBus.dispatchEvent(new SetOwnerFailureEvent(user, identifier, e, 
ownerInfo, type));
+      throw e;
+    }
+  }
+
+  @Override
+  public Optional<Owner> getOwner(String metalake, MetadataObject 
metadataObject) {
+    NameIdentifier identifier = MetadataObjectUtil.toEntityIdent(metalake, 
metadataObject);
+    String user = PrincipalUtils.getCurrentUserName();
+    OwnerInfo ownerInfo = null;
+    MetadataObject.Type type = metadataObject.type();
+    eventBus.dispatchEvent(new GetOwnerPreEvent(user, identifier, ownerInfo, 
type));
+    try {
+      Optional<Owner> owner = ownerDispatcher.getOwner(metalake, 
metadataObject);
+      if (owner.isPresent()) {
+        ownerInfo = new OwnerInfo(owner.get().name(), owner.get().type());
+      }
+
+      eventBus.dispatchEvent(new GetOwnerEvent(user, identifier, ownerInfo, 
type));
+      return owner;
+    } catch (Exception e) {
+      eventBus.dispatchEvent(new GetOwnerFailureEvent(user, identifier, e, 
ownerInfo, type));
+      throw e;
+    }
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/OwnerManager.java 
b/core/src/main/java/org/apache/gravitino/authorization/OwnerManager.java
index 2847bbabe3..d1fef81256 100644
--- a/core/src/main/java/org/apache/gravitino/authorization/OwnerManager.java
+++ b/core/src/main/java/org/apache/gravitino/authorization/OwnerManager.java
@@ -21,6 +21,7 @@ package org.apache.gravitino.authorization;
 import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
+import lombok.Getter;
 import org.apache.gravitino.Entity;
 import org.apache.gravitino.EntityStore;
 import org.apache.gravitino.MetadataObject;
@@ -42,9 +43,9 @@ import org.slf4j.LoggerFactory;
  * owner. Because the post hook will call the methods. We shouldn't add the 
lock of the metadata
  * object. Otherwise, it will cause deadlock.
  */
-public class OwnerManager {
+public class OwnerManager implements OwnerDispatcher {
   private static final Logger LOG = 
LoggerFactory.getLogger(OwnerManager.class);
-  private final EntityStore store;
+  @Getter private final EntityStore store;
 
   public OwnerManager(EntityStore store) {
     if (store instanceof SupportsRelationOperations) {
@@ -58,6 +59,7 @@ public class OwnerManager {
     }
   }
 
+  @Override
   public void setOwner(
       String metalake, MetadataObject metadataObject, String ownerName, 
Owner.Type ownerType) {
 
@@ -128,6 +130,7 @@ public class OwnerManager {
     }
   }
 
+  @Override
   public Optional<Owner> getOwner(String metalake, MetadataObject 
metadataObject) {
     NameIdentifier ident = MetadataObjectUtil.toEntityIdent(metalake, 
metadataObject);
     OwnerImpl owner = new OwnerImpl();
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java
index dba0177ca1..29ddc65c77 100644
--- 
a/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java
@@ -28,7 +28,7 @@ import 
org.apache.gravitino.authorization.AccessControlDispatcher;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Group;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.authorization.Privilege;
 import org.apache.gravitino.authorization.Role;
 import org.apache.gravitino.authorization.SecurableObject;
@@ -153,9 +153,9 @@ public class AccessControlHookDispatcher implements 
AccessControlDispatcher {
     Role createdRole = dispatcher.createRole(metalake, role, properties, 
securableObjects);
 
     // Set the creator as the owner of role.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
-    if (ownerManager != null) {
-      ownerManager.setOwner(
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    if (ownerDispatcher != null) {
+      ownerDispatcher.setOwner(
           metalake,
           NameIdentifierUtil.toMetadataObject(
               AuthorizationUtils.ofRole(metalake, role), 
Entity.EntityType.ROLE),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java
index ba28bbbbd4..1f325b7c5c 100644
--- a/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java
@@ -29,7 +29,7 @@ import org.apache.gravitino.Namespace;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.FutureGrantManager;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.CatalogDispatcher;
 import org.apache.gravitino.connector.BaseCatalog;
 import org.apache.gravitino.exceptions.CatalogAlreadyExistsException;
@@ -87,9 +87,9 @@ public class CatalogHookDispatcher implements 
CatalogDispatcher {
 
     try {
       // Set the creator as the owner of the catalog.
-      OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
-      if (ownerManager != null) {
-        ownerManager.setOwner(
+      OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+      if (ownerDispatcher != null) {
+        ownerDispatcher.setOwner(
             ident.namespace().level(0),
             NameIdentifierUtil.toMetadataObject(ident, 
Entity.EntityType.CATALOG),
             PrincipalUtils.getCurrentUserName(),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java
index d1653f2772..0efb8a1198 100644
--- a/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java
@@ -27,7 +27,7 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.FilesetDispatcher;
 import org.apache.gravitino.exceptions.FilesetAlreadyExistsException;
 import org.apache.gravitino.exceptions.NoSuchFilesetException;
@@ -84,7 +84,7 @@ public class FilesetHookDispatcher implements 
FilesetDispatcher {
             ident, comment, type, storageLocations, properties);
 
     // Set the creator as the owner of the fileset.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.namespace().level(0),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java
index aa53b8800f..407c8fe27b 100644
--- a/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java
@@ -27,7 +27,7 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.authorization.AccessControlDispatcher;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.exceptions.MetalakeAlreadyExistsException;
 import org.apache.gravitino.exceptions.MetalakeInUseException;
 import org.apache.gravitino.exceptions.NoSuchMetalakeException;
@@ -72,9 +72,9 @@ public class MetalakeHookDispatcher implements 
MetalakeDispatcher {
     }
 
     // Set the creator as owner of the metalake.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
-    if (ownerManager != null) {
-      ownerManager.setOwner(
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    if (ownerDispatcher != null) {
+      ownerDispatcher.setOwner(
           ident.name(),
           NameIdentifierUtil.toMetadataObject(ident, 
Entity.EntityType.METALAKE),
           PrincipalUtils.getCurrentUserName(),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java
index e1eef06c59..560caa7522 100644
--- a/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java
@@ -26,7 +26,7 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.ModelDispatcher;
 import org.apache.gravitino.exceptions.ModelAlreadyExistsException;
 import 
org.apache.gravitino.exceptions.ModelVersionAliasesAlreadyExistException;
@@ -73,7 +73,7 @@ public class ModelHookDispatcher implements ModelDispatcher {
     Model model = dispatcher.registerModel(ident, comment, properties);
 
     // Set the creator as owner of the model.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.namespace().level(0),
@@ -153,7 +153,7 @@ public class ModelHookDispatcher implements ModelDispatcher 
{
     Model model = dispatcher.registerModel(ident, uri, aliases, comment, 
properties);
 
     // Set the creator as owner of the model.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.name(),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java
index df0925db2a..191c1e5859 100644
--- a/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java
@@ -28,7 +28,7 @@ import org.apache.gravitino.Schema;
 import org.apache.gravitino.SchemaChange;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.SchemaDispatcher;
 import org.apache.gravitino.exceptions.NoSuchCatalogException;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
@@ -64,7 +64,7 @@ public class SchemaHookDispatcher implements SchemaDispatcher 
{
     Schema schema = dispatcher.createSchema(ident, comment, properties);
 
     // Set the creator as the owner of the schema.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.namespace().level(0),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/TableHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/TableHookDispatcher.java
index ea3299d3bb..3bb6a8da26 100644
--- a/core/src/main/java/org/apache/gravitino/hook/TableHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/TableHookDispatcher.java
@@ -26,7 +26,7 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.TableDispatcher;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
 import org.apache.gravitino.exceptions.NoSuchTableException;
@@ -83,7 +83,7 @@ public class TableHookDispatcher implements TableDispatcher {
             ident, columns, comment, properties, partitions, distribution, 
sortOrders, indexes);
 
     // Set the creator as the owner of the table.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.namespace().level(0),
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java
index 546eede8b9..dfd042b520 100644
--- a/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java
@@ -26,7 +26,7 @@ import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.authorization.AuthorizationUtils;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.catalog.TopicDispatcher;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
 import org.apache.gravitino.exceptions.NoSuchTopicException;
@@ -70,7 +70,7 @@ public class TopicHookDispatcher implements TopicDispatcher {
     Topic topic = dispatcher.createTopic(ident, comment, dataLayout, 
properties);
 
     // Set the creator as the owner of the topic.
-    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           ident.namespace().level(0),
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerEvent.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerEvent.java
new file mode 100644
index 0000000000..a0c03cb097
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerEvent.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/**
+ * GetOwnerEvent is an event that is triggered when the owner of a metadata 
object is retrieved
+ * successfully.
+ */
+@DeveloperApi
+public final class GetOwnerEvent extends OwnerEvent {
+
+  public GetOwnerEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.GET_OWNER;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerFailureEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerFailureEvent.java
new file mode 100644
index 0000000000..5d758da126
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerFailureEvent.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Event triggered when getting the owner of a metadata object fails. */
+@DeveloperApi
+public final class GetOwnerFailureEvent extends OwnerFailureEvent {
+  public GetOwnerFailureEvent(
+      String user,
+      NameIdentifier identifier,
+      Exception exception,
+      OwnerInfo ownerInfo,
+      MetadataObject.Type type) {
+    super(user, identifier, exception, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.GET_OWNER;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerPreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerPreEvent.java
new file mode 100644
index 0000000000..10bde20ad9
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/GetOwnerPreEvent.java
@@ -0,0 +1,39 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Event triggered before retrieving the owner information of a metadata 
object. */
+@DeveloperApi
+public final class GetOwnerPreEvent extends OwnerPreEvent {
+  public GetOwnerPreEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.GET_OWNER;
+  }
+}
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 f6162c77ef..d217abeb37 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
@@ -141,5 +141,9 @@ public enum OperationType {
   GRANT_PRIVILEGES,
   REVOKE_PRIVILEGES,
 
+  // Owner operations
+  GET_OWNER,
+  SET_OWNER,
+
   UNKNOWN,
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerEvent.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerEvent.java
new file mode 100644
index 0000000000..9394287f20
--- /dev/null
+++ b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerEvent.java
@@ -0,0 +1,52 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Base class for owner-related events in the Gravitino listener API. */
+@DeveloperApi
+public abstract class OwnerEvent extends Event {
+  private final OwnerInfo ownerInfo;
+  private final MetadataObject.Type type;
+
+  public OwnerEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier);
+    this.ownerInfo = ownerInfo;
+    this.type = type;
+  }
+
+  public OwnerInfo ownerInfo() {
+    return ownerInfo;
+  }
+
+  public MetadataObject.Type metadataObjectType() {
+    return type;
+  }
+
+  @Override
+  public OperationStatus operationStatus() {
+    return OperationStatus.SUCCESS;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerFailureEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerFailureEvent.java
new file mode 100644
index 0000000000..ff2fd2b149
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerFailureEvent.java
@@ -0,0 +1,51 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Base class for owner-related failure events in the listener API. */
+@DeveloperApi
+public abstract class OwnerFailureEvent extends FailureEvent {
+  private final OwnerInfo ownerInfo;
+  private final MetadataObject.Type type;
+
+  public OwnerFailureEvent(
+      String user,
+      NameIdentifier identifier,
+      Exception exception,
+      OwnerInfo ownerInfo,
+      MetadataObject.Type type) {
+    super(user, identifier, exception);
+    this.ownerInfo = ownerInfo;
+    this.type = type;
+  }
+
+  public OwnerInfo ownerInfo() {
+    return ownerInfo;
+  }
+
+  public MetadataObject.Type metadataObjectType() {
+    return type;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerPreEvent.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerPreEvent.java
new file mode 100644
index 0000000000..66b3c4a1d0
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/OwnerPreEvent.java
@@ -0,0 +1,47 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Base class for owner-related pre-events in the Gravitino listener API. */
+@DeveloperApi
+public abstract class OwnerPreEvent extends PreEvent {
+  private final OwnerInfo ownerInfo;
+  private final MetadataObject.Type type;
+
+  public OwnerPreEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier);
+    this.ownerInfo = ownerInfo;
+    this.type = type;
+  }
+
+  public OwnerInfo ownerInfo() {
+    return ownerInfo;
+  }
+
+  public MetadataObject.Type metadataObjectType() {
+    return type;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerEvent.java 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerEvent.java
new file mode 100644
index 0000000000..04d5bae07c
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerEvent.java
@@ -0,0 +1,42 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/**
+ * Represents an event that occurs when an owner is set for a metadata object. 
This event is
+ * triggered after the owner has been successfully set.
+ */
+@DeveloperApi
+public final class SetOwnerEvent extends OwnerEvent {
+  public SetOwnerEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.SET_OWNER;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerFailureEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerFailureEvent.java
new file mode 100644
index 0000000000..f89f160c25
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerFailureEvent.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Event triggered when setting an owner fails. */
+@DeveloperApi
+public final class SetOwnerFailureEvent extends OwnerFailureEvent {
+  public SetOwnerFailureEvent(
+      String user,
+      NameIdentifier identifier,
+      Exception exception,
+      OwnerInfo ownerInfo,
+      MetadataObject.Type type) {
+    super(user, identifier, exception, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.SET_OWNER;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerPreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerPreEvent.java
new file mode 100644
index 0000000000..a1c95639f8
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/SetOwnerPreEvent.java
@@ -0,0 +1,39 @@
+/*
+ *  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.MetadataObject;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+
+/** Event triggered before setting the owner of a metadata object. */
+@DeveloperApi
+public final class SetOwnerPreEvent extends OwnerPreEvent {
+  public SetOwnerPreEvent(
+      String user, NameIdentifier identifier, OwnerInfo ownerInfo, 
MetadataObject.Type type) {
+    super(user, identifier, ownerInfo, type);
+  }
+
+  @Override
+  public OperationType operationType() {
+    return OperationType.SET_OWNER;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/info/OwnerInfo.java 
b/core/src/main/java/org/apache/gravitino/listener/api/info/OwnerInfo.java
new file mode 100644
index 0000000000..f92f6bf3a3
--- /dev/null
+++ b/core/src/main/java/org/apache/gravitino/listener/api/info/OwnerInfo.java
@@ -0,0 +1,61 @@
+/*
+ *  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.info;
+
+import com.google.common.base.Objects;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.authorization.Owner;
+
+/** Owner information that used in owner operation events. */
+@DeveloperApi
+public class OwnerInfo {
+  private final String name;
+  private final Owner.Type type;
+
+  public OwnerInfo(String name, Owner.Type type) {
+    this.name = name;
+    this.type = type;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Owner.Type getType() {
+    return type;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OwnerInfo)) {
+      return false;
+    }
+    OwnerInfo ownerInfo = (OwnerInfo) o;
+    return Objects.equal(name, ownerInfo.name) && type == ownerInfo.type;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(name, type);
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java 
b/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java
index eb963182bf..d36591564e 100644
--- a/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java
+++ b/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java
@@ -72,6 +72,20 @@ public class MetadataObjectUtil {
                     "Unknown metadata object type: " + metadataObject.type()));
   }
 
+  /**
+   * Map the given {@link MetadataObject}'s type to the corresponding {@link 
Entity.EntityType}.
+   *
+   * @param type The metadata object type
+   * @return The entity type
+   * @throws IllegalArgumentException if the metadata object type is unknown
+   */
+  public static Entity.EntityType toEntityType(MetadataObject.Type type) {
+    Preconditions.checkArgument(type != null, "metadataObject type cannot be 
null");
+
+    return Optional.ofNullable(TYPE_TO_TYPE_MAP.get(type))
+        .orElseThrow(() -> new IllegalArgumentException("Unknown metadata 
object type: " + type));
+  }
+
   /**
    * Convert the given {@link MetadataObject} full name to the corresponding 
{@link NameIdentifier}.
    *
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 44ffa7dd67..9ae774b781 100644
--- a/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
+++ b/core/src/test/java/org/apache/gravitino/listener/DummyEventListener.java
@@ -53,6 +53,11 @@ public class DummyEventListener implements 
EventListenerPlugin {
     postEvents.add(event);
   }
 
+  public void clear() {
+    postEvents.clear();
+    preEvents.clear();
+  }
+
   @Override
   public SupportsChangingPreEvent transformPreEvent(
       SupportsChangingPreEvent supportsChangingPreEvent) {
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestOwnerEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestOwnerEvent.java
new file mode 100644
index 0000000000..231c08653c
--- /dev/null
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestOwnerEvent.java
@@ -0,0 +1,247 @@
+/*
+ *  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 static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+
+import java.util.Arrays;
+import java.util.List;
+import org.apache.gravitino.EntityStore;
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.MetadataObjects;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.SupportsRelationOperations;
+import org.apache.gravitino.authorization.Owner;
+import org.apache.gravitino.authorization.OwnerEventManager;
+import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.listener.DummyEventListener;
+import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.info.OwnerInfo;
+import org.apache.gravitino.storage.relational.RelationalBackend;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestInstance.Lifecycle;
+import org.mockito.Mockito;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
+
+@TestInstance(Lifecycle.PER_CLASS)
+public class TestOwnerEvent {
+  private OwnerEventManager ownerManager;
+  private OwnerManager innerOwnerManager;
+  private DummyEventListener dummyEventListener;
+
+  interface TestEntityStore extends EntityStore, RelationalBackend, 
SupportsRelationOperations {
+    // This interface is used to mock the EntityStore for testing purposes.
+  }
+
+  @BeforeAll
+  void init() {
+    TestEntityStore entityStore = Mockito.mock(TestEntityStore.class);
+    this.dummyEventListener = new DummyEventListener();
+    EventBus eventBus = new EventBus(Arrays.asList(dummyEventListener));
+    this.innerOwnerManager = new OwnerManager(entityStore);
+    this.ownerManager = new OwnerEventManager(eventBus, innerOwnerManager);
+  }
+
+  static class OwnerImpl implements Owner {
+    private final String name;
+    private final Type type;
+
+    OwnerImpl(String name, Type type) {
+      this.name = name;
+      this.type = type;
+    }
+
+    @Override
+    public String name() {
+      return name;
+    }
+
+    @Override
+    public Type type() {
+      return type;
+    }
+  }
+
+  @Test
+  void testSetOwner() {
+    String metalake = "test_metalake";
+    MetadataObject metadataObject =
+        MetadataObjects.of(
+            ImmutableList.of("test_catalog", "test_schema", "test_table"),
+            MetadataObject.Type.TABLE);
+    NameIdentifier identifier =
+        NameIdentifier.of(metalake, "test_catalog", "test_schema", 
"test_table");
+    String ownerName = "test_owner";
+    Owner.Type ownerType = Owner.Type.USER;
+
+    OwnerManager spyOwnerManger = Mockito.spy(innerOwnerManager);
+    doNothing().when(spyOwnerManger).setOwner(metalake, metadataObject, 
ownerName, ownerType);
+    ownerManager.setOwnerManager(spyOwnerManger);
+
+    try {
+      ownerManager.setOwner(metalake, metadataObject, ownerName, ownerType);
+      List<PreEvent> preEvents = dummyEventListener.getPreEvents();
+      List<Event> postEvents = dummyEventListener.getPostEvents();
+
+      Assertions.assertEquals(1, preEvents.size());
+      SetOwnerPreEvent setOwnerPreEvent = (SetOwnerPreEvent) preEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
setOwnerPreEvent.metadataObjectType());
+      Assertions.assertEquals(new OwnerInfo(ownerName, ownerType), 
setOwnerPreEvent.ownerInfo());
+      Assertions.assertEquals(identifier, setOwnerPreEvent.identifier());
+      Assertions.assertEquals(OperationStatus.UNPROCESSED, 
setOwnerPreEvent.operationStatus());
+      Assertions.assertEquals(OperationType.SET_OWNER, 
setOwnerPreEvent.operationType());
+
+      Assertions.assertEquals(1, postEvents.size());
+      SetOwnerEvent setOwnerEvent = (SetOwnerEvent) postEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
setOwnerEvent.metadataObjectType());
+      Assertions.assertEquals(new OwnerInfo(ownerName, ownerType), 
setOwnerEvent.ownerInfo());
+      Assertions.assertEquals(identifier, setOwnerEvent.identifier());
+      Assertions.assertEquals(OperationStatus.SUCCESS, 
setOwnerEvent.operationStatus());
+      Assertions.assertEquals(OperationType.SET_OWNER, 
setOwnerEvent.operationType());
+
+    } finally {
+      ownerManager.setOwnerManager(innerOwnerManager);
+      dummyEventListener.clear();
+    }
+
+    spyOwnerManger = Mockito.spy(innerOwnerManager);
+    doThrow(new RuntimeException("Test exception"))
+        .when(spyOwnerManger)
+        .setOwner(metalake, metadataObject, ownerName, ownerType);
+    ownerManager.setOwnerManager(spyOwnerManger);
+
+    try {
+      ownerManager.setOwner(metalake, metadataObject, ownerName, ownerType);
+      Assertions.fail("Expected RuntimeException to be thrown");
+    } catch (RuntimeException e) {
+      List<PreEvent> preEvents = dummyEventListener.getPreEvents();
+      List<Event> postEvents = dummyEventListener.getPostEvents();
+
+      Assertions.assertEquals(1, preEvents.size());
+      SetOwnerPreEvent setOwnerPreEvent = (SetOwnerPreEvent) preEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
setOwnerPreEvent.metadataObjectType());
+      Assertions.assertEquals(new OwnerInfo(ownerName, ownerType), 
setOwnerPreEvent.ownerInfo());
+      Assertions.assertEquals(identifier, setOwnerPreEvent.identifier());
+      Assertions.assertEquals(OperationStatus.UNPROCESSED, 
setOwnerPreEvent.operationStatus());
+      Assertions.assertEquals(OperationType.SET_OWNER, 
setOwnerPreEvent.operationType());
+
+      Assertions.assertEquals(1, postEvents.size());
+      Assertions.assertTrue(postEvents.get(0) instanceof SetOwnerFailureEvent);
+      SetOwnerFailureEvent setOwnerFailureEvent = (SetOwnerFailureEvent) 
postEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
setOwnerFailureEvent.metadataObjectType());
+      Assertions.assertEquals(
+          new OwnerInfo(ownerName, ownerType), 
setOwnerFailureEvent.ownerInfo());
+      Assertions.assertEquals(identifier, setOwnerFailureEvent.identifier());
+      Assertions.assertEquals(OperationStatus.FAILURE, 
setOwnerFailureEvent.operationStatus());
+      Assertions.assertEquals(OperationType.SET_OWNER, 
setOwnerFailureEvent.operationType());
+    } finally {
+      ownerManager.setOwnerManager(innerOwnerManager);
+      dummyEventListener.clear();
+    }
+  }
+
+  @Test
+  void testGetOwner() {
+    String metalake = "test_metalake";
+    MetadataObject metadataObject =
+        MetadataObjects.of(
+            ImmutableList.of("test_catalog", "test_schema", "test_table"),
+            MetadataObject.Type.TABLE);
+    NameIdentifier identifier =
+        NameIdentifier.of(metalake, "test_catalog", "test_schema", 
"test_table");
+    Owner expectedOwner = new OwnerImpl("test_owner", Owner.Type.USER);
+
+    OwnerManager spyOwnerManger = Mockito.spy(innerOwnerManager);
+    doReturn(java.util.Optional.of(expectedOwner))
+        .when(spyOwnerManger)
+        .getOwner(metalake, metadataObject);
+    ownerManager.setOwnerManager(spyOwnerManger);
+
+    try {
+      java.util.Optional<Owner> owner = ownerManager.getOwner(metalake, 
metadataObject);
+      Assertions.assertTrue(owner.isPresent());
+      Assertions.assertEquals(expectedOwner.name(), owner.get().name());
+      Assertions.assertEquals(expectedOwner.type(), owner.get().type());
+
+      List<PreEvent> preEvents = dummyEventListener.getPreEvents();
+      List<Event> postEvents = dummyEventListener.getPostEvents();
+
+      Assertions.assertEquals(1, preEvents.size());
+      GetOwnerPreEvent getOwnerPreEvent = (GetOwnerPreEvent) preEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
getOwnerPreEvent.metadataObjectType());
+      Assertions.assertNull(getOwnerPreEvent.ownerInfo());
+      Assertions.assertEquals(identifier, getOwnerPreEvent.identifier());
+      Assertions.assertEquals(OperationStatus.UNPROCESSED, 
getOwnerPreEvent.operationStatus());
+      Assertions.assertEquals(OperationType.GET_OWNER, 
getOwnerPreEvent.operationType());
+
+      Assertions.assertEquals(1, postEvents.size());
+      GetOwnerEvent getOwnerEvent = (GetOwnerEvent) postEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
getOwnerEvent.metadataObjectType());
+      Assertions.assertEquals(
+          new OwnerInfo(expectedOwner.name(), expectedOwner.type()), 
getOwnerEvent.ownerInfo());
+      Assertions.assertEquals(identifier, getOwnerEvent.identifier());
+      Assertions.assertEquals(OperationStatus.SUCCESS, 
getOwnerEvent.operationStatus());
+      Assertions.assertEquals(OperationType.GET_OWNER, 
getOwnerEvent.operationType());
+    } finally {
+      ownerManager.setOwnerManager(innerOwnerManager);
+      dummyEventListener.clear();
+    }
+
+    spyOwnerManger = Mockito.spy(innerOwnerManager);
+    doThrow(new RuntimeException("Test exception"))
+        .when(spyOwnerManger)
+        .getOwner(metalake, metadataObject);
+    ownerManager.setOwnerManager(spyOwnerManger);
+
+    try {
+      ownerManager.getOwner(metalake, metadataObject);
+      Assertions.fail("Expected RuntimeException to be thrown");
+    } catch (RuntimeException e) {
+      List<PreEvent> preEvents = dummyEventListener.getPreEvents();
+      List<Event> postEvents = dummyEventListener.getPostEvents();
+
+      Assertions.assertEquals(1, preEvents.size());
+      GetOwnerPreEvent getOwnerPreEvent = (GetOwnerPreEvent) preEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
getOwnerPreEvent.metadataObjectType());
+      Assertions.assertNull(getOwnerPreEvent.ownerInfo());
+      Assertions.assertEquals(identifier, getOwnerPreEvent.identifier());
+      Assertions.assertEquals(OperationStatus.UNPROCESSED, 
getOwnerPreEvent.operationStatus());
+      Assertions.assertEquals(OperationType.GET_OWNER, 
getOwnerPreEvent.operationType());
+
+      Assertions.assertEquals(1, postEvents.size());
+      Assertions.assertTrue(postEvents.get(0) instanceof GetOwnerFailureEvent);
+      GetOwnerFailureEvent getOwnerFailureEvent = (GetOwnerFailureEvent) 
postEvents.get(0);
+      Assertions.assertEquals(MetadataObject.Type.TABLE, 
getOwnerFailureEvent.metadataObjectType());
+      Assertions.assertNull(getOwnerFailureEvent.ownerInfo());
+      Assertions.assertEquals(identifier, getOwnerFailureEvent.identifier());
+      Assertions.assertEquals(OperationStatus.FAILURE, 
getOwnerFailureEvent.operationStatus());
+      Assertions.assertEquals(OperationType.GET_OWNER, 
getOwnerFailureEvent.operationType());
+
+    } finally {
+      ownerManager.setOwnerManager(innerOwnerManager);
+      dummyEventListener.clear();
+    }
+  }
+}
diff --git 
a/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java 
b/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java
index 9911ddbfa8..9e3ca43161 100644
--- a/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java
+++ b/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java
@@ -31,7 +31,7 @@ public class TestMetadataObjectUtil {
   public void testToEntityType() {
     Assertions.assertThrows(
         IllegalArgumentException.class,
-        () -> MetadataObjectUtil.toEntityType(null),
+        () -> MetadataObjectUtil.toEntityType((MetadataObject) null),
         "metadataObject cannot be null");
 
     Assertions.assertEquals(
diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index e5599f6685..3d2a90bd6b 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -171,7 +171,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`, `ListFilesFailureEvent`                              
                                                                                
                                                                               
[...]
+| 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` 
                                                                                
                                                                                
                                                     [...]
@@ -182,6 +182,7 @@ Gravitino triggers a pre-event before the operation, a 
post-event after the comp
 | user operation                      | `AddUserEvent`, `GetUserEvent`, 
`ListUserNamesEvent`, `ListUsersEvent`, `RemoveUserEvent`, 
`GrantUserRolesEvent`, `RevokeUserRolesEvent`, `AddUserFailureEvent`, 
`GetUserFailureEvent`, `GrantUserRolesFailureEvent`, 
`ListUserNamesFailureEvent`, `ListUsersFailureEvent`, `RemoveUserFailureEvent`, 
`RevokeUserRolesFailureEvent`                                                   
                                                                               
[...]
 | group operation                     | `AddGroupEvent`, `GetGroupEvent`, 
`ListGroupNamesEvent`, `ListGroupsEvent`, `RemoveGroupEvent`, 
`GrantGroupRolesEvent`, `RevokeGroupRolesEvent`, `AddGroupFailureEvent`, 
`GetGroupFailureEvent`, `GrantGroupRolesFailureEvent`, 
`ListGroupNamesFailureEvent`, `ListGroupsFailureEvent`, 
`RemoveGroupFailureEvent`, `RevokeGroupRolesFailureEvent`                       
                                                                                
             [...]
 | role operation                      | `CreateRoleEvent`, `DeleteRoleEvent`, 
`GetRoleEvent`, `GrantPrivilegesEvent`, `ListRoleNamesEvent`, 
`RevokePrivilegesEvent`, `CreateRoleFailureEvent`, `DeleteRoleFailureEvent`, 
`GetRoleFailureEvent`, `GrantPrivilegesFailureEvent`, 
`ListRoleNamesFailureEvent`, `RevokePrivilegesFailureEvent`                     
                                                                                
                                                              [...]
+| owner operation                     | `SetOwnerEvent`, `GetOwnerEvent`       
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
 
 
 
@@ -195,12 +196,13 @@ 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`, 
`ListFilesPreEvent`                                                             
                                                                                
                                 | 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 |
 | Gravitino server group operation     | `AddGroupPreEvent`, 
`GetGroupPreEvent`, `ListGroupNamesPreEvent`, `ListGroupsPreEvent`, 
`RemoveGroupPreEvent`, `GrantGroupRolesPreEvent`, `RevokeGroupRolesPreEvent`    
                                                                                
                                                                   | 
0.9.0-incubating |
 | Gravitino server role operation      | `CreateRolePreEvent`, 
`DeleteRolePreEvent`, `GetRolePreEvent`, `GrantPrivilegesPreEvent`, 
`ListRoleNamesPreEvent`, `RevokePrivilegesPreEvent`                             
                                                                                
                                                                 | 
0.9.0-incubating |
+ | Gravitino server owner operation    | `SetOwnerPreEvent`, 
`GetOwnerPreEvent`                                                              
                                                                                
                                                                                
                                                       | 1.0.0            |
 
 #### Event listener plugin
 
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
 
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
index 001770f6a5..89d0d93a36 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
@@ -34,7 +34,7 @@ import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.MetadataObjects;
 import org.apache.gravitino.authorization.Owner;
-import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.authorization.OwnerDispatcher;
 import org.apache.gravitino.dto.requests.OwnerSetRequest;
 import org.apache.gravitino.dto.responses.OwnerResponse;
 import org.apache.gravitino.dto.responses.SetResponse;
@@ -48,7 +48,7 @@ import org.apache.gravitino.utils.MetadataObjectUtil;
 @Path("/metalakes/{metalake}/owners")
 public class OwnerOperations {
 
-  private final OwnerManager ownerManager;
+  private final OwnerDispatcher ownerDispatcher;
 
   @Context private HttpServletRequest httpRequest;
 
@@ -56,7 +56,7 @@ public class OwnerOperations {
     // Because ownerManager may be null when Gravitino doesn't enable 
authorization,
     // and Jersey injection doesn't support null value. So OwnerOperations 
chooses to retrieve
     // ownerManager from GravitinoEnv instead of injection here.
-    this.ownerManager = GravitinoEnv.getInstance().ownerManager();
+    this.ownerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
   }
 
   @GET
@@ -76,7 +76,7 @@ public class OwnerOperations {
           httpRequest,
           () -> {
             MetadataObjectUtil.checkMetadataObject(metalake, object);
-            Optional<Owner> owner = ownerManager.getOwner(metalake, object);
+            Optional<Owner> owner = ownerDispatcher.getOwner(metalake, object);
             if (owner.isPresent()) {
               return Utils.ok(new 
OwnerResponse(DTOConverters.toDTO(owner.get())));
             } else {
@@ -109,7 +109,7 @@ public class OwnerOperations {
           () -> {
             request.validate();
             MetadataObjectUtil.checkMetadataObject(metalake, object);
-            ownerManager.setOwner(metalake, object, request.getName(), 
request.getType());
+            ownerDispatcher.setOwner(metalake, object, request.getName(), 
request.getType());
             return Utils.ok(new SetResponse(true));
           });
     } catch (Exception e) {
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
index dc7451a538..28ab031468 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
@@ -86,7 +86,7 @@ class TestOwnerOperations extends JerseyTest {
     Mockito.doReturn(1000L).when(config).get(TREE_LOCK_MIN_NODE_IN_MEMORY);
     Mockito.doReturn(36000L).when(config).get(TREE_LOCK_CLEAN_INTERVAL);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerManager", manager, 
true);
+    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
manager, true);
     FieldUtils.writeField(
         GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
     FieldUtils.writeField(

Reply via email to