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

fanng pushed a commit to branch branch-metadata-authz
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-metadata-authz by this 
push:
     new 78637596b6 [#7557] get user from HTTP request for Iceberg REST server 
(#7626)
78637596b6 is described below

commit 78637596b64bab178c48d320c7c9a9e13b249c21
Author: Yunchi Pang <[email protected]>
AuthorDate: Thu Jul 10 19:05:15 2025 -0700

    [#7557] get user from HTTP request for Iceberg REST server (#7626)
    
    ### What changes were proposed in this pull request?
    
    1. Wrapped business logic with `Utils.doAs(httpRequest, ...)` in methods
    of `IcebergXXXOperations` to extract and establish user context.
    2. Mocked `HttpServletRequest` with test user principal for tests in
    `TestIcebergXXXOperations`.
    
    - [x] `IcebergTableOperations`
    - [x] `IcebergTableRenameOperations`
    - [x] `IcebergNamespaceOperations`
    - [x] `IcebergViewOperations`
    - [x] `IcebergViewRenameOperations`
    
    ### Why are the changes needed?
    
    To have all operations of Iceberg REST server to be executed under
    authenticated user context.
    Fix: #7557
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    `org.apache.gravitino.iceberg.service.rest.TestIcebergTableOperations`
    `org.apache.gravitino.iceberg.service.rest.TestIcebergNamespaceOperations`
    `org.apache.gravitino.iceberg.service.rest.TestIcebergViewOperations`
---
 .../iceberg/service/IcebergExceptionMapper.java    |   4 +
 .../service/rest/IcebergNamespaceOperations.java   | 129 +++++++++++++++-----
 .../service/rest/IcebergTableOperations.java       | 134 ++++++++++++++++-----
 .../service/rest/IcebergTableRenameOperations.java |  17 ++-
 .../service/rest/IcebergViewOperations.java        | 114 +++++++++++++-----
 .../service/rest/IcebergViewRenameOperations.java  |  17 ++-
 .../rest/TestIcebergNamespaceOperations.java       |  15 +++
 .../service/rest/TestIcebergTableOperations.java   |  14 +++
 .../service/rest/TestIcebergViewOperations.java    |  14 +++
 9 files changed, 358 insertions(+), 100 deletions(-)

diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergExceptionMapper.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergExceptionMapper.java
index ed7d0a2f98..cc26287ea9 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergExceptionMapper.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergExceptionMapper.java
@@ -71,6 +71,10 @@ public class IcebergExceptionMapper implements 
ExceptionMapper<Exception> {
 
   @Override
   public Response toResponse(Exception ex) {
+    return toRESTResponse(ex);
+  }
+
+  public static Response toRESTResponse(Exception ex) {
     int status =
         EXCEPTION_ERROR_CODES.getOrDefault(
             ex.getClass(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergNamespaceOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergNamespaceOperations.java
index d1d4273869..aa77c4d48d 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergNamespaceOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergNamespaceOperations.java
@@ -39,11 +39,13 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.gravitino.iceberg.service.IcebergExceptionMapper;
 import org.apache.gravitino.iceberg.service.IcebergObjectMapper;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergNamespaceOperationDispatcher;
 import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
+import org.apache.gravitino.server.web.Utils;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.rest.RESTUtil;
 import org.apache.iceberg.rest.requests.CreateNamespaceRequest;
@@ -88,10 +90,19 @@ public class IcebergNamespaceOperations {
         parent.isEmpty() ? Namespace.empty() : 
RESTUtil.decodeNamespace(parent);
     LOG.info(
         "List Iceberg namespaces, catalog: {}, parentNamespace: {}", 
catalogName, parentNamespace);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    ListNamespacesResponse response =
-        namespaceOperationDispatcher.listNamespaces(context, parentNamespace);
-    return IcebergRestUtils.ok(response);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            ListNamespacesResponse response =
+                namespaceOperationDispatcher.listNamespaces(context, 
parentNamespace);
+            return IcebergRestUtils.ok(response);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @GET
@@ -104,11 +115,19 @@ public class IcebergNamespaceOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("Load Iceberg namespace, catalog: {}, namespace: {}", 
catalogName, icebergNS);
-
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    GetNamespaceResponse getNamespaceResponse =
-        namespaceOperationDispatcher.loadNamespace(context, icebergNS);
-    return IcebergRestUtils.ok(getNamespaceResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            GetNamespaceResponse getNamespaceResponse =
+                namespaceOperationDispatcher.loadNamespace(context, icebergNS);
+            return IcebergRestUtils.ok(getNamespaceResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @HEAD
@@ -121,13 +140,21 @@ public class IcebergNamespaceOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("Check Iceberg namespace exists, catalog: {}, namespace: {}", 
catalogName, icebergNS);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-
-    boolean exists = namespaceOperationDispatcher.namespaceExists(context, 
icebergNS);
-    if (exists) {
-      return IcebergRestUtils.noContent();
-    } else {
-      return IcebergRestUtils.notExists();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            boolean exists = 
namespaceOperationDispatcher.namespaceExists(context, icebergNS);
+            if (exists) {
+              return IcebergRestUtils.noContent();
+            } else {
+              return IcebergRestUtils.notExists();
+            }
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
     }
   }
 
@@ -142,9 +169,18 @@ public class IcebergNamespaceOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("Drop Iceberg namespace, catalog: {}, namespace: {}", 
catalogName, icebergNS);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    namespaceOperationDispatcher.dropNamespace(context, icebergNS);
-    return IcebergRestUtils.noContent();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            namespaceOperationDispatcher.dropNamespace(context, icebergNS);
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -158,10 +194,19 @@ public class IcebergNamespaceOperations {
         "Create Iceberg namespace, catalog: {}, createNamespaceRequest: {}",
         catalogName,
         createNamespaceRequest);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    CreateNamespaceResponse createNamespaceResponse =
-        namespaceOperationDispatcher.createNamespace(context, 
createNamespaceRequest);
-    return IcebergRestUtils.ok(createNamespaceResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            CreateNamespaceResponse createNamespaceResponse =
+                namespaceOperationDispatcher.createNamespace(context, 
createNamespaceRequest);
+            return IcebergRestUtils.ok(createNamespaceResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -180,11 +225,20 @@ public class IcebergNamespaceOperations {
         catalogName,
         icebergNS,
         
SerializeUpdateNamespacePropertiesRequest(updateNamespacePropertiesRequest));
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    UpdateNamespacePropertiesResponse updateNamespacePropertiesResponse =
-        namespaceOperationDispatcher.updateNamespace(
-            context, icebergNS, updateNamespacePropertiesRequest);
-    return IcebergRestUtils.ok(updateNamespacePropertiesResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            UpdateNamespacePropertiesResponse 
updateNamespacePropertiesResponse =
+                namespaceOperationDispatcher.updateNamespace(
+                    context, icebergNS, updateNamespacePropertiesRequest);
+            return IcebergRestUtils.ok(updateNamespacePropertiesResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -203,11 +257,20 @@ public class IcebergNamespaceOperations {
         catalogName,
         icebergNS,
         registerTableRequest);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    LoadTableResponse loadTableResponse =
-        namespaceOperationDispatcher.registerTable(context, icebergNS, 
registerTableRequest);
-
-    return IcebergRestUtils.ok(loadTableResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            LoadTableResponse loadTableResponse =
+                namespaceOperationDispatcher.registerTable(
+                    context, icebergNS, registerTableRequest);
+            return IcebergRestUtils.ok(loadTableResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   // HTTP request is null in Jersey test, override with a mock request when 
testing.
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
index a8ad24d9e0..f6a9070100 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
@@ -41,12 +41,14 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.gravitino.iceberg.service.IcebergExceptionMapper;
 import org.apache.gravitino.iceberg.service.IcebergObjectMapper;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
 import org.apache.gravitino.iceberg.service.metrics.IcebergMetricsManager;
 import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
+import org.apache.gravitino.server.web.Utils;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.rest.RESTUtil;
@@ -93,9 +95,19 @@ public class IcebergTableOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("List Iceberg tables, catalog: {}, namespace: {}", catalogName, 
icebergNS);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    ListTablesResponse listTablesResponse = 
tableOperationDispatcher.listTable(context, icebergNS);
-    return IcebergRestUtils.ok(listTablesResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            ListTablesResponse listTablesResponse =
+                tableOperationDispatcher.listTable(context, icebergNS);
+            return IcebergRestUtils.ok(listTablesResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -118,11 +130,19 @@ public class IcebergTableOperations {
         createTableRequest,
         accessDelegation,
         isCredentialVending);
-    IcebergRequestContext context =
-        new IcebergRequestContext(httpServletRequest(), catalogName, 
isCredentialVending);
-    LoadTableResponse loadTableResponse =
-        tableOperationDispatcher.createTable(context, icebergNS, 
createTableRequest);
-    return IcebergRestUtils.ok(loadTableResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName, 
isCredentialVending);
+            LoadTableResponse loadTableResponse =
+                tableOperationDispatcher.createTable(context, icebergNS, 
createTableRequest);
+            return IcebergRestUtils.ok(loadTableResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -145,11 +165,20 @@ public class IcebergTableOperations {
           table,
           SerializeUpdateTableRequest(updateTableRequest));
     }
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
-    LoadTableResponse loadTableResponse =
-        tableOperationDispatcher.updateTable(context, tableIdentifier, 
updateTableRequest);
-    return IcebergRestUtils.ok(loadTableResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, 
table);
+            LoadTableResponse loadTableResponse =
+                tableOperationDispatcher.updateTable(context, tableIdentifier, 
updateTableRequest);
+            return IcebergRestUtils.ok(loadTableResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @DELETE
@@ -170,10 +199,19 @@ public class IcebergTableOperations {
         icebergNS,
         table,
         purgeRequested);
-    TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    tableOperationDispatcher.dropTable(context, tableIdentifier, 
purgeRequested);
-    return IcebergRestUtils.noContent();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, 
table);
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            tableOperationDispatcher.dropTable(context, tableIdentifier, 
purgeRequested);
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @GET
@@ -199,12 +237,20 @@ public class IcebergTableOperations {
         accessDelegation,
         isCredentialVending);
     // todo support snapshots
-    TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
-    IcebergRequestContext context =
-        new IcebergRequestContext(httpServletRequest(), catalogName, 
isCredentialVending);
-    LoadTableResponse loadTableResponse =
-        tableOperationDispatcher.loadTable(context, tableIdentifier);
-    return IcebergRestUtils.ok(loadTableResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, 
table);
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName, 
isCredentialVending);
+            LoadTableResponse loadTableResponse =
+                tableOperationDispatcher.loadTable(context, tableIdentifier);
+            return IcebergRestUtils.ok(loadTableResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @HEAD
@@ -223,13 +269,22 @@ public class IcebergTableOperations {
         catalogName,
         icebergNS,
         table);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
-    boolean exists = tableOperationDispatcher.tableExists(context, 
tableIdentifier);
-    if (exists) {
-      return IcebergRestUtils.noContent();
-    } else {
-      return IcebergRestUtils.notExists();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, 
table);
+            boolean exists = tableOperationDispatcher.tableExists(context, 
tableIdentifier);
+            if (exists) {
+              return IcebergRestUtils.noContent();
+            } else {
+              return IcebergRestUtils.notExists();
+            }
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
     }
   }
 
@@ -243,8 +298,23 @@ public class IcebergTableOperations {
       @Encoded() @PathParam("namespace") String namespace,
       @PathParam("table") String table,
       ReportMetricsRequest request) {
-    icebergMetricsManager.recordMetric(request.report());
-    return IcebergRestUtils.noContent();
+    String catalogName = IcebergRestUtils.getCatalogName(prefix);
+    Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
+    LOG.info(
+        "Report Iceberg table metrics, catalog: {}, namespace: {}, table: {}",
+        catalogName,
+        icebergNS,
+        table);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            icebergMetricsManager.recordMetric(request.report());
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   // HTTP request is null in Jersey test, override with a mock request when 
testing.
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
index f0f508dcb1..d1f079d1d6 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
@@ -31,10 +31,12 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.gravitino.iceberg.service.IcebergExceptionMapper;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
 import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
+import org.apache.gravitino.server.web.Utils;
 import org.apache.iceberg.rest.requests.RenameTableRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,9 +68,18 @@ public class IcebergTableRenameOperations {
         catalogName,
         renameTableRequest.source(),
         renameTableRequest.destination());
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    tableOperationDispatcher.renameTable(context, renameTableRequest);
-    return IcebergRestUtils.noContent();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            tableOperationDispatcher.renameTable(context, renameTableRequest);
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   // HTTP request is null in Jersey test, override with a mock request when 
testing.
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewOperations.java
index 175ab8fbd5..2b3b2db2fc 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewOperations.java
@@ -37,11 +37,13 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.gravitino.iceberg.service.IcebergExceptionMapper;
 import org.apache.gravitino.iceberg.service.IcebergObjectMapper;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergViewOperationDispatcher;
 import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
+import org.apache.gravitino.server.web.Utils;
 import org.apache.iceberg.catalog.Namespace;
 import org.apache.iceberg.catalog.TableIdentifier;
 import org.apache.iceberg.rest.RESTUtil;
@@ -79,9 +81,19 @@ public class IcebergViewOperations {
     String catalogName = IcebergRestUtils.getCatalogName(prefix);
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info("List Iceberg views, catalog: {}, namespace: {}", catalogName, 
icebergNS);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    ListTablesResponse listTablesResponse = 
viewOperationDispatcher.listView(context, icebergNS);
-    return IcebergRestUtils.ok(listTablesResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            ListTablesResponse listTablesResponse =
+                viewOperationDispatcher.listView(context, icebergNS);
+            return IcebergRestUtils.ok(listTablesResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -99,11 +111,19 @@ public class IcebergViewOperations {
         catalogName,
         icebergNS,
         createViewRequest);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    LoadViewResponse loadViewResponse =
-        viewOperationDispatcher.createView(context, icebergNS, 
createViewRequest);
-
-    return IcebergRestUtils.ok(loadViewResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            LoadViewResponse loadViewResponse =
+                viewOperationDispatcher.createView(context, icebergNS, 
createViewRequest);
+            return IcebergRestUtils.ok(loadViewResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @GET
@@ -119,11 +139,20 @@ public class IcebergViewOperations {
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info(
         "Load Iceberg view, catalog: {}, namespace: {}, view: {}", 
catalogName, icebergNS, view);
-
-    TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, view);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    LoadViewResponse loadViewResponse = 
viewOperationDispatcher.loadView(context, viewIdentifier);
-    return IcebergRestUtils.ok(loadViewResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, 
view);
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            LoadViewResponse loadViewResponse =
+                viewOperationDispatcher.loadView(context, viewIdentifier);
+            return IcebergRestUtils.ok(loadViewResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @POST
@@ -144,11 +173,20 @@ public class IcebergViewOperations {
         icebergNS,
         view,
         SerializeReplaceViewRequest(replaceViewRequest));
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, view);
-    LoadViewResponse loadViewResponse =
-        viewOperationDispatcher.replaceView(context, viewIdentifier, 
replaceViewRequest);
-    return IcebergRestUtils.ok(loadViewResponse);
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, 
view);
+            LoadViewResponse loadViewResponse =
+                viewOperationDispatcher.replaceView(context, viewIdentifier, 
replaceViewRequest);
+            return IcebergRestUtils.ok(loadViewResponse);
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @DELETE
@@ -164,10 +202,19 @@ public class IcebergViewOperations {
     Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
     LOG.info(
         "Drop Iceberg view, catalog: {}, namespace: {}, view: {}", 
catalogName, icebergNS, view);
-    TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, view);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    viewOperationDispatcher.dropView(context, viewIdentifier);
-    return IcebergRestUtils.noContent();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, 
view);
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            viewOperationDispatcher.dropView(context, viewIdentifier);
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   @HEAD
@@ -186,13 +233,22 @@ public class IcebergViewOperations {
         catalogName,
         icebergNS,
         view);
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, view);
-    boolean exists = viewOperationDispatcher.viewExists(context, 
viewIdentifier);
-    if (exists) {
-      return IcebergRestUtils.noContent();
-    } else {
-      return IcebergRestUtils.notExists();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            TableIdentifier viewIdentifier = TableIdentifier.of(icebergNS, 
view);
+            boolean exists = viewOperationDispatcher.viewExists(context, 
viewIdentifier);
+            if (exists) {
+              return IcebergRestUtils.noContent();
+            } else {
+              return IcebergRestUtils.notExists();
+            }
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
     }
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewRenameOperations.java
 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewRenameOperations.java
index 4c6f706086..cbdcb216eb 100644
--- 
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewRenameOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergViewRenameOperations.java
@@ -31,10 +31,12 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.gravitino.iceberg.service.IcebergExceptionMapper;
 import org.apache.gravitino.iceberg.service.IcebergRestUtils;
 import 
org.apache.gravitino.iceberg.service.dispatcher.IcebergViewOperationDispatcher;
 import org.apache.gravitino.listener.api.event.IcebergRequestContext;
 import org.apache.gravitino.metrics.MetricNames;
+import org.apache.gravitino.server.web.Utils;
 import org.apache.iceberg.rest.requests.RenameTableRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,9 +68,18 @@ public class IcebergViewRenameOperations {
         catalogName,
         renameViewRequest.source(),
         renameViewRequest.destination());
-    IcebergRequestContext context = new 
IcebergRequestContext(httpServletRequest(), catalogName);
-    viewOperationDispatcher.renameView(context, renameViewRequest);
-    return IcebergRestUtils.noContent();
+    try {
+      return Utils.doAs(
+          httpRequest,
+          () -> {
+            IcebergRequestContext context =
+                new IcebergRequestContext(httpServletRequest(), catalogName);
+            viewOperationDispatcher.renameView(context, renameViewRequest);
+            return IcebergRestUtils.noContent();
+          });
+    } catch (Exception e) {
+      return IcebergExceptionMapper.toRESTResponse(e);
+    }
   }
 
   // HTTP request is null in Jersey test, override with a mock request when 
testing.
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergNamespaceOperations.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergNamespaceOperations.java
index 220623b95b..1f07808687 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergNamespaceOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergNamespaceOperations.java
@@ -20,6 +20,7 @@ package org.apache.gravitino.iceberg.service.rest;
 
 import java.util.Arrays;
 import java.util.Optional;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.Application;
 import org.apache.gravitino.listener.api.event.Event;
 import org.apache.gravitino.listener.api.event.IcebergCreateNamespaceEvent;
@@ -40,11 +41,13 @@ import 
org.apache.gravitino.listener.api.event.IcebergUpdateNamespaceEvent;
 import 
org.apache.gravitino.listener.api.event.IcebergUpdateNamespaceFailureEvent;
 import org.apache.gravitino.listener.api.event.IcebergUpdateNamespacePreEvent;
 import org.apache.iceberg.catalog.Namespace;
+import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.Mockito;
 
 public class TestIcebergNamespaceOperations extends IcebergNamespaceTestBase {
 
@@ -56,6 +59,18 @@ public class TestIcebergNamespaceOperations extends 
IcebergNamespaceTestBase {
     ResourceConfig resourceConfig =
         IcebergRestTestUtil.getIcebergResourceConfig(
             MockIcebergNamespaceOperations.class, true, 
Arrays.asList(dummyEventListener));
+
+    // register a mock HttpServletRequest with user info
+    resourceConfig.register(
+        new AbstractBinder() {
+          @Override
+          protected void configure() {
+            HttpServletRequest mockRequest = 
Mockito.mock(HttpServletRequest.class);
+            Mockito.when(mockRequest.getUserPrincipal()).thenReturn(() -> 
"test-user");
+            bind(mockRequest).to(HttpServletRequest.class);
+          }
+        });
+
     return resourceConfig;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
index d19d654224..cfa7d71a0d 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
@@ -71,10 +72,12 @@ import org.apache.iceberg.rest.responses.ListTablesResponse;
 import org.apache.iceberg.rest.responses.LoadTableResponse;
 import org.apache.iceberg.types.Types.NestedField;
 import org.apache.iceberg.types.Types.StringType;
+import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.mockito.Mockito;
 
 public class TestIcebergTableOperations extends IcebergNamespaceTestBase {
 
@@ -96,6 +99,17 @@ public class TestIcebergTableOperations extends 
IcebergNamespaceTestBase {
     resourceConfig.register(MockIcebergNamespaceOperations.class);
     resourceConfig.register(MockIcebergTableRenameOperations.class);
 
+    // register a mock HttpServletRequest with user info
+    resourceConfig.register(
+        new AbstractBinder() {
+          @Override
+          protected void configure() {
+            HttpServletRequest mockRequest = 
Mockito.mock(HttpServletRequest.class);
+            Mockito.when(mockRequest.getUserPrincipal()).thenReturn(() -> 
"test-user");
+            bind(mockRequest).to(HttpServletRequest.class);
+          }
+        });
+
     return resourceConfig;
   }
 
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergViewOperations.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergViewOperations.java
index 8a2a2e226f..85100e4e29 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergViewOperations.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergViewOperations.java
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
@@ -63,10 +64,12 @@ import org.apache.iceberg.types.Types;
 import org.apache.iceberg.view.ImmutableSQLViewRepresentation;
 import org.apache.iceberg.view.ImmutableViewVersion;
 import org.apache.iceberg.view.ViewMetadata;
+import org.glassfish.jersey.internal.inject.AbstractBinder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.mockito.Mockito;
 
 public class TestIcebergViewOperations extends IcebergNamespaceTestBase {
   private static final Schema viewSchema =
@@ -89,6 +92,17 @@ public class TestIcebergViewOperations extends 
IcebergNamespaceTestBase {
     resourceConfig.register(MockIcebergNamespaceOperations.class);
     resourceConfig.register(MockIcebergViewRenameOperations.class);
 
+    // register a mock HttpServletRequest with user info
+    resourceConfig.register(
+        new AbstractBinder() {
+          @Override
+          protected void configure() {
+            HttpServletRequest mockRequest = 
Mockito.mock(HttpServletRequest.class);
+            Mockito.when(mockRequest.getUserPrincipal()).thenReturn(() -> 
"test-user");
+            bind(mockRequest).to(HttpServletRequest.class);
+          }
+        });
+
     return resourceConfig;
   }
 


Reply via email to