Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#6152] refactor: Refactor tag commands in Gravitino CLI #6192

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ private void executeCommand() {
} else if (entity.equals(CommandEntities.GROUP)) {
new GroupCommandHandler(this, line, command, ignore).handle();
} else if (entity.equals(CommandEntities.TAG)) {
handleTagCommand();
new TagCommandHandler(this, line, command, ignore).handle();
} else if (entity.equals(CommandEntities.ROLE)) {
new RoleCommandHandler(this, line, command, ignore).handle();
} else if (entity.equals(CommandEntities.MODEL)) {
Expand Down Expand Up @@ -240,6 +240,67 @@ private void handleMetalakeCommand() {
}
}

/** Handles the command execution for Users based on command type and the command line options. */
protected void handleUserCommand() {
String url = getUrl();
String auth = getAuth();
String userName = line.getOptionValue(GravitinoOptions.LOGIN);
FullName name = new FullName(line);
String metalake = name.getMetalakeName();
String user = line.getOptionValue(GravitinoOptions.USER);

Command.setAuthenticationMode(auth, userName);

if (user == null && !CommandActions.LIST.equals(command)) {
System.err.println(ErrorMessages.MISSING_USER);
Main.exit(-1);
}

switch (command) {
case CommandActions.DETAILS:
if (line.hasOption(GravitinoOptions.AUDIT)) {
newUserAudit(url, ignore, metalake, user).validate().handle();
} else {
newUserDetails(url, ignore, metalake, user).validate().handle();
}
break;

case CommandActions.LIST:
newListUsers(url, ignore, metalake).validate().handle();
break;

case CommandActions.CREATE:
newCreateUser(url, ignore, metalake, user).validate().handle();
break;

case CommandActions.DELETE:
boolean force = line.hasOption(GravitinoOptions.FORCE);
newDeleteUser(url, ignore, force, metalake, user).validate().handle();
break;

case CommandActions.REVOKE:
String[] revokeRoles = line.getOptionValues(GravitinoOptions.ROLE);
for (String role : revokeRoles) {
newRemoveRoleFromUser(url, ignore, metalake, user, role).validate().handle();
}
System.out.printf("Remove roles %s from user %s%n", COMMA_JOINER.join(revokeRoles), user);
break;

case CommandActions.GRANT:
String[] grantRoles = line.getOptionValues(GravitinoOptions.ROLE);
for (String role : grantRoles) {
newAddRoleToUser(url, ignore, metalake, user, role).validate().handle();
}
System.out.printf("Grant roles %s to user %s%n", COMMA_JOINER.join(grantRoles), user);
break;

default:
System.err.println(ErrorMessages.UNSUPPORTED_COMMAND);
Main.exit(-1);
break;
}
}

/** Handles the command execution for Tags based on command type and the command line options. */
protected void handleTagCommand() {
String url = getUrl();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
/*
* 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.cli;

import java.util.Arrays;
import org.apache.commons.cli.CommandLine;
import org.apache.gravitino.cli.commands.Command;

public class TagCommandHandler extends CommandHandler {
private final GravitinoCommandLine gravitinoCommandLine;
private final CommandLine line;
private final String command;
private final boolean ignore;
private final String url;
private final String[] tags;
private String metalake;

public TagCommandHandler(
GravitinoCommandLine gravitinoCommandLine, CommandLine line, String command, boolean ignore) {
this.gravitinoCommandLine = gravitinoCommandLine;
this.line = line;
this.command = command;
this.ignore = ignore;
this.url = getUrl(line);
String[] tagFromCommandLine = line.getOptionValues(GravitinoOptions.TAG);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not call this tags? Why did you change the name?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's same question as above #6192 (comment). 😺

this.tags =
tagFromCommandLine == null
? null
: Arrays.stream(tagFromCommandLine).distinct().toArray(String[]::new);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is more complex and harder to understand than the original code - why change it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I want to keep the final keyword and provide some protection from accident changing reference.
It just my personal taste.
WDYT ?


@Override
public void handle() {
String userName = line.getOptionValue(GravitinoOptions.LOGIN);
FullName name = new FullName(line);
Command.setAuthenticationMode(getAuth(line), userName);

metalake = name.getMetalakeName();

if (!executeCommand()) {
System.err.println(ErrorMessages.UNSUPPORTED_COMMAND);
Main.exit(-1);
}
}

/**
* Executes the specific command based on the command type.
*
* @return true if the command is supported, false otherwise
*/
private boolean executeCommand() {
switch (command) {
case CommandActions.DETAILS:
handleDetailsCommand();
return true;

case CommandActions.LIST:
handleListCommand();
return true;

case CommandActions.CREATE:
handleCreateCommand();
return true;

case CommandActions.DELETE:
handleDeleteCommand();
return true;

case CommandActions.SET:
handleSetCommand();
return true;

case CommandActions.REMOVE:
handleRemoveCommand();
return true;

case CommandActions.PROPERTIES:
handlePropertiesCommand();
return true;

case CommandActions.UPDATE:
handleUpdateCommand();
return true;

default:
return false;
}
}

/** Handles the "LIST" command. */
private void handleListCommand() {
FullName name = new FullName(line);
if (!name.hasCatalogName()) {
gravitinoCommandLine.newListTags(url, ignore, metalake).validate().handle();
} else {
gravitinoCommandLine.newListEntityTags(url, ignore, metalake, name).validate().handle();
}
}

/** Handles the "DETAILS" command. */
private void handleDetailsCommand() {
gravitinoCommandLine.newTagDetails(url, ignore, metalake, getOneTag(tags)).validate().handle();
}

/** Handles the "CREATE" command. */
private void handleCreateCommand() {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
gravitinoCommandLine.newCreateTags(url, ignore, metalake, tags, comment).validate().handle();
}

/** Handles the "DELETE" command. */
private void handleDeleteCommand() {
boolean forceDelete = line.hasOption(GravitinoOptions.FORCE);
gravitinoCommandLine.newDeleteTag(url, ignore, forceDelete, metalake, tags).validate().handle();
}

/** Handles the "SET" command. */
private void handleSetCommand() {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
String value = line.getOptionValue(GravitinoOptions.VALUE);
if (property == null && value == null) {
gravitinoCommandLine
.newTagEntity(url, ignore, metalake, new FullName(line), tags)
.validate()
.handle();
} else {
gravitinoCommandLine
.newSetTagProperty(url, ignore, metalake, getOneTag(tags), property, value)
.validate()
.handle();
}
}

/** Handles the "REMOVE" command. */
private void handleRemoveCommand() {
boolean isTag = line.hasOption(GravitinoOptions.TAG);
FullName name = new FullName(line);
if (!isTag) {
boolean forceRemove = line.hasOption(GravitinoOptions.FORCE);
gravitinoCommandLine
.newRemoveAllTags(url, ignore, metalake, name, forceRemove)
.validate()
.handle();
} else {
String propertyRemove = line.getOptionValue(GravitinoOptions.PROPERTY);
if (propertyRemove != null) {
gravitinoCommandLine
.newRemoveTagProperty(url, ignore, metalake, getOneTag(tags), propertyRemove)
.validate()
.handle();
} else {
gravitinoCommandLine.newUntagEntity(url, ignore, metalake, name, tags).validate().handle();
}
}
}

/** Handles the "PROPERTIES" command. */
private void handlePropertiesCommand() {
gravitinoCommandLine
.newListTagProperties(url, ignore, metalake, getOneTag(tags))
.validate()
.handle();
}

/** Handles the "UPDATE" command. */
private void handleUpdateCommand() {

if (line.hasOption(GravitinoOptions.COMMENT)) {
String updateComment = line.getOptionValue(GravitinoOptions.COMMENT);
gravitinoCommandLine
.newUpdateTagComment(url, ignore, metalake, getOneTag(tags), updateComment)
.validate()
.handle();
}
if (line.hasOption(GravitinoOptions.RENAME)) {
String newName = line.getOptionValue(GravitinoOptions.RENAME);
gravitinoCommandLine
.newUpdateTagName(url, ignore, metalake, getOneTag(tags), newName)
.validate()
.handle();
}
}

private String getOneTag(String[] tags) {
if (tags == null || tags.length > 1) {
System.err.println(ErrorMessages.MULTIPLE_TAG_COMMAND_ERROR);
Main.exit(-1);
}
return tags[0];
}
}
Loading