diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java index 951ad33cc0a..91477d2a20f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java @@ -39,17 +39,10 @@ public void handle() {} * @param audit from a class that implements the Auditable interface. */ public void displayAuditInfo(Audit audit) { - String auditInfo = - "creator,create_time,modified,modified_time" - + System.lineSeparator() - + audit.creator() - + "," - + audit.createTime() - + "," - + audit.lastModifier() - + "," - + audit.lastModifiedTime(); + if (audit == null) { + return; + } - printResults(auditInfo); + printResults(audit); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java index 6600e1d4291..b46dc50ada8 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java @@ -59,8 +59,6 @@ public void handle() { exitWithError(exp.getMessage()); } - if (result != null) { - displayAuditInfo(result.auditInfo()); - } + displayAuditInfo(result.auditInfo()); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java index 17a0c31e452..db01ed437b6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java @@ -66,8 +66,6 @@ public void handle() { exitWithError(exp.getMessage()); } - if (result != null) { - displayAuditInfo(result.auditInfo()); - } + displayAuditInfo(result.auditInfo()); } } 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 e5021d62f3b..7b0e6a90eb4 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 @@ -45,6 +45,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; +import org.apache.gravitino.Audit; import org.apache.gravitino.Catalog; import org.apache.gravitino.Metalake; import org.apache.gravitino.Schema; @@ -85,6 +86,8 @@ public static void output(Object entity, CommandContext context) { new TableDetailsTableFormat(context).output((Table) entity); } else if (entity instanceof Table[]) { new TableListTableFormat(context).output((Table[]) entity); + } else if (entity instanceof Audit) { + new AuditTableFormat(context).output((Audit) entity); } else { throw new IllegalArgumentException("Unsupported object type"); } @@ -643,4 +646,31 @@ public String getOutput(Table[] tables) { return getTableFormat(column); } } + + /** + * Formats a single {@link Audit} instance into a four-column table display. Displays audit + * details, including creator, create time, modified, and modify time. + */ + static final class AuditTableFormat extends TableFormat { + public AuditTableFormat(CommandContext context) { + super(context); + } + + /** {@inheritDoc} */ + @Override + public String getOutput(Audit audit) { + Column columnCreator = new Column(context, "creator"); + Column columnCreateTime = new Column(context, "creation at"); + Column columnModified = new Column(context, "modifier"); + Column columnModifyTime = new Column(context, "modified at"); + + columnCreator.addCell(audit.creator()); + columnCreateTime.addCell(audit.createTime() == null ? "N/A" : audit.createTime().toString()); + columnModified.addCell(audit.lastModifier() == null ? "N/A" : audit.lastModifier()); + columnModifyTime.addCell( + audit.lastModifiedTime() == null ? "N/A" : audit.lastModifiedTime().toString()); + + return getTableFormat(columnCreator, columnCreateTime, columnModified, columnModifyTime); + } + } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java b/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java index 60e9a50eea7..d1210055c3f 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/output/TestTableFormat.java @@ -26,6 +26,8 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; +import java.time.Instant; +import org.apache.gravitino.Audit; import org.apache.gravitino.Catalog; import org.apache.gravitino.Metalake; import org.apache.gravitino.Schema; @@ -373,6 +375,48 @@ void testListTableWithTableFormat() { output); } + @Test + void testAuditWithTableFormat() { + CommandContext mockContext = getMockContext(); + Audit mockAudit = mock(Audit.class); + when(mockAudit.creator()).thenReturn("demo_user"); + when(mockAudit.createTime()).thenReturn(Instant.ofEpochMilli(1611111111111L)); + when(mockAudit.lastModifier()).thenReturn("demo_user"); + when(mockAudit.lastModifiedTime()).thenReturn(Instant.ofEpochMilli(1611111111111L)); + + TableFormat.output(mockAudit, mockContext); + + String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); + Assertions.assertEquals( + "+-----------+--------------------------+-----------+--------------------------+\n" + + "| Creator | Creation at | Modifier | Modified at |\n" + + "+-----------+--------------------------+-----------+--------------------------+\n" + + "| demo_user | 2021-01-20T02:51:51.111Z | demo_user | 2021-01-20T02:51:51.111Z |\n" + + "+-----------+--------------------------+-----------+--------------------------+", + output); + } + + @Test + void testAuditWithTableFormatWithNullValues() { + CommandContext mockContext = getMockContext(); + Audit mockAudit = mock(Audit.class); + when(mockAudit.creator()).thenReturn("demo_user"); + when(mockAudit.createTime()).thenReturn(null); + when(mockAudit.lastModifier()).thenReturn(null); + when(mockAudit.lastModifiedTime()).thenReturn(null); + + TableFormat.output(mockAudit, mockContext); + + String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); + Assertions.assertEquals( + "+-----------+-------------+----------+-------------+\n" + + "| Creator | Creation at | Modifier | Modified at |\n" + + "+-----------+-------------+----------+-------------+\n" + + "| demo_user | N/A | N/A | N/A |\n" + + "+-----------+-------------+----------+-------------+", + output); + } + @Test void testOutputWithUnsupportType() { CommandContext mockContext = getMockContext();