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

jerryshao 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 b2067cd034 [#12892] fix(audit): Suppress internal operation audit 
events (#12893)
b2067cd034 is described below

commit b2067cd034035a3302f645c2147f448f53d72418
Author: roryqi <[email protected]>
AuthorDate: Fri Sep 4 14:15:30 2026 +0800

    [#12892] fix(audit): Suppress internal operation audit events (#12893)
    
    ### What changes were proposed in this pull request?
    
    - Use internal owner and access-control dispatchers for automatic
    ownership and metalake creator setup.
    - Add internal metalake, model, function, tag, policy, and job
    dispatchers.
    - Route metadata-object validation through internal dispatchers for
    every supported object type.
    - Use the internal schema dispatcher for dependent table and view schema
    loading.
    - Use internal dispatchers for authorization preloads, existence probes,
    service-admin checks, and user/group deletion owner checks.
    - Keep explicit REST operations and other user-facing entry points on
    public event dispatchers.
    
    ### Why are the changes needed?
    
    Internal helper operations currently pass through public event
    dispatchers and generate audit entries that do not represent independent
    user actions. Examples include `SET_OWNER` after `CREATE_CATALOG`,
    `LOAD_SCHEMA` during table/view operations, and `GET_ROLE`, `GET_TAG`,
    `GET_POLICY`, or `GET_JOB` during metadata-object validation.
    
    Routing these nested operations through internal dispatchers preserves
    normalization, validation, ownership, and authorization behavior while
    avoiding misleading audit events.
    
    Fix: #12892
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes. Nested infrastructure operations no longer produce separate audit
    log entries. Explicit user-facing operations continue to be audited
    normally.
    
    ### How was this patch tested?
    
    - Added a regression test covering internal metadata validation for
    every supported metadata-object type.
    - Added focused tests for internal table existence probes, authorization
    cache preloading, and service-admin checks.
    - Updated hook, table/view/partition, authorization, owner, role, user,
    group, and bulk operation tests for internal dispatcher routing.
    - Ran focused `core`, `server-common`, and `server` test suites.
    - Ran Spotless for all affected modules.
---
 .../java/org/apache/gravitino/GravitinoEnv.java    |  91 ++++++++++++++-
 .../authorization/AuthorizationUtils.java          |   6 +-
 .../catalog/TableOperationDispatcher.java          |   2 +-
 .../gravitino/catalog/ViewOperationDispatcher.java |   2 +-
 .../hook/AccessControlHookDispatcher.java          |   2 +-
 .../gravitino/hook/CatalogHookDispatcher.java      |   2 +-
 .../gravitino/hook/FilesetHookDispatcher.java      |   2 +-
 .../apache/gravitino/hook/JobHookDispatcher.java   |   4 +-
 .../gravitino/hook/MetalakeHookDispatcher.java     |   4 +-
 .../apache/gravitino/hook/ModelHookDispatcher.java |   4 +-
 .../gravitino/hook/PolicyHookDispatcher.java       |   2 +-
 .../gravitino/hook/SchemaHookDispatcher.java       |   2 +-
 .../apache/gravitino/hook/TagHookDispatcher.java   |   2 +-
 .../apache/gravitino/hook/TopicHookDispatcher.java |   2 +-
 .../apache/gravitino/utils/MetadataObjectUtil.java |  32 +++---
 .../authorization/TestAuthorizationUtils.java      |  18 ++-
 .../catalog/TestPartitionOperationDispatcher.java  |   2 +-
 .../hook/TestAccessControlHookDispatcher.java      |   7 +-
 .../gravitino/hook/TestCatalogHookDispatcher.java  |  14 ++-
 .../gravitino/hook/TestFilesetHookDispatcher.java  |  14 ++-
 .../gravitino/hook/TestJobHookDispatcher.java      |   7 +-
 .../gravitino/hook/TestMetalakeHookDispatcher.java |  19 +++-
 .../gravitino/hook/TestModelHookDispatcher.java    |   7 +-
 .../gravitino/hook/TestPolicyHookDispatcher.java   |   7 +-
 .../gravitino/hook/TestSchemaHookDispatcher.java   |   7 +-
 .../gravitino/hook/TestTagHookDispatcher.java      |   7 +-
 .../gravitino/hook/TestTopicHookDispatcher.java    |  14 ++-
 .../apache/gravitino/policy/TestPolicyManager.java |  16 ++-
 .../org/apache/gravitino/tag/TestTagManager.java   |  16 ++-
 .../gravitino/utils/TestMetadataObjectUtil.java    | 125 +++++++++++++++++++++
 .../server/authorization/MetadataAuthzHelper.java  |   4 +-
 .../authorization/jcasbin/JcasbinAuthorizer.java   |   2 +-
 .../authorization/TestMetadataAuthzHelper.java     |  33 +++++-
 .../jcasbin/TestJcasbinAuthorizer.java             |  12 ++
 .../LoadTableAuthorizationExecutor.java            |   2 +-
 .../gravitino/server/web/rest/BulkOperations.java  |   2 +-
 .../gravitino/server/web/rest/GroupOperations.java |   2 +-
 .../gravitino/server/web/rest/UserOperations.java  |   2 +-
 .../filter/TestGravitinoInterceptionService.java   |   4 +-
 .../TestLoadTableAuthorizationExecutor.java        |  56 +++++++++
 .../server/web/rest/TestBulkOperations.java        |   3 +-
 .../server/web/rest/TestGroupOperations.java       |   3 +-
 .../server/web/rest/TestOwnerOperations.java       |   7 +-
 .../server/web/rest/TestPermissionOperations.java  |   5 +-
 .../server/web/rest/TestRoleOperations.java        |  19 +++-
 .../server/web/rest/TestStatisticOperations.java   |   3 +-
 .../server/web/rest/TestUserOperations.java        |   3 +-
 47 files changed, 481 insertions(+), 120 deletions(-)

diff --git a/core/src/main/java/org/apache/gravitino/GravitinoEnv.java 
b/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
index 142b9e55e2..1734e32fd3 100644
--- a/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
+++ b/core/src/main/java/org/apache/gravitino/GravitinoEnv.java
@@ -153,8 +153,10 @@ public class GravitinoEnv {
   private TopicDispatcher internalTopicDispatcher;
 
   private ModelDispatcher modelDispatcher;
+  private ModelDispatcher internalModelDispatcher;
 
   private FunctionDispatcher functionDispatcher;
+  private FunctionDispatcher internalFunctionDispatcher;
 
   private SemanticModelDispatcher semanticModelDispatcher;
 
@@ -162,6 +164,7 @@ public class GravitinoEnv {
   private ViewDispatcher internalViewDispatcher;
 
   private MetalakeDispatcher metalakeDispatcher;
+  private MetalakeDispatcher internalMetalakeDispatcher;
 
   private CredentialOperationDispatcher credentialOperationDispatcher;
 
@@ -172,8 +175,10 @@ public class GravitinoEnv {
   private SecretManager secretManager;
 
   private TagDispatcher tagDispatcher;
+  private TagDispatcher internalTagDispatcher;
 
   private PolicyDispatcher policyDispatcher;
+  private PolicyDispatcher internalPolicyDispatcher;
 
   private AccessControlDispatcher accessControlDispatcher;
   private AccessControlDispatcher internalAccessControlDispatcher;
@@ -191,6 +196,7 @@ public class GravitinoEnv {
   private AuditLogManager auditLogManager;
 
   private JobOperationDispatcher jobOperationDispatcher;
+  private JobOperationDispatcher internalJobOperationDispatcher;
 
   private EventBus eventBus;
   private OwnerDispatcher ownerDispatcher;
@@ -347,6 +353,17 @@ public class GravitinoEnv {
     return modelDispatcher;
   }
 
+  /**
+   * Get the internal ModelDispatcher associated with the Gravitino 
environment.
+   *
+   * <p>The internal dispatcher preserves normalization but skips hooks and 
event emission.
+   *
+   * @return The internal ModelDispatcher instance.
+   */
+  public ModelDispatcher internalModelDispatcher() {
+    return internalModelDispatcher;
+  }
+
   /**
    * Get the FunctionDispatcher associated with the Gravitino environment.
    *
@@ -356,6 +373,17 @@ public class GravitinoEnv {
     return functionDispatcher;
   }
 
+  /**
+   * Get the internal FunctionDispatcher associated with the Gravitino 
environment.
+   *
+   * <p>The internal dispatcher preserves normalization but skips hooks and 
event emission.
+   *
+   * @return The internal FunctionDispatcher instance.
+   */
+  public FunctionDispatcher internalFunctionDispatcher() {
+    return internalFunctionDispatcher;
+  }
+
   /**
    * Get the Semantic Model dispatcher associated with the Gravitino 
environment.
    *
@@ -445,6 +473,17 @@ public class GravitinoEnv {
     return metalakeDispatcher;
   }
 
+  /**
+   * Get the internal MetalakeDispatcher associated with the Gravitino 
environment.
+   *
+   * <p>The internal dispatcher preserves normalization but skips hooks and 
event emission.
+   *
+   * @return The internal MetalakeDispatcher instance.
+   */
+  public MetalakeDispatcher internalMetalakeDispatcher() {
+    return internalMetalakeDispatcher;
+  }
+
   /**
    * Get the {@link CredentialOperationDispatcher} associated with the 
Gravitino environment.
    *
@@ -582,6 +621,17 @@ public class GravitinoEnv {
     return tagDispatcher;
   }
 
+  /**
+   * Get the internal TagDispatcher associated with the Gravitino environment.
+   *
+   * <p>The internal dispatcher skips hooks and event emission.
+   *
+   * @return The internal TagDispatcher instance.
+   */
+  public TagDispatcher internalTagDispatcher() {
+    return internalTagDispatcher;
+  }
+
   /**
    * Get the PolicyDispatcher associated with the Gravitino environment.
    *
@@ -591,6 +641,17 @@ public class GravitinoEnv {
     return policyDispatcher;
   }
 
+  /**
+   * Get the internal PolicyDispatcher associated with the Gravitino 
environment.
+   *
+   * <p>The internal dispatcher skips hooks and event emission.
+   *
+   * @return The internal PolicyDispatcher instance.
+   */
+  public PolicyDispatcher internalPolicyDispatcher() {
+    return internalPolicyDispatcher;
+  }
+
   /**
    * Get the Owner dispatcher associated with the Gravitino environment.
    *
@@ -658,6 +719,19 @@ public class GravitinoEnv {
     return jobOperationDispatcher;
   }
 
+  /**
+   * Get the internal JobOperationDispatcher associated with the Gravitino 
environment.
+   *
+   * <p>The internal dispatcher preserves validation but skips hooks and event 
emission.
+   *
+   * @return The internal JobOperationDispatcher instance.
+   */
+  public JobOperationDispatcher internalJobOperationDispatcher() {
+    Preconditions.checkArgument(
+        internalJobOperationDispatcher != null, "GravitinoEnv is not 
initialized.");
+    return internalJobOperationDispatcher;
+  }
+
   public StatisticDispatcher statisticDispatcher() {
     return statisticDispatcher;
   }
@@ -779,6 +853,7 @@ public class GravitinoEnv {
     this.metalakeManager = new MetalakeManager(entityStore, idGenerator, 
catalogManager);
     MetalakeNormalizeDispatcher metalakeNormalizeDispatcher =
         new MetalakeNormalizeDispatcher(metalakeManager);
+    this.internalMetalakeDispatcher = metalakeNormalizeDispatcher;
     MetalakeEventDispatcher metalakeEventDispatcher =
         new MetalakeEventDispatcher(eventBus, metalakeNormalizeDispatcher);
     this.metalakeDispatcher = new 
MetalakeHookDispatcher(metalakeEventDispatcher);
@@ -836,7 +911,8 @@ public class GravitinoEnv {
     TableEventDispatcher tableEventDispatcher =
         new TableEventDispatcher(eventBus, tableNormalizeDispatcher);
     this.tableDispatcher =
-        new TableHookDispatcher(tableEventDispatcher, this::ownerDispatcher, 
catalogManager);
+        new TableHookDispatcher(
+            tableEventDispatcher, this::internalOwnerDispatcher, 
catalogManager);
 
     // TODO: We can install hooks when we need, we only supports ownership 
post hook,
     //  partition doesn't have ownership, so we don't need it now.
@@ -859,6 +935,7 @@ public class GravitinoEnv {
         new ModelOperationDispatcher(catalogManager, entityStore, idGenerator, 
secretManager);
     ModelNormalizeDispatcher modelNormalizeDispatcher =
         new ModelNormalizeDispatcher(modelOperationDispatcher, catalogManager);
+    this.internalModelDispatcher = modelNormalizeDispatcher;
     ModelEventDispatcher modelEventDispatcher =
         new ModelEventDispatcher(eventBus, modelNormalizeDispatcher);
     this.modelDispatcher = new ModelHookDispatcher(modelEventDispatcher);
@@ -871,10 +948,12 @@ public class GravitinoEnv {
             catalogManager, schemaOperationDispatcher, entityStore, 
idGenerator, secretManager);
     FunctionNormalizeDispatcher functionNormalizeDispatcher =
         new FunctionNormalizeDispatcher(functionOperationDispatcher, 
catalogManager);
+    this.internalFunctionDispatcher = functionNormalizeDispatcher;
     FunctionEventDispatcher functionEventDispatcher =
         new FunctionEventDispatcher(eventBus, functionNormalizeDispatcher);
     this.functionDispatcher =
-        new FunctionHookDispatcher(functionEventDispatcher, 
this::ownerDispatcher, catalogManager);
+        new FunctionHookDispatcher(
+            functionEventDispatcher, this::internalOwnerDispatcher, 
catalogManager);
 
     // View operation chain: ViewHookDispatcher -> ViewEventDispatcher -> 
ViewNormalizeDispatcher
     // -> ViewOperationDispatcher.
@@ -895,7 +974,7 @@ public class GravitinoEnv {
     ViewEventDispatcher viewEventDispatcher =
         new ViewEventDispatcher(eventBus, viewNormalizeDispatcher);
     this.viewDispatcher =
-        new ViewHookDispatcher(viewEventDispatcher, this::ownerDispatcher, 
catalogManager);
+        new ViewHookDispatcher(viewEventDispatcher, 
this::internalOwnerDispatcher, catalogManager);
 
     // Semantic Model operation chain: SemanticModelNormalizeDispatcher ->
     // SemanticModelOperationDispatcher -> ManagedSemanticModelOperations.
@@ -939,16 +1018,20 @@ public class GravitinoEnv {
 
     // Create and initialize Tag related modules
     TagManager tagManager = new TagManager(idGenerator, entityStore);
+    this.internalTagDispatcher = tagManager;
     TagEventDispatcher tagEventDispatcher = new TagEventDispatcher(eventBus, 
tagManager);
     this.tagDispatcher = new TagHookDispatcher(tagEventDispatcher);
 
+    PolicyManager policyManager = new PolicyManager(idGenerator, entityStore);
+    this.internalPolicyDispatcher = policyManager;
     PolicyEventDispatcher policyEventDispatcher =
-        new PolicyEventDispatcher(eventBus, new PolicyManager(idGenerator, 
entityStore));
+        new PolicyEventDispatcher(eventBus, policyManager);
     this.policyDispatcher = new PolicyHookDispatcher(policyEventDispatcher);
 
     JobManager jobManager = new JobManager(config, entityStore, idGenerator);
     JobTemplateValidationDispatcher validationDispatcher =
         new JobTemplateValidationDispatcher(jobManager);
+    this.internalJobOperationDispatcher = validationDispatcher;
     JobEventDispatcher jobEventDispatcher = new JobEventDispatcher(eventBus, 
validationDispatcher);
     this.jobOperationDispatcher = new JobHookDispatcher(jobEventDispatcher);
 
diff --git 
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java 
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
index 362a2835d3..34bfd3fe76 100644
--- 
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
+++ 
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
@@ -330,7 +330,7 @@ public class AuthorizationUtils {
       NameIdentifier ident, Entity.EntityType type, List<String> locations) {
     // If we enable authorization, we should remove the privileges about the 
entity in the
     // authorization plugin.
-    if (GravitinoEnv.getInstance().accessControlDispatcher() != null) {
+    if (GravitinoEnv.getInstance().internalAccessControlDispatcher() != null) {
       notifyEntityNameIdMappingChange(ident, type);
       MetadataObject metadataObject = 
NameIdentifierUtil.toMetadataObject(ident, type);
       String metalake =
@@ -369,7 +369,7 @@ public class AuthorizationUtils {
       NameIdentifier ident, Entity.EntityType type, String newName, 
List<String> locations) {
     // If we enable authorization, we should rename the privileges about the 
entity in the
     // authorization plugin.
-    if (GravitinoEnv.getInstance().accessControlDispatcher() != null) {
+    if (GravitinoEnv.getInstance().internalAccessControlDispatcher() != null) {
       notifyEntityNameIdMappingChange(ident, type);
       MetadataObject oldMetadataObject = 
NameIdentifierUtil.toMetadataObject(ident, type);
       MetadataObject newMetadataObject =
@@ -537,7 +537,7 @@ public class AuthorizationUtils {
     List<String> locations = new ArrayList<>();
 
     // If we don't enable authorization, the location should return empty 
collection.
-    if (GravitinoEnv.getInstance().accessControlDispatcher() == null) {
+    if (GravitinoEnv.getInstance().internalAccessControlDispatcher() == null) {
       return locations;
     }
 
diff --git 
a/core/src/main/java/org/apache/gravitino/catalog/TableOperationDispatcher.java 
b/core/src/main/java/org/apache/gravitino/catalog/TableOperationDispatcher.java
index 1bd3b93345..bbc28e86ba 100644
--- 
a/core/src/main/java/org/apache/gravitino/catalog/TableOperationDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/catalog/TableOperationDispatcher.java
@@ -97,7 +97,7 @@ public class TableOperationDispatcher extends 
OperationDispatcher implements Tab
         catalogManager,
         store,
         idGenerator,
-        () -> GravitinoEnv.getInstance().schemaDispatcher(),
+        () -> GravitinoEnv.getInstance().internalSchemaDispatcher(),
         secretManager);
   }
 
diff --git 
a/core/src/main/java/org/apache/gravitino/catalog/ViewOperationDispatcher.java 
b/core/src/main/java/org/apache/gravitino/catalog/ViewOperationDispatcher.java
index 5e00e01313..280b68b3c6 100644
--- 
a/core/src/main/java/org/apache/gravitino/catalog/ViewOperationDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/catalog/ViewOperationDispatcher.java
@@ -83,7 +83,7 @@ public class ViewOperationDispatcher extends 
OperationDispatcher implements View
         catalogManager,
         store,
         idGenerator,
-        () -> GravitinoEnv.getInstance().schemaDispatcher(),
+        () -> GravitinoEnv.getInstance().internalSchemaDispatcher(),
         secretManager);
   }
 
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 6958dd1a98..b5afbcd6c7 100644
--- 
a/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/hook/AccessControlHookDispatcher.java
@@ -216,7 +216,7 @@ public class AccessControlHookDispatcher implements 
AccessControlDispatcher {
     Role createdRole = dispatcher.createRole(metalake, role, properties, 
securableObjects);
 
     // Set the creator as the owner of role.
-    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerDispatcher != null) {
       ownerDispatcher.setOwner(
           metalake,
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 5b518e56e7..3879e5450e 100644
--- a/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/CatalogHookDispatcher.java
@@ -102,7 +102,7 @@ public class CatalogHookDispatcher implements 
CatalogDispatcher {
 
     try {
       // Set the creator as the owner of the catalog.
-      OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+      OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
       if (ownerDispatcher != null) {
         ownerDispatcher.setOwner(
             ident.namespace().level(0),
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 037fdec8f7..89557837b8 100644
--- a/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/FilesetHookDispatcher.java
@@ -86,7 +86,7 @@ public class FilesetHookDispatcher implements 
FilesetDispatcher {
             ident, comment, type, storageLocations, properties, 
secretBindings, secretReferences);
 
     // Set the creator as the owner of the fileset.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       // The inner NormalizeDispatcher case-folds the fileset name (and its 
schema namespace)
       // based on catalog capabilities, so the entity is stored under the 
normalized identifier.
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/JobHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/JobHookDispatcher.java
index 99135ec5dc..32badedc29 100644
--- a/core/src/main/java/org/apache/gravitino/hook/JobHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/JobHookDispatcher.java
@@ -55,7 +55,7 @@ public class JobHookDispatcher implements 
JobOperationDispatcher {
     jobOperationDispatcher.registerJobTemplate(metalake, jobTemplateEntity);
 
     // Set the creator as the owner of the job template.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           metalake,
@@ -101,7 +101,7 @@ public class JobHookDispatcher implements 
JobOperationDispatcher {
     JobEntity jobEntity = jobOperationDispatcher.runJob(metalake, 
jobTemplateName, jobConf);
 
     // Set the creator as the owner of the job.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       ownerManager.setOwner(
           metalake,
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 ef62bb839a..c36350b92e 100644
--- a/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/MetalakeHookDispatcher.java
@@ -66,13 +66,13 @@ public class MetalakeHookDispatcher implements 
MetalakeDispatcher {
 
     // Add the creator to the metalake.
     AccessControlDispatcher accessControlDispatcher =
-        GravitinoEnv.getInstance().accessControlDispatcher();
+        GravitinoEnv.getInstance().internalAccessControlDispatcher();
     if (accessControlDispatcher != null) {
       accessControlDispatcher.addUser(ident.name(), 
PrincipalUtils.getCurrentUserName());
     }
 
     // Set the creator as owner of the metalake.
-    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerDispatcher != null) {
       ownerDispatcher.setOwner(
           ident.name(),
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 85c8af2ce3..2143030b7a 100644
--- a/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java
@@ -71,7 +71,7 @@ public class ModelHookDispatcher implements ModelDispatcher {
     Model model = dispatcher.registerModel(ident, comment, properties);
 
     // Set the creator as owner of the model.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       // The inner NormalizeDispatcher case-folds the model name based on 
catalog capabilities,
       // so the entity is stored under the normalized identifier. Apply the 
same normalization
@@ -165,7 +165,7 @@ public class ModelHookDispatcher implements ModelDispatcher 
{
     Model model = dispatcher.registerModel(ident, uris, aliases, comment, 
properties);
 
     // Set the creator as owner of the model.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       // The inner NormalizeDispatcher case-folds the model name based on 
catalog capabilities,
       // so the entity is stored under the normalized identifier. Apply the 
same normalization
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/PolicyHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/PolicyHookDispatcher.java
index f0f996176a..57164c3af0 100644
--- a/core/src/main/java/org/apache/gravitino/hook/PolicyHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/PolicyHookDispatcher.java
@@ -67,7 +67,7 @@ public class PolicyHookDispatcher implements PolicyDispatcher 
{
     PolicyEntity policy = dispatcher.createPolicy(metalake, name, type, 
comment, enabled, content);
 
     // Set the creator as the owner of the policy.
-    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerDispatcher != null) {
       ownerDispatcher.setOwner(
           metalake,
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 7bd644df16..3abc121a1e 100644
--- a/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/SchemaHookDispatcher.java
@@ -111,7 +111,7 @@ public class SchemaHookDispatcher implements 
SchemaDispatcher {
           // mirrors IcebergNamespaceHookDispatcher.createNamespace so 
ownership-based
           // authorization -- which treats ownership of an ancestor schema as 
ownership of the
           // whole subtree -- behaves the same on the Gravitino and Iceberg 
REST surfaces.
-          OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+          OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
           if (ownerManager != null) {
             List<MetadataObject> ownedObjects = new 
ArrayList<>(newAncestors.size() + 1);
             for (NameIdentifier ancestor : newAncestors) {
diff --git 
a/core/src/main/java/org/apache/gravitino/hook/TagHookDispatcher.java 
b/core/src/main/java/org/apache/gravitino/hook/TagHookDispatcher.java
index fd71f4a961..0596d4bead 100644
--- a/core/src/main/java/org/apache/gravitino/hook/TagHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/TagHookDispatcher.java
@@ -72,7 +72,7 @@ public class TagHookDispatcher implements TagDispatcher {
     Tag tag = dispatcher.createTag(metalake, name, comment, properties, 
valueConstraint);
 
     // Set the creator as the owner of the tag.
-    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerDispatcher != null) {
       ownerDispatcher.setOwner(
           metalake,
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 a9ac3b2dc7..cae51e74fc 100644
--- a/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java
+++ b/core/src/main/java/org/apache/gravitino/hook/TopicHookDispatcher.java
@@ -68,7 +68,7 @@ public class TopicHookDispatcher implements TopicDispatcher {
     Topic topic = dispatcher.createTopic(ident, comment, dataLayout, 
properties);
 
     // Set the creator as the owner of the topic.
-    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher ownerManager = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     if (ownerManager != null) {
       // The inner NormalizeDispatcher case-folds the topic name (and its 
schema namespace)
       // based on catalog capabilities, so the entity is stored under the 
normalized identifier.
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 17a0ebb53d..04d3a8b46d 100644
--- a/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java
+++ b/core/src/main/java/org/apache/gravitino/utils/MetadataObjectUtil.java
@@ -233,59 +233,61 @@ public class MetadataObjectUtil {
           throw new IllegalMetadataObjectException("The metalake object name 
must be %s", metalake);
         }
         NameIdentifierUtil.checkMetalake(identifier);
-        check(env.metalakeDispatcher().metalakeExists(identifier), 
exceptionToThrowSupplier);
+        check(
+            env.internalMetalakeDispatcher().metalakeExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case CATALOG:
         NameIdentifierUtil.checkCatalog(identifier);
-        check(env.catalogDispatcher().catalogExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalCatalogDispatcher().catalogExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case SCHEMA:
         NameIdentifierUtil.checkSchema(identifier);
-        check(env.schemaDispatcher().schemaExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalSchemaDispatcher().schemaExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case FILESET:
         NameIdentifierUtil.checkFileset(identifier);
-        check(env.filesetDispatcher().filesetExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalFilesetDispatcher().filesetExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case TABLE:
         NameIdentifierUtil.checkTable(identifier);
-        check(env.tableDispatcher().tableExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalTableDispatcher().tableExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case COLUMN:
         NameIdentifierUtil.checkColumn(identifier);
         NameIdentifier tableIdent = 
NameIdentifier.of(identifier.namespace().levels());
-        check(env.tableDispatcher().tableExists(tableIdent), 
exceptionToThrowSupplier);
+        check(env.internalTableDispatcher().tableExists(tableIdent), 
exceptionToThrowSupplier);
         break;
 
       case TOPIC:
         NameIdentifierUtil.checkTopic(identifier);
-        check(env.topicDispatcher().topicExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalTopicDispatcher().topicExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case MODEL:
         NameIdentifierUtil.checkModel(identifier);
-        check(env.modelDispatcher().modelExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalModelDispatcher().modelExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case FUNCTION:
         NameIdentifierUtil.checkFunction(identifier);
-        check(env.functionDispatcher().functionExists(identifier), 
exceptionToThrowSupplier);
+        check(
+            env.internalFunctionDispatcher().functionExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case VIEW:
         NameIdentifierUtil.checkView(identifier);
-        check(env.viewDispatcher().viewExists(identifier), 
exceptionToThrowSupplier);
+        check(env.internalViewDispatcher().viewExists(identifier), 
exceptionToThrowSupplier);
         break;
 
       case ROLE:
         AuthorizationUtils.checkRole(identifier);
         try {
-          env.accessControlDispatcher().getRole(metalake, object.fullName());
+          env.internalAccessControlDispatcher().getRole(metalake, 
object.fullName());
         } catch (NoSuchRoleException nsr) {
           throw exceptionToThrowSupplier.get();
         }
@@ -294,7 +296,7 @@ public class MetadataObjectUtil {
       case TAG:
         NameIdentifierUtil.checkTag(identifier);
         try {
-          env.tagDispatcher().getTag(metalake, object.fullName());
+          env.internalTagDispatcher().getTag(metalake, object.fullName());
         } catch (NoSuchTagException nsr) {
           throw exceptionToThrowSupplier.get();
         }
@@ -303,7 +305,7 @@ public class MetadataObjectUtil {
       case POLICY:
         NameIdentifierUtil.checkPolicy(identifier);
         try {
-          env.policyDispatcher().getPolicy(metalake, object.fullName());
+          env.internalPolicyDispatcher().getPolicy(metalake, 
object.fullName());
         } catch (NoSuchPolicyException nsr) {
           throw checkNotNull(exceptionToThrowSupplier).get();
         }
@@ -312,7 +314,7 @@ public class MetadataObjectUtil {
       case JOB:
         NameIdentifierUtil.checkJob(identifier);
         try {
-          env.jobOperationDispatcher().getJob(metalake, object.fullName());
+          env.internalJobOperationDispatcher().getJob(metalake, 
object.fullName());
         } catch (NoSuchJobException e) {
           throw exceptionToThrowSupplier.get();
         }
@@ -321,7 +323,7 @@ public class MetadataObjectUtil {
       case JOB_TEMPLATE:
         NameIdentifierUtil.checkJobTemplate(identifier);
         try {
-          env.jobOperationDispatcher().getJobTemplate(metalake, 
object.fullName());
+          env.internalJobOperationDispatcher().getJobTemplate(metalake, 
object.fullName());
         } catch (NoSuchJobTemplateException e) {
           throw exceptionToThrowSupplier.get();
         }
diff --git 
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
 
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
index 5bd5798970..01136cc7f7 100644
--- 
a/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
+++ 
b/core/src/test/java/org/apache/gravitino/authorization/TestAuthorizationUtils.java
@@ -249,7 +249,10 @@ class TestAuthorizationUtils {
     FieldUtils.writeField(
         GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "accessControlDispatcher", 
accessControlDispatcher, true);
+        GravitinoEnv.getInstance(),
+        "internalAccessControlDispatcher",
+        accessControlDispatcher,
+        true);
 
     List<String> locations =
         AuthorizationUtils.getMetadataObjectLocation(
@@ -279,7 +282,10 @@ class TestAuthorizationUtils {
     
Mockito.when(catalogDispatcher.loadCatalog(Mockito.any())).thenReturn(catalog);
 
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "accessControlDispatcher", 
accessControlDispatcher, true);
+        GravitinoEnv.getInstance(),
+        "internalAccessControlDispatcher",
+        accessControlDispatcher,
+        true);
     FieldUtils.writeField(
         GravitinoEnv.getInstance(), "internalCatalogDispatcher", 
catalogDispatcher, true);
     FieldUtils.writeField(
@@ -337,7 +343,7 @@ class TestAuthorizationUtils {
 
     GravitinoEnv envMock = Mockito.mock(GravitinoEnv.class);
     Mockito.when(envMock.gravitinoAuthorizer()).thenReturn(authorizer);
-    
Mockito.when(envMock.accessControlDispatcher()).thenReturn(accessControlDispatcher);
+    
Mockito.when(envMock.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
     Mockito.when(envMock.catalogManager()).thenReturn(catalogManager);
 
     try (MockedStatic<GravitinoEnv> envStatic = 
Mockito.mockStatic(GravitinoEnv.class)) {
@@ -362,7 +368,7 @@ class TestAuthorizationUtils {
 
     GravitinoEnv envMock = Mockito.mock(GravitinoEnv.class);
     Mockito.when(envMock.gravitinoAuthorizer()).thenReturn(authorizer);
-    
Mockito.when(envMock.accessControlDispatcher()).thenReturn(accessControlDispatcher);
+    
Mockito.when(envMock.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
     Mockito.when(envMock.catalogManager()).thenReturn(catalogManager);
 
     try (MockedStatic<GravitinoEnv> envStatic = 
Mockito.mockStatic(GravitinoEnv.class)) {
@@ -391,7 +397,7 @@ class TestAuthorizationUtils {
     
Mockito.when(baseCatalog.getAuthorizationPlugin()).thenReturn(authorizationPlugin);
 
     GravitinoEnv envMock = Mockito.mock(GravitinoEnv.class);
-    
Mockito.when(envMock.accessControlDispatcher()).thenReturn(accessControlDispatcher);
+    
Mockito.when(envMock.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
     Mockito.when(envMock.catalogManager()).thenReturn(catalogManager);
 
     try (MockedStatic<GravitinoEnv> envStatic = 
Mockito.mockStatic(GravitinoEnv.class)) {
@@ -431,7 +437,7 @@ class TestAuthorizationUtils {
     
Mockito.when(baseCatalog.getAuthorizationPlugin()).thenReturn(authorizationPlugin);
 
     GravitinoEnv envMock = Mockito.mock(GravitinoEnv.class);
-    
Mockito.when(envMock.accessControlDispatcher()).thenReturn(accessControlDispatcher);
+    
Mockito.when(envMock.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
     Mockito.when(envMock.catalogManager()).thenReturn(catalogManager);
 
     try (MockedStatic<GravitinoEnv> envStatic = 
Mockito.mockStatic(GravitinoEnv.class)) {
diff --git 
a/core/src/test/java/org/apache/gravitino/catalog/TestPartitionOperationDispatcher.java
 
b/core/src/test/java/org/apache/gravitino/catalog/TestPartitionOperationDispatcher.java
index 25a9ea6ebb..bed4136ac9 100644
--- 
a/core/src/test/java/org/apache/gravitino/catalog/TestPartitionOperationDispatcher.java
+++ 
b/core/src/test/java/org/apache/gravitino/catalog/TestPartitionOperationDispatcher.java
@@ -91,7 +91,7 @@ public class TestPartitionOperationDispatcher extends 
TestOperationDispatcher {
     doReturn(36000L).when(config).get(TREE_LOCK_CLEAN_INTERVAL);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "schemaDispatcher", 
schemaOperationDispatcher, true);
+        GravitinoEnv.getInstance(), "internalSchemaDispatcher", 
schemaOperationDispatcher, true);
 
     NameIdentifier schemaIdent = NameIdentifierUtil.ofSchema(metalake, 
catalog, SCHEMA);
     schemaOperationDispatcher.createSchema(schemaIdent, "comment", 
ImmutableMap.of("k1", "v1"));
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestAccessControlHookDispatcher.java
 
b/core/src/test/java/org/apache/gravitino/hook/TestAccessControlHookDispatcher.java
index 6f5ac0d404..308ea03444 100644
--- 
a/core/src/test/java/org/apache/gravitino/hook/TestAccessControlHookDispatcher.java
+++ 
b/core/src/test/java/org/apache/gravitino/hook/TestAccessControlHookDispatcher.java
@@ -55,9 +55,10 @@ public class TestAccessControlHookDispatcher {
     mockDispatcher = mock(AccessControlDispatcher.class);
     mockOwnerDispatcher = mock(OwnerDispatcher.class);
     mockAuthorizer = mock(GravitinoAuthorizer.class);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     savedAuthorizer = GravitinoEnv.getInstance().gravitinoAuthorizer();
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "gravitinoAuthorizer", 
mockAuthorizer, true);
     hookDispatcher = new AccessControlHookDispatcher(mockDispatcher);
   }
@@ -65,7 +66,7 @@ public class TestAccessControlHookDispatcher {
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "gravitinoAuthorizer", 
savedAuthorizer, true);
   }
 
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestCatalogHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestCatalogHookDispatcher.java
index a114953f34..b5e582d584 100644
--- 
a/core/src/test/java/org/apache/gravitino/hook/TestCatalogHookDispatcher.java
+++ 
b/core/src/test/java/org/apache/gravitino/hook/TestCatalogHookDispatcher.java
@@ -38,7 +38,8 @@ public class TestCatalogHookDispatcher {
   @Test
   public void testCreateCatalogThrowsPostHookExceptionWhenRollbackSucceeds() 
throws Exception {
     GravitinoEnv gravitinoEnv = GravitinoEnv.getInstance();
-    Object originalOwnerDispatcher = FieldUtils.readField(gravitinoEnv, 
"ownerDispatcher", true);
+    Object originalOwnerDispatcher =
+        FieldUtils.readField(gravitinoEnv, "internalOwnerDispatcher", true);
     Object originalFutureGrantManager =
         FieldUtils.readField(gravitinoEnv, "futureGrantManager", true);
 
@@ -62,7 +63,7 @@ public class TestCatalogHookDispatcher {
                 Mockito.anyMap()))
         .thenReturn(catalog);
 
-    FieldUtils.writeField(gravitinoEnv, "ownerDispatcher", ownerDispatcher, 
true);
+    FieldUtils.writeField(gravitinoEnv, "internalOwnerDispatcher", 
ownerDispatcher, true);
     FieldUtils.writeField(gravitinoEnv, "futureGrantManager", null, true);
 
     try {
@@ -81,7 +82,7 @@ public class TestCatalogHookDispatcher {
 
       Mockito.verify(dispatcher).dropCatalog(ident, true);
     } finally {
-      FieldUtils.writeField(gravitinoEnv, "ownerDispatcher", 
originalOwnerDispatcher, true);
+      FieldUtils.writeField(gravitinoEnv, "internalOwnerDispatcher", 
originalOwnerDispatcher, true);
       FieldUtils.writeField(gravitinoEnv, "futureGrantManager", 
originalFutureGrantManager, true);
     }
   }
@@ -89,7 +90,8 @@ public class TestCatalogHookDispatcher {
   @Test
   public void testCreateCatalogRollbackExceptionDoesNotMaskPostHookException() 
throws Exception {
     GravitinoEnv gravitinoEnv = GravitinoEnv.getInstance();
-    Object originalOwnerDispatcher = FieldUtils.readField(gravitinoEnv, 
"ownerDispatcher", true);
+    Object originalOwnerDispatcher =
+        FieldUtils.readField(gravitinoEnv, "internalOwnerDispatcher", true);
     Object originalFutureGrantManager =
         FieldUtils.readField(gravitinoEnv, "futureGrantManager", true);
 
@@ -115,7 +117,7 @@ public class TestCatalogHookDispatcher {
         .thenReturn(catalog);
     Mockito.doThrow(rollbackException).when(dispatcher).dropCatalog(ident, 
true);
 
-    FieldUtils.writeField(gravitinoEnv, "ownerDispatcher", ownerDispatcher, 
true);
+    FieldUtils.writeField(gravitinoEnv, "internalOwnerDispatcher", 
ownerDispatcher, true);
     FieldUtils.writeField(gravitinoEnv, "futureGrantManager", null, true);
 
     try {
@@ -135,7 +137,7 @@ public class TestCatalogHookDispatcher {
 
       Mockito.verify(dispatcher).dropCatalog(ident, true);
     } finally {
-      FieldUtils.writeField(gravitinoEnv, "ownerDispatcher", 
originalOwnerDispatcher, true);
+      FieldUtils.writeField(gravitinoEnv, "internalOwnerDispatcher", 
originalOwnerDispatcher, true);
       FieldUtils.writeField(gravitinoEnv, "futureGrantManager", 
originalFutureGrantManager, true);
     }
   }
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestFilesetHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestFilesetHookDispatcher.java
index 76daebb873..d3963d7280 100644
--- 
a/core/src/test/java/org/apache/gravitino/hook/TestFilesetHookDispatcher.java
+++ 
b/core/src/test/java/org/apache/gravitino/hook/TestFilesetHookDispatcher.java
@@ -107,7 +107,7 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
     // Self-contained: use a fresh hook with a directly-mocked 
FilesetDispatcher and a case-
     // insensitive catalog so we can verify the helper passes a normalized 
ident to setOwner.
     CatalogManager savedCatalogManager = 
GravitinoEnv.getInstance().catalogManager();
-    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
 
     CatalogManager mockCatalogManager = Mockito.mock(CatalogManager.class);
     CatalogManager.CatalogWrapper mockWrapper = 
Mockito.mock(CatalogManager.CatalogWrapper.class);
@@ -122,7 +122,8 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
         .thenReturn(Mockito.mock(Fileset.class));
 
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
mockCatalogManager, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
 
     try {
       FilesetHookDispatcher localHook = new 
FilesetHookDispatcher(mockFilesetDispatcher);
@@ -151,7 +152,7 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
       FieldUtils.writeField(
           GravitinoEnv.getInstance(), "catalogManager", savedCatalogManager, 
true);
       FieldUtils.writeField(
-          GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+          GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     }
   }
 
@@ -159,7 +160,7 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
   public void testCreateFilesetThrowsWhenSetOwnerFails() throws 
IllegalAccessException {
     // Save the original ownerDispatcher so we can restore it in the finally 
block instead of
     // wiping it to null and leaking that into other tests in the suite.
-    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
 
     // Create the schema first with the existing (non-throwing) 
ownerDispatcher, then swap to the
     // throwing mock only for the fileset create we actually want to exercise. 
Otherwise the
@@ -172,7 +173,8 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
     Mockito.doThrow(new RuntimeException("Set owner failed"))
         .when(mockOwnerDispatcher)
         .setOwner(any(), any(), any(), any());
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
 
     try {
       NameIdentifier filesetIdent = NameIdentifier.of(filesetNs, 
"fileset_owner_fail");
@@ -185,7 +187,7 @@ public class TestFilesetHookDispatcher extends 
TestOperationDispatcher {
       Assertions.assertEquals("Set owner failed", thrown.getMessage());
     } finally {
       FieldUtils.writeField(
-          GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+          GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     }
   }
 
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestJobHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestJobHookDispatcher.java
index 404c79456c..baea025fc4 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestJobHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestJobHookDispatcher.java
@@ -51,15 +51,16 @@ public class TestJobHookDispatcher {
   public void setUp() throws IllegalAccessException {
     mockDispatcher = mock(JobOperationDispatcher.class);
     mockOwnerDispatcher = mock(OwnerDispatcher.class);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     hookDispatcher = new JobHookDispatcher(mockDispatcher);
   }
 
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
   }
 
   @Test
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestMetalakeHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestMetalakeHookDispatcher.java
index 144a3b89df..33f6ff18f5 100644
--- 
a/core/src/test/java/org/apache/gravitino/hook/TestMetalakeHookDispatcher.java
+++ 
b/core/src/test/java/org/apache/gravitino/hook/TestMetalakeHookDispatcher.java
@@ -55,20 +55,27 @@ public class TestMetalakeHookDispatcher {
     mockDispatcher = mock(MetalakeDispatcher.class);
     mockOwnerDispatcher = mock(OwnerDispatcher.class);
     mockAccessControlDispatcher = mock(AccessControlDispatcher.class);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
-    savedAccessControlDispatcher = 
GravitinoEnv.getInstance().accessControlDispatcher();
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
+    savedAccessControlDispatcher = 
GravitinoEnv.getInstance().internalAccessControlDispatcher();
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "accessControlDispatcher", 
mockAccessControlDispatcher, true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(),
+        "internalAccessControlDispatcher",
+        mockAccessControlDispatcher,
+        true);
     hookDispatcher = new MetalakeHookDispatcher(mockDispatcher);
   }
 
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "accessControlDispatcher", 
savedAccessControlDispatcher, true);
+        GravitinoEnv.getInstance(),
+        "internalAccessControlDispatcher",
+        savedAccessControlDispatcher,
+        true);
   }
 
   @Test
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestModelHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestModelHookDispatcher.java
index 624d1558e1..b7c061058c 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestModelHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestModelHookDispatcher.java
@@ -63,13 +63,14 @@ public class TestModelHookDispatcher {
     mockCatalogWrapper = mock(CatalogManager.CatalogWrapper.class);
     
when(mockCatalogManager.loadCatalogAndWrap(any())).thenReturn(mockCatalogWrapper);
     when(mockCatalogWrapper.capabilities()).thenReturn(Capability.DEFAULT);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     // Read the catalogManager field directly via reflection because the 
public accessor
     // Preconditions-checks for non-null, which would fail when GravitinoEnv 
has not been
     // initialized for this test class.
     savedCatalogManager =
         (CatalogManager) FieldUtils.readField(GravitinoEnv.getInstance(), 
"catalogManager", true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
mockCatalogManager, true);
     hookDispatcher = new ModelHookDispatcher(mockDispatcher);
   }
@@ -77,7 +78,7 @@ public class TestModelHookDispatcher {
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
savedCatalogManager, true);
   }
 
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestPolicyHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestPolicyHookDispatcher.java
index 23eaa84f52..fd0ca523fd 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestPolicyHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestPolicyHookDispatcher.java
@@ -48,15 +48,16 @@ public class TestPolicyHookDispatcher {
   public void setUp() throws IllegalAccessException {
     mockDispatcher = mock(PolicyDispatcher.class);
     mockOwnerDispatcher = mock(OwnerDispatcher.class);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     hookDispatcher = new PolicyHookDispatcher(mockDispatcher);
   }
 
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
   }
 
   @Test
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestSchemaHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestSchemaHookDispatcher.java
index d5ebd8893d..a4d0591d1f 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestSchemaHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestSchemaHookDispatcher.java
@@ -81,7 +81,7 @@ public class TestSchemaHookDispatcher {
     mockCatalogWrapper = mock(CatalogManager.CatalogWrapper.class);
     
when(mockCatalogManager.loadCatalogAndWrap(any())).thenReturn(mockCatalogWrapper);
     when(mockCatalogWrapper.capabilities()).thenReturn(Capability.DEFAULT);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
     // Tests in this class that rely on the singleton catalogManager always go 
through
     // GravitinoEnv.getInstance().catalogManager(), but we cannot call the 
public accessor here
     // because it Preconditions-checks for non-null and would fail when 
GravitinoEnv has not been
@@ -90,7 +90,8 @@ public class TestSchemaHookDispatcher {
         (CatalogManager) FieldUtils.readField(GravitinoEnv.getInstance(), 
"catalogManager", true);
     savedLockManager =
         (LockManager) FieldUtils.readField(GravitinoEnv.getInstance(), 
"lockManager", true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
mockCatalogManager, true);
     // createSchema now acquires a catalog-level tree lock, so wire up a real 
LockManager.
     FieldUtils.writeField(
@@ -101,7 +102,7 @@ public class TestSchemaHookDispatcher {
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
savedCatalogManager, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", 
savedLockManager, true);
   }
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestTagHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestTagHookDispatcher.java
index e83abefebf..0e92cd403b 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestTagHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestTagHookDispatcher.java
@@ -48,15 +48,16 @@ public class TestTagHookDispatcher {
   public void setUp() throws IllegalAccessException {
     mockDispatcher = mock(TagDispatcher.class);
     mockOwnerDispatcher = mock(OwnerDispatcher.class);
-    savedOwnerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
     hookDispatcher = new TagHookDispatcher(mockDispatcher);
   }
 
   @AfterEach
   public void tearDown() throws IllegalAccessException {
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
   }
 
   @Test
diff --git 
a/core/src/test/java/org/apache/gravitino/hook/TestTopicHookDispatcher.java 
b/core/src/test/java/org/apache/gravitino/hook/TestTopicHookDispatcher.java
index 539af87f5a..0d1a025cdd 100644
--- a/core/src/test/java/org/apache/gravitino/hook/TestTopicHookDispatcher.java
+++ b/core/src/test/java/org/apache/gravitino/hook/TestTopicHookDispatcher.java
@@ -83,7 +83,7 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
     // Self-contained: use a fresh hook with a directly-mocked TopicDispatcher 
and a case-
     // insensitive catalog so we can verify the helper passes a normalized 
ident to setOwner.
     CatalogManager savedCatalogManager = 
GravitinoEnv.getInstance().catalogManager();
-    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
 
     CatalogManager mockCatalogManager = Mockito.mock(CatalogManager.class);
     CatalogManager.CatalogWrapper mockWrapper = 
Mockito.mock(CatalogManager.CatalogWrapper.class);
@@ -96,7 +96,8 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
         .thenReturn(Mockito.mock(Topic.class));
 
     FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogManager", 
mockCatalogManager, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
 
     try {
       TopicHookDispatcher localHook = new 
TopicHookDispatcher(mockTopicDispatcher);
@@ -119,7 +120,7 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
       FieldUtils.writeField(
           GravitinoEnv.getInstance(), "catalogManager", savedCatalogManager, 
true);
       FieldUtils.writeField(
-          GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+          GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     }
   }
 
@@ -127,7 +128,7 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
   public void testCreateTopicThrowsWhenSetOwnerFails() throws 
IllegalAccessException {
     // Save the original ownerDispatcher so we can restore it in the finally 
block instead of
     // wiping it to null and leaking that into other tests in the suite.
-    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().ownerDispatcher();
+    OwnerDispatcher savedOwnerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
 
     // Create the schema first with the existing (non-throwing) 
ownerDispatcher, then swap to the
     // throwing mock only for the topic create we actually want to exercise. 
Otherwise the throwing
@@ -140,7 +141,8 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
     Mockito.doThrow(new RuntimeException("Set owner failed"))
         .when(mockOwnerDispatcher)
         .setOwner(any(), any(), any(), any());
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
mockOwnerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
mockOwnerDispatcher, true);
 
     try {
       NameIdentifier topicIdent = NameIdentifier.of(topicNs, 
"topic_owner_fail");
@@ -151,7 +153,7 @@ public class TestTopicHookDispatcher extends 
TestOperationDispatcher {
       Assertions.assertEquals("Set owner failed", thrown.getMessage());
     } finally {
       FieldUtils.writeField(
-          GravitinoEnv.getInstance(), "ownerDispatcher", savedOwnerDispatcher, 
true);
+          GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
savedOwnerDispatcher, true);
     }
   }
 
diff --git 
a/core/src/test/java/org/apache/gravitino/policy/TestPolicyManager.java 
b/core/src/test/java/org/apache/gravitino/policy/TestPolicyManager.java
index ef25f5b960..181af71e4a 100644
--- a/core/src/test/java/org/apache/gravitino/policy/TestPolicyManager.java
+++ b/core/src/test/java/org/apache/gravitino/policy/TestPolicyManager.java
@@ -133,13 +133,17 @@ public class TestPolicyManager {
 
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", 
catalogDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "schemaDispatcher", 
schemaDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher", 
tableDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "viewDispatcher", 
viewDispatcher, true);
+        GravitinoEnv.getInstance(), "internalMetalakeDispatcher", 
metalakeDispatcher, true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "functionDispatcher", functionDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalCatalogDispatcher", 
catalogDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalSchemaDispatcher", 
schemaDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalViewDispatcher", viewDispatcher, 
true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalFunctionDispatcher", 
functionDispatcher, true);
 
     AuditInfo audit = 
AuditInfo.builder().withCreator("test").withCreateTime(Instant.now()).build();
     BaseMetalake metalake =
diff --git a/core/src/test/java/org/apache/gravitino/tag/TestTagManager.java 
b/core/src/test/java/org/apache/gravitino/tag/TestTagManager.java
index 7dfeb6029a..41d7d65b07 100644
--- a/core/src/test/java/org/apache/gravitino/tag/TestTagManager.java
+++ b/core/src/test/java/org/apache/gravitino/tag/TestTagManager.java
@@ -273,13 +273,17 @@ public class TestTagManager {
     tagManager = new TagManager(idGenerator, entityStore);
 
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", 
catalogDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "schemaDispatcher", 
schemaDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher", 
tableDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "viewDispatcher", 
viewDispatcher, true);
+        GravitinoEnv.getInstance(), "internalMetalakeDispatcher", 
metalakeDispatcher, true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "functionDispatcher", functionDispatcher, 
true);
+        GravitinoEnv.getInstance(), "internalCatalogDispatcher", 
catalogDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalSchemaDispatcher", 
schemaDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalViewDispatcher", viewDispatcher, 
true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalFunctionDispatcher", 
functionDispatcher, true);
 
     when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
     when(catalogDispatcher.catalogExists(any())).thenReturn(true);
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 243d3d69a6..1354dcc4e7 100644
--- a/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java
+++ b/core/src/test/java/org/apache/gravitino/utils/TestMetadataObjectUtil.java
@@ -18,14 +18,35 @@
  */
 package org.apache.gravitino.utils;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.gravitino.Entity;
+import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.MetadataObjects;
 import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.authorization.AccessControlDispatcher;
+import org.apache.gravitino.catalog.CatalogDispatcher;
+import org.apache.gravitino.catalog.FilesetDispatcher;
+import org.apache.gravitino.catalog.FunctionDispatcher;
+import org.apache.gravitino.catalog.ModelDispatcher;
+import org.apache.gravitino.catalog.SchemaDispatcher;
+import org.apache.gravitino.catalog.TableDispatcher;
+import org.apache.gravitino.catalog.TopicDispatcher;
+import org.apache.gravitino.catalog.ViewDispatcher;
+import org.apache.gravitino.job.JobOperationDispatcher;
+import org.apache.gravitino.metalake.MetalakeDispatcher;
+import org.apache.gravitino.policy.PolicyDispatcher;
+import org.apache.gravitino.tag.TagDispatcher;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 
 public class TestMetadataObjectUtil {
 
@@ -218,6 +239,110 @@ public class TestMetadataObjectUtil {
         describe(MetadataObjectUtil.getParentMetadataObjects(column, ":")));
   }
 
+  @Test
+  public void testCheckMetadataObjectUsesInternalDispatchers() {
+    GravitinoEnv env = mock(GravitinoEnv.class);
+    MetalakeDispatcher metalakeDispatcher = mock(MetalakeDispatcher.class);
+    CatalogDispatcher catalogDispatcher = mock(CatalogDispatcher.class);
+    SchemaDispatcher schemaDispatcher = mock(SchemaDispatcher.class);
+    FilesetDispatcher filesetDispatcher = mock(FilesetDispatcher.class);
+    TableDispatcher tableDispatcher = mock(TableDispatcher.class);
+    TopicDispatcher topicDispatcher = mock(TopicDispatcher.class);
+    ModelDispatcher modelDispatcher = mock(ModelDispatcher.class);
+    FunctionDispatcher functionDispatcher = mock(FunctionDispatcher.class);
+    ViewDispatcher viewDispatcher = mock(ViewDispatcher.class);
+    AccessControlDispatcher accessControlDispatcher = 
mock(AccessControlDispatcher.class);
+    TagDispatcher tagDispatcher = mock(TagDispatcher.class);
+    PolicyDispatcher policyDispatcher = mock(PolicyDispatcher.class);
+    JobOperationDispatcher jobDispatcher = mock(JobOperationDispatcher.class);
+
+    when(env.internalMetalakeDispatcher()).thenReturn(metalakeDispatcher);
+    when(env.internalCatalogDispatcher()).thenReturn(catalogDispatcher);
+    when(env.internalSchemaDispatcher()).thenReturn(schemaDispatcher);
+    when(env.internalFilesetDispatcher()).thenReturn(filesetDispatcher);
+    when(env.internalTableDispatcher()).thenReturn(tableDispatcher);
+    when(env.internalTopicDispatcher()).thenReturn(topicDispatcher);
+    when(env.internalModelDispatcher()).thenReturn(modelDispatcher);
+    when(env.internalFunctionDispatcher()).thenReturn(functionDispatcher);
+    when(env.internalViewDispatcher()).thenReturn(viewDispatcher);
+    
when(env.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
+    when(env.internalTagDispatcher()).thenReturn(tagDispatcher);
+    when(env.internalPolicyDispatcher()).thenReturn(policyDispatcher);
+    when(env.internalJobOperationDispatcher()).thenReturn(jobDispatcher);
+
+    NameIdentifier metalakeIdent = NameIdentifier.of("metalake");
+    NameIdentifier catalogIdent = NameIdentifier.of("metalake", "catalog");
+    NameIdentifier schemaIdent = NameIdentifier.of("metalake", "catalog", 
"schema");
+    NameIdentifier filesetIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "fileset");
+    NameIdentifier tableIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
+    NameIdentifier topicIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "topic");
+    NameIdentifier modelIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "model");
+    NameIdentifier functionIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "function");
+    NameIdentifier viewIdent = NameIdentifier.of("metalake", "catalog", 
"schema", "view");
+
+    when(metalakeDispatcher.metalakeExists(metalakeIdent)).thenReturn(true);
+    when(catalogDispatcher.catalogExists(catalogIdent)).thenReturn(true);
+    when(schemaDispatcher.schemaExists(schemaIdent)).thenReturn(true);
+    when(filesetDispatcher.filesetExists(filesetIdent)).thenReturn(true);
+    when(tableDispatcher.tableExists(tableIdent)).thenReturn(true);
+    when(topicDispatcher.topicExists(topicIdent)).thenReturn(true);
+    when(modelDispatcher.modelExists(modelIdent)).thenReturn(true);
+    when(functionDispatcher.functionExists(functionIdent)).thenReturn(true);
+    when(viewDispatcher.viewExists(viewIdent)).thenReturn(true);
+
+    try (MockedStatic<GravitinoEnv> mockedEnv = 
mockStatic(GravitinoEnv.class)) {
+      mockedEnv.when(GravitinoEnv::getInstance).thenReturn(env);
+
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "metalake", 
MetadataObject.Type.METALAKE));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "catalog", 
MetadataObject.Type.CATALOG));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog", "schema", 
MetadataObject.Type.SCHEMA));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog.schema", "fileset", 
MetadataObject.Type.FILESET));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog.schema", "table", 
MetadataObject.Type.TABLE));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake",
+          MetadataObjects.of("catalog.schema.table", "column", 
MetadataObject.Type.COLUMN));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog.schema", "topic", 
MetadataObject.Type.TOPIC));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog.schema", "model", 
MetadataObject.Type.MODEL));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake",
+          MetadataObjects.of("catalog.schema", "function", 
MetadataObject.Type.FUNCTION));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of("catalog.schema", "view", 
MetadataObject.Type.VIEW));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "role", 
MetadataObject.Type.ROLE));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "tag", 
MetadataObject.Type.TAG));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "policy", 
MetadataObject.Type.POLICY));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "job", 
MetadataObject.Type.JOB));
+      MetadataObjectUtil.checkMetadataObject(
+          "metalake", MetadataObjects.of(null, "template", 
MetadataObject.Type.JOB_TEMPLATE));
+    }
+
+    verify(metalakeDispatcher).metalakeExists(metalakeIdent);
+    verify(catalogDispatcher).catalogExists(catalogIdent);
+    verify(schemaDispatcher).schemaExists(schemaIdent);
+    verify(filesetDispatcher).filesetExists(filesetIdent);
+    verify(tableDispatcher, times(2)).tableExists(tableIdent);
+    verify(topicDispatcher).topicExists(topicIdent);
+    verify(modelDispatcher).modelExists(modelIdent);
+    verify(functionDispatcher).functionExists(functionIdent);
+    verify(viewDispatcher).viewExists(viewIdent);
+    verify(accessControlDispatcher).getRole("metalake", "role");
+    verify(tagDispatcher).getTag("metalake", "tag");
+    verify(policyDispatcher).getPolicy("metalake", "policy");
+    verify(jobDispatcher).getJob("metalake", "job");
+    verify(jobDispatcher).getJobTemplate("metalake", "template");
+  }
+
   private static List<String> describe(List<MetadataObject> objects) {
     return objects.stream().map(o -> o.type() + ":" + 
o.fullName()).collect(Collectors.toList());
   }
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
index f2c4d097c9..c3ac8dbef3 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java
@@ -551,7 +551,7 @@ public class MetadataAuthzHelper {
       Entity.EntityType entityType, NameIdentifier[] nameIdentifiers) {
     // If cache is not enabled or access control dispatcher is not set, skip 
preloading to cache
     if (!GravitinoEnv.getInstance().cacheEnabled()
-        || GravitinoEnv.getInstance().accessControlDispatcher() == null
+        || GravitinoEnv.getInstance().internalAccessControlDispatcher() == null
         || nameIdentifiers.length == 0) {
       return;
     }
@@ -570,7 +570,7 @@ public class MetadataAuthzHelper {
           "All identifiers must have the same schema");
 
       if (!GravitinoEnv.getInstance()
-          .schemaDispatcher()
+          .internalSchemaDispatcher()
           .schemaExists(NameIdentifier.parse(firstNamespace.toString()))) {
         return;
       }
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
index 4e82289318..dcf11a9ba7 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
@@ -400,7 +400,7 @@ public class JcasbinAuthorizer implements 
GravitinoAuthorizer {
   @Override
   public boolean isServiceAdmin() {
     return GravitinoEnv.getInstance()
-        .accessControlDispatcher()
+        .internalAccessControlDispatcher()
         .isServiceAdmin(PrincipalUtils.getCurrentUserName());
   }
 
diff --git 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/TestMetadataAuthzHelper.java
 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/TestMetadataAuthzHelper.java
index 024443f568..cec329b30c 100644
--- 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/TestMetadataAuthzHelper.java
+++ 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/TestMetadataAuthzHelper.java
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Set;
 import java.util.concurrent.Executor;
@@ -38,8 +39,10 @@ import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.UserPrincipal;
+import org.apache.gravitino.authorization.AccessControlDispatcher;
 import org.apache.gravitino.authorization.GravitinoAuthorizer;
 import org.apache.gravitino.authorization.Privilege;
+import org.apache.gravitino.catalog.SchemaDispatcher;
 import org.apache.gravitino.dto.tag.MetadataObjectDTO;
 import 
org.apache.gravitino.server.authorization.expression.AuthorizationExpressionConstants;
 import org.apache.gravitino.utils.NameIdentifierUtil;
@@ -56,11 +59,12 @@ import org.mockito.MockedStatic;
 public class TestMetadataAuthzHelper {
 
   private static MockedStatic<GravitinoEnv> mockedStaticGravitinoEnv;
+  private static GravitinoEnv gravitinoEnv;
 
   @BeforeAll
   public static void setup() {
     mockedStaticGravitinoEnv = mockStatic(GravitinoEnv.class);
-    GravitinoEnv gravitinoEnv = mock(GravitinoEnv.class);
+    gravitinoEnv = mock(GravitinoEnv.class);
     
mockedStaticGravitinoEnv.when(GravitinoEnv::getInstance).thenReturn(gravitinoEnv);
     Config configMock = mock(Config.class);
     when(gravitinoEnv.config()).thenReturn(configMock);
@@ -111,6 +115,33 @@ public class TestMetadataAuthzHelper {
     }
   }
 
+  @Test
+  public void testPreloadUsesInternalDispatchers() throws Exception {
+    AccessControlDispatcher accessControlDispatcher = 
mock(AccessControlDispatcher.class);
+    SchemaDispatcher schemaDispatcher = mock(SchemaDispatcher.class);
+    NameIdentifier tableIdentifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
+    NameIdentifier schemaIdentifier = NameIdentifier.of("metalake", "catalog", 
"schema");
+
+    when(gravitinoEnv.cacheEnabled()).thenReturn(true);
+    
when(gravitinoEnv.internalAccessControlDispatcher()).thenReturn(accessControlDispatcher);
+    when(gravitinoEnv.internalSchemaDispatcher()).thenReturn(schemaDispatcher);
+    when(schemaDispatcher.schemaExists(schemaIdentifier)).thenReturn(false);
+
+    Method preload =
+        MetadataAuthzHelper.class.getDeclaredMethod(
+            "preloadToCache", Entity.EntityType.class, NameIdentifier[].class);
+    preload.setAccessible(true);
+    try {
+      preload.invoke(
+          null, new Object[] {Entity.EntityType.TABLE, new NameIdentifier[] 
{tableIdentifier}});
+      verify(schemaDispatcher).schemaExists(schemaIdentifier);
+    } finally {
+      when(gravitinoEnv.cacheEnabled()).thenReturn(false);
+      when(gravitinoEnv.internalAccessControlDispatcher()).thenReturn(null);
+      when(gravitinoEnv.internalSchemaDispatcher()).thenReturn(null);
+    }
+  }
+
   @Test
   public void testFilterMetadataObject() {
     makeCompletableFutureUseCurrentThread();
diff --git 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
index c5339e1a18..9316cdad38 100644
--- 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
+++ 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
@@ -72,6 +72,7 @@ import org.apache.gravitino.UserGroup;
 import org.apache.gravitino.UserPrincipal;
 import org.apache.gravitino.auth.ActiveRoles;
 import org.apache.gravitino.auth.AuthConstants;
+import org.apache.gravitino.authorization.AccessControlDispatcher;
 import org.apache.gravitino.authorization.AuthorizationRequestContext;
 import org.apache.gravitino.authorization.Privilege;
 import org.apache.gravitino.authorization.SecurableObject;
@@ -389,6 +390,17 @@ public class TestJcasbinAuthorizer {
     verify(userMetaMapper).getUserUpdatedAt(METALAKE, USERNAME);
   }
 
+  @Test
+  public void testIsServiceAdminUsesInternalDispatcher() {
+    AccessControlDispatcher dispatcher = mock(AccessControlDispatcher.class);
+    
when(gravitinoEnv.internalAccessControlDispatcher()).thenReturn(dispatcher);
+    when(dispatcher.isServiceAdmin(USERNAME)).thenReturn(true);
+
+    assertTrue(jcasbinAuthorizer.isServiceAdmin());
+
+    verify(dispatcher).isServiceAdmin(USERNAME);
+  }
+
   @Test
   public void testAuthorize() throws Exception {
     makeCompletableFutureUseCurrentThread(jcasbinAuthorizer);
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/filter/authorization/LoadTableAuthorizationExecutor.java
 
b/server/src/main/java/org/apache/gravitino/server/web/filter/authorization/LoadTableAuthorizationExecutor.java
index a0a99b94e4..aa0b1f2207 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/filter/authorization/LoadTableAuthorizationExecutor.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/filter/authorization/LoadTableAuthorizationExecutor.java
@@ -88,7 +88,7 @@ public class LoadTableAuthorizationExecutor extends 
CommonAuthorizerExecutor {
 
     NameIdentifier tableIdentifier = 
metadataContext.get(Entity.EntityType.TABLE);
     return tableIdentifier != null
-        && 
!GravitinoEnv.getInstance().tableDispatcher().tableExists(tableIdentifier);
+        && 
!GravitinoEnv.getInstance().internalTableDispatcher().tableExists(tableIdentifier);
   }
 
   private static boolean shouldCheckModifyTablePrivilege(
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java 
b/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
index 58be4935a3..c7db58227d 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
@@ -81,7 +81,7 @@ public class BulkOperations {
   public BulkOperations() {
     this.bulkManager = GravitinoEnv.getInstance().bulkManager();
     this.accessControlDispatcher = 
GravitinoEnv.getInstance().accessControlDispatcher();
-    this.ownerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
+    this.ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
   }
 
   /**
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
 
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
index a6487080a3..570b83bda7 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
@@ -76,7 +76,7 @@ public class GroupOperations {
     // and Jersey injection doesn't support null value. So GroupOperations 
chooses to retrieve
     // accessControlManager from GravitinoEnv instead of injection here.
     this.accessControlManager = 
GravitinoEnv.getInstance().accessControlDispatcher();
-    this.ownerDispatcher = GravitinoEnv.getInstance().ownerDispatcher();
+    this.ownerDispatcher = 
GravitinoEnv.getInstance().internalOwnerDispatcher();
   }
 
   @GET
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java 
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
index 2ea92f162a..db4ab7439e 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
@@ -75,7 +75,7 @@ public class UserOperations {
     // and Jersey injection doesn't support null value. So UserOperations 
chooses to retrieve
     // accessControlManager from GravitinoEnv instead of injection here.
     this.accessControlManager = 
GravitinoEnv.getInstance().accessControlDispatcher();
-    this.ownerManager = GravitinoEnv.getInstance().ownerDispatcher();
+    this.ownerManager = GravitinoEnv.getInstance().internalOwnerDispatcher();
   }
 
   @GET
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/filter/TestGravitinoInterceptionService.java
 
b/server/src/test/java/org/apache/gravitino/server/web/filter/TestGravitinoInterceptionService.java
index 95165b0576..76016c682b 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/filter/TestGravitinoInterceptionService.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/filter/TestGravitinoInterceptionService.java
@@ -641,7 +641,7 @@ public class TestGravitinoInterceptionService {
       TableDispatcher tableDispatcher = mock(TableDispatcher.class);
       EventBus mockEventBus = mock(EventBus.class);
       envMocked.when(GravitinoEnv::getInstance).thenReturn(mockEnv);
-      when(mockEnv.tableDispatcher()).thenReturn(tableDispatcher);
+      when(mockEnv.internalTableDispatcher()).thenReturn(tableDispatcher);
       when(mockEnv.eventBus()).thenReturn(mockEventBus);
       
when(tableDispatcher.tableExists(ArgumentMatchers.any())).thenReturn(false);
 
@@ -688,7 +688,7 @@ public class TestGravitinoInterceptionService {
       TableDispatcher tableDispatcher = mock(TableDispatcher.class);
       EventBus mockEventBus = spy(new EventBus(Collections.emptyList()));
       envMocked.when(GravitinoEnv::getInstance).thenReturn(mockEnv);
-      when(mockEnv.tableDispatcher()).thenReturn(tableDispatcher);
+      when(mockEnv.internalTableDispatcher()).thenReturn(tableDispatcher);
       when(mockEnv.eventBus()).thenReturn(mockEventBus);
       
when(tableDispatcher.tableExists(ArgumentMatchers.any())).thenReturn(true);
 
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/filter/authorization/TestLoadTableAuthorizationExecutor.java
 
b/server/src/test/java/org/apache/gravitino/server/web/filter/authorization/TestLoadTableAuthorizationExecutor.java
index 15bc76ce8f..2382155146 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/filter/authorization/TestLoadTableAuthorizationExecutor.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/filter/authorization/TestLoadTableAuthorizationExecutor.java
@@ -20,17 +20,31 @@
 package org.apache.gravitino.server.web.filter.authorization;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.Collections;
+import java.util.Map;
 import java.util.Optional;
+import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.gravitino.Entity;
+import org.apache.gravitino.GravitinoEnv;
 import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.authorization.AuthorizationRequestContext;
+import org.apache.gravitino.catalog.TableDispatcher;
 import 
org.apache.gravitino.server.authorization.annotations.AuthorizationRequest;
 import 
org.apache.gravitino.server.authorization.annotations.ExpressionCondition;
 import 
org.apache.gravitino.server.authorization.expression.AuthorizationExpressionConstants;
+import 
org.apache.gravitino.server.authorization.expression.AuthorizationExpressionEvaluator;
 import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 
 public class TestLoadTableAuthorizationExecutor {
   private static final String PRIMARY_EXPRESSION =
@@ -63,6 +77,48 @@ public class TestLoadTableAuthorizationExecutor {
     assertEquals(PRIMARY_EXPRESSION, expression(executor));
   }
 
+  @Test
+  public void testExistenceProbeUsesInternalTableDispatcher() throws Exception 
{
+    Method method = TestOperations.class.getMethod("loadTable", String.class);
+    NameIdentifier tableIdentifier = NameIdentifier.of("metalake", "catalog", 
"schema", "table");
+    LoadTableAuthorizationExecutor executor =
+        new LoadTableAuthorizationExecutor(
+            method.getParameters(),
+            new Object[] {"SELECT_TABLE"},
+            PRIMARY_EXPRESSION,
+            Map.of(Entity.EntityType.TABLE, tableIdentifier),
+            Collections.emptyMap(),
+            Optional.empty(),
+            SECONDARY_EXPRESSION,
+            ExpressionCondition.NEVER,
+            
AuthorizationExpressionConstants.PROBE_TABLE_LIKE_AUTHORIZATION_EXPRESSION);
+
+    AuthorizationExpressionEvaluator primaryEvaluator =
+        mock(AuthorizationExpressionEvaluator.class);
+    AuthorizationExpressionEvaluator existenceEvaluator =
+        mock(AuthorizationExpressionEvaluator.class);
+    when(primaryEvaluator.evaluate(
+            anyMap(), anyMap(), any(AuthorizationRequestContext.class), any()))
+        .thenReturn(false);
+    when(existenceEvaluator.evaluate(
+            anyMap(), anyMap(), any(AuthorizationRequestContext.class), any()))
+        .thenReturn(true);
+    executor.authorizationExpressionEvaluator = primaryEvaluator;
+    FieldUtils.writeField(executor, "allowCheckExistenceEvaluator", 
existenceEvaluator, true);
+
+    GravitinoEnv env = mock(GravitinoEnv.class);
+    TableDispatcher internalTableDispatcher = mock(TableDispatcher.class);
+    when(env.internalTableDispatcher()).thenReturn(internalTableDispatcher);
+    
when(internalTableDispatcher.tableExists(tableIdentifier)).thenReturn(false);
+
+    try (MockedStatic<GravitinoEnv> mockedEnv = 
mockStatic(GravitinoEnv.class)) {
+      mockedEnv.when(GravitinoEnv::getInstance).thenReturn(env);
+      assertTrue(executor.execute(new AuthorizationRequestContext()));
+    }
+
+    verify(internalTableDispatcher).tableExists(tableIdentifier);
+  }
+
   private static LoadTableAuthorizationExecutor createExecutor(
       String privileges, ExpressionCondition condition) throws Exception {
     Method method = TestOperations.class.getMethod("loadTable", String.class);
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
index 5c008c19c9..35551bae92 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
@@ -120,7 +120,8 @@ public class TestBulkOperations extends BaseOperationsTest {
     FieldUtils.writeField(GravitinoEnv.getInstance(), "config", config, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), 
"accessControlDispatcher", manager, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
ownerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
ownerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "bulkManager", new 
BulkManager(config), true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
     bulkOperations = new BulkOperations();
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
index 8d89d4a682..8013e7c061 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
@@ -96,7 +96,8 @@ public class TestGroupOperations extends BaseOperationsTest {
     Mockito.doReturn(36000L).when(config).get(TREE_LOCK_CLEAN_INTERVAL);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), 
"accessControlDispatcher", manager, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
ownerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
ownerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
   }
 
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 b342f3cfda..f14f60480c 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
@@ -94,7 +94,12 @@ class TestOwnerOperations extends BaseOperationsTest {
     FieldUtils.writeField(
         GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "accessControlDispatcher", 
accessControlDispatcher, true);
+        GravitinoEnv.getInstance(), "internalMetalakeDispatcher", 
metalakeDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(),
+        "internalAccessControlDispatcher",
+        accessControlDispatcher,
+        true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
   }
 
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
index 037490a407..119bb78f8c 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
@@ -111,7 +111,10 @@ public class TestPermissionOperations extends 
BaseOperationsTest {
     FieldUtils.writeField(GravitinoEnv.getInstance(), 
"accessControlDispatcher", manager, true);
     FieldUtils.writeField(
         GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher", 
tableDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalMetalakeDispatcher", 
metalakeDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
   }
 
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
index b0111d1276..23cba9d104 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
@@ -117,12 +117,19 @@ public class TestRoleOperations extends 
BaseOperationsTest {
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), 
"accessControlDispatcher", manager, true);
     FieldUtils.writeField(
-        GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher, 
true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "catalogDispatcher", 
catalogDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "schemaDispatcher", 
schemaDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher", 
tableDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "topicDispatcher", 
topicDispatcher, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "filesetDispatcher", 
filesetDispatcher, true);
+        GravitinoEnv.getInstance(), "internalAccessControlDispatcher", 
manager, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalMetalakeDispatcher", 
metalakeDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalCatalogDispatcher", 
catalogDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalSchemaDispatcher", 
schemaDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTopicDispatcher", 
topicDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalFilesetDispatcher", 
filesetDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
   }
 
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestStatisticOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestStatisticOperations.java
index 887359c177..f8951a9966 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestStatisticOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestStatisticOperations.java
@@ -109,7 +109,8 @@ public class TestStatisticOperations extends 
BaseOperationsTest {
     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(), "tableDispatcher", 
tableDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalTableDispatcher", 
tableDispatcher, true);
   }
 
   @Override
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
index a5940ee74c..94c21a824c 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
@@ -92,7 +92,8 @@ public class TestUserOperations extends BaseOperationsTest {
     Mockito.doReturn(36000L).when(config).get(TREE_LOCK_CLEAN_INTERVAL);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new 
LockManager(config), true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), 
"accessControlDispatcher", manager, true);
-    FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher", 
ownerDispatcher, true);
+    FieldUtils.writeField(
+        GravitinoEnv.getInstance(), "internalOwnerDispatcher", 
ownerDispatcher, true);
     FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore", 
entityStore, true);
   }
 

Reply via email to