jerqi commented on code in PR #6844:
URL: https://github.com/apache/gravitino/pull/6844#discussion_r2032283035


##########
core/src/main/java/org/apache/gravitino/hook/ModelHookDispatcher.java:
##########
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.hook;
+
+import java.util.Map;
+import org.apache.gravitino.Entity;
+import org.apache.gravitino.GravitinoEnv;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.Namespace;
+import org.apache.gravitino.authorization.AuthorizationUtils;
+import org.apache.gravitino.authorization.Owner;
+import org.apache.gravitino.authorization.OwnerManager;
+import org.apache.gravitino.catalog.ModelDispatcher;
+import org.apache.gravitino.exceptions.ModelAlreadyExistsException;
+import 
org.apache.gravitino.exceptions.ModelVersionAliasesAlreadyExistException;
+import org.apache.gravitino.exceptions.NoSuchModelException;
+import org.apache.gravitino.exceptions.NoSuchModelVersionException;
+import org.apache.gravitino.exceptions.NoSuchSchemaException;
+import org.apache.gravitino.model.Model;
+import org.apache.gravitino.model.ModelChange;
+import org.apache.gravitino.model.ModelVersion;
+import org.apache.gravitino.utils.NameIdentifierUtil;
+import org.apache.gravitino.utils.PrincipalUtils;
+
+/**
+ * {@code ModelHookDispatcher} is a decorator for {@link ModelDispatcher} that 
not only delegates
+ * model operations to the underlying model dispatcher but also executes some 
hook operations before
+ * or after the underlying operations.
+ */
+public class ModelHookDispatcher implements ModelDispatcher {
+
+  private final ModelDispatcher dispatcher;
+
+  public ModelHookDispatcher(ModelDispatcher dispatcher) {
+    this.dispatcher = dispatcher;
+  }
+
+  @Override
+  public NameIdentifier[] listModels(Namespace namespace) throws 
NoSuchSchemaException {
+    return dispatcher.listModels(namespace);
+  }
+
+  @Override
+  public Model getModel(NameIdentifier ident) throws NoSuchModelException {
+    return dispatcher.getModel(ident);
+  }
+
+  @Override
+  public Model registerModel(NameIdentifier ident, String comment, Map<String, 
String> properties)
+      throws NoSuchSchemaException, ModelAlreadyExistsException {
+    // Check whether the current user exists or not
+    AuthorizationUtils.checkCurrentUser(
+        ident.namespace().level(0), PrincipalUtils.getCurrentUserName());
+
+    Model model = dispatcher.registerModel(ident, comment, properties);
+
+    // Set the creator as owner of the model.
+    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    if (ownerManager != null) {
+      ownerManager.setOwner(
+          ident.namespace().level(0),
+          NameIdentifierUtil.toMetadataObject(ident, Entity.EntityType.MODEL),
+          PrincipalUtils.getCurrentUserName(),
+          Owner.Type.USER);
+    }
+    return model;
+  }
+
+  @Override
+  public boolean deleteModel(NameIdentifier ident) {
+    return dispatcher.deleteModel(ident);
+  }
+
+  @Override
+  public int[] listModelVersions(NameIdentifier ident) throws 
NoSuchModelException {
+    return dispatcher.listModelVersions(ident);
+  }
+
+  @Override
+  public ModelVersion getModelVersion(NameIdentifier ident, int version)
+      throws NoSuchModelVersionException {
+    return dispatcher.getModelVersion(ident, version);
+  }
+
+  @Override
+  public ModelVersion getModelVersion(NameIdentifier ident, String alias)
+      throws NoSuchModelVersionException {
+    return dispatcher.getModelVersion(ident, alias);
+  }
+
+  @Override
+  public void linkModelVersion(
+      NameIdentifier ident,
+      String uri,
+      String[] aliases,
+      String comment,
+      Map<String, String> properties)
+      throws NoSuchModelException, ModelVersionAliasesAlreadyExistException {
+    dispatcher.linkModelVersion(ident, uri, aliases, comment, properties);
+  }
+
+  @Override
+  public boolean deleteModelVersion(NameIdentifier ident, int version) {
+    return dispatcher.deleteModelVersion(ident, version);
+  }
+
+  @Override
+  public boolean deleteModelVersion(NameIdentifier ident, String alias) {
+    return dispatcher.deleteModelVersion(ident, alias);
+  }
+
+  @Override
+  public boolean modelExists(NameIdentifier ident) {
+    return dispatcher.modelExists(ident);
+  }
+
+  @Override
+  public Model registerModel(
+      NameIdentifier ident,
+      String uri,
+      String[] aliases,
+      String comment,
+      Map<String, String> properties)
+      throws NoSuchSchemaException, ModelAlreadyExistsException,
+          ModelVersionAliasesAlreadyExistException {
+    // Check whether the current user exists or not
+    AuthorizationUtils.checkCurrentUser(
+        ident.namespace().level(0), PrincipalUtils.getCurrentUserName());
+
+    Model model = dispatcher.registerModel(ident, uri, aliases, comment, 
properties);
+
+    // Set the creator as owner of the model.
+    OwnerManager ownerManager = GravitinoEnv.getInstance().ownerManager();
+    if (ownerManager != null) {
+      ownerManager.setOwner(
+          ident.name(),
+          NameIdentifierUtil.toMetadataObject(ident, Entity.EntityType.MODEL),
+          PrincipalUtils.getCurrentUserName(),
+          Owner.Type.USER);
+    }
+    return model;
+  }
+
+  @Override
+  public boolean modelVersionExists(NameIdentifier ident, int version) {
+    return dispatcher.modelVersionExists(ident, version);
+  }
+
+  @Override
+  public boolean modelVersionExists(NameIdentifier ident, String alias) {
+    return dispatcher.modelVersionExists(ident, alias);
+  }
+
+  @Override
+  public Model alterModel(NameIdentifier ident, ModelChange... changes)
+      throws NoSuchModelException, IllegalArgumentException {
+    return dispatcher.alterModel(ident, changes);
+  }
+}

Review Comment:
   Good question. Actually I hesitate to add similar logic. 
   Because I am not sure whether the model needs the authz plugin. 
   Can authentication of model be finished by Gravitino master. 
   Because the locations under model may be a website. 
   Maybe it doesn't have a common permission model system. 
   If we have  S3 locations and website locations at the same time and we have 
authz plugin, we can push down the privileges of S3 but we can't push down the 
privileges of website. it maybe weird that we push down partial privileges. Is 
it better to let users guarantee the access of locations and don't add authz 
plugin.
   So I think we don't need to add it now. It would be a better time when we 
need to implement some authz plugins of the model.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@gravitino.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to