diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java index 1e376b8be49..0df9eab82ab 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java @@ -220,7 +220,7 @@ private void handleCatalogCommand() { Command.setAuthenticationMode(auth, userName); if (CommandActions.LIST.equals(command)) { - newListCatalogs(url, ignore, metalake).handle(); + newListCatalogs(url, ignore, outputFormat, metalake).handle(); return; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java index 71457a1269b..c4e1f5fe5b6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/TestableCommandLine.java @@ -197,8 +197,9 @@ protected CatalogDetails newCatalogDetails( return new CatalogDetails(url, ignore, outputFormat, metalake, catalog); } - protected ListCatalogs newListCatalogs(String url, boolean ignore, String metalake) { - return new ListCatalogs(url, ignore, metalake); + protected ListCatalogs newListCatalogs( + String url, boolean ignore, String outputFormat, String metalake) { + return new ListCatalogs(url, ignore, outputFormat, metalake); } protected CreateCatalog newCreateCatalog( diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java index 6925b832846..eaff355e891 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java @@ -19,7 +19,7 @@ package org.apache.gravitino.cli.commands; -import com.google.common.base.Joiner; +import org.apache.gravitino.Catalog; import org.apache.gravitino.cli.ErrorMessages; import org.apache.gravitino.client.GravitinoClient; import org.apache.gravitino.exceptions.NoSuchMetalakeException; @@ -34,30 +34,26 @@ public class ListCatalogs extends Command { * * @param url The URL of the Gravitino server. * @param ignoreVersions If true don't check the client/server versions match. + * @param outputFormat The output format. * @param metalake The name of the metalake. */ - public ListCatalogs(String url, boolean ignoreVersions, String metalake) { - super(url, ignoreVersions); + public ListCatalogs(String url, boolean ignoreVersions, String outputFormat, String metalake) { + super(url, ignoreVersions, outputFormat); this.metalake = metalake; } /** Lists all catalogs in a metalake. */ @Override public void handle() { - String[] catalogs = new String[0]; + Catalog[] catalogs; try { GravitinoClient client = buildClient(metalake); - catalogs = client.listCatalogs(); + catalogs = client.listCatalogsInfo(); + output(catalogs); } catch (NoSuchMetalakeException err) { System.err.println(ErrorMessages.UNKNOWN_METALAKE); - return; } catch (Exception exp) { System.err.println(exp.getMessage()); - return; } - - String all = Joiner.on(",").join(catalogs); - - System.out.println(all.toString()); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java index 4674d3f8873..6160634db90 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/PlainFormat.java @@ -28,24 +28,26 @@ public class PlainFormat { public static void output(Object object) { if (object instanceof Metalake) { - new MetalakeStringFormat().output((Metalake) object); + new MetalakePlainFormat().output((Metalake) object); } else if (object instanceof Metalake[]) { - new MetalakesStringFormat().output((Metalake[]) object); + new MetalakesPlainFormat().output((Metalake[]) object); } else if (object instanceof Catalog) { - new CatalogStringFormat().output((Catalog) object); + new CatalogPlainFormat().output((Catalog) object); + } else if (object instanceof Catalog[]) { + new CatalogsPlainFormat().output((Catalog[]) object); } else { throw new IllegalArgumentException("Unsupported object type"); } } - static final class MetalakeStringFormat implements OutputFormat { + static final class MetalakePlainFormat implements OutputFormat { @Override public void output(Metalake metalake) { System.out.println(metalake.name() + "," + metalake.comment()); } } - static final class MetalakesStringFormat implements OutputFormat { + static final class MetalakesPlainFormat implements OutputFormat { @Override public void output(Metalake[] metalakes) { List metalakeNames = @@ -55,7 +57,7 @@ public void output(Metalake[] metalakes) { } } - static final class CatalogStringFormat implements OutputFormat { + static final class CatalogPlainFormat implements OutputFormat { @Override public void output(Catalog catalog) { System.out.println( @@ -68,4 +70,14 @@ public void output(Catalog catalog) { + catalog.comment()); } } + + static final class CatalogsPlainFormat implements OutputFormat { + @Override + public void output(Catalog[] catalogs) { + List catalogNames = + Arrays.stream(catalogs).map(Catalog::name).collect(Collectors.toList()); + String all = String.join(System.lineSeparator(), catalogNames); + System.out.println(all); + } + } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java index 8744467b93b..6946ad13067 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java @@ -35,6 +35,8 @@ public static void output(Object object) { new MetalakesTableFormat().output((Metalake[]) object); } else if (object instanceof Catalog) { new CatalogTableFormat().output((Catalog) object); + } else if (object instanceof Catalog[]) { + new CatalogsTableFormat().output((Catalog[]) object); } else { throw new IllegalArgumentException("Unsupported object type"); } @@ -80,6 +82,19 @@ public void output(Catalog catalog) { } } + static final class CatalogsTableFormat implements OutputFormat { + @Override + public void output(Catalog[] catalogs) { + List headers = Collections.singletonList("catalog"); + List> rows = new ArrayList<>(); + for (int i = 0; i < catalogs.length; i++) { + rows.add(Arrays.asList(catalogs[i].name())); + } + TableFormatImpl tableFormat = new TableFormatImpl(); + tableFormat.print(headers, rows); + } + } + static final class TableFormatImpl { private int[] maxElementLengths; // This expression is primarily used to match characters that have a display width of diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java index 10c25f8f898..eb8bc46d38e 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCatalogCommands.java @@ -62,7 +62,7 @@ void testListCatalogsCommand() { mockCommandLine, mockOptions, CommandEntities.CATALOG, CommandActions.LIST)); doReturn(mockList) .when(commandLine) - .newListCatalogs(GravitinoCommandLine.DEFAULT_URL, false, "metalake_demo"); + .newListCatalogs(GravitinoCommandLine.DEFAULT_URL, false, null, "metalake_demo"); commandLine.handleCommandLine(); verify(mockList).handle(); } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java index 89034d64243..f23d0284fb2 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java @@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets; import org.apache.gravitino.cli.GravitinoOptions; import org.apache.gravitino.cli.Main; +import org.apache.gravitino.cli.commands.Command; import org.apache.gravitino.integration.test.util.BaseIT; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -93,7 +94,7 @@ public void testMetalakeListCommand() { "metalake", "list", commandArg(GravitinoOptions.OUTPUT), - "table", + Command.OUTPUT_FORMAT_TABLE, commandArg(GravitinoOptions.URL), gravitinoUrl }; @@ -125,7 +126,7 @@ public void testMetalakeDetailsCommand() { commandArg(GravitinoOptions.METALAKE), "my_metalake", commandArg(GravitinoOptions.OUTPUT), - "table", + Command.OUTPUT_FORMAT_TABLE, commandArg(GravitinoOptions.URL), gravitinoUrl }; @@ -144,6 +145,39 @@ public void testMetalakeDetailsCommand() { output); } + @Test + public void testCatalogListCommand() { + // Create a byte array output stream to capture the output of the command + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStream)); + + String[] args = { + "catalog", + "list", + commandArg(GravitinoOptions.METALAKE), + "my_metalake", + commandArg(GravitinoOptions.OUTPUT), + Command.OUTPUT_FORMAT_TABLE, + commandArg(GravitinoOptions.URL), + gravitinoUrl + }; + Main.main(args); + + // Restore the original System.out + System.setOut(originalOut); + // Get the output and verify it + String output = new String(outputStream.toByteArray(), StandardCharsets.UTF_8).trim(); + assertEquals( + "+-----------+\n" + + "| catalog |\n" + + "+-----------+\n" + + "| postgres |\n" + + "| postgres2 |\n" + + "+-----------+", + output); + } + @Test public void testCatalogDetailsCommand() { // Create a byte array output stream to capture the output of the command