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..a78452cbd33 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,30 @@ 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, "create time"); + Column columnModified = new Column(context, "modified"); + Column columnModifyTime = new Column(context, "modify time"); + + columnCreator.addCell(audit.creator()); + columnCreateTime.addCell(audit.createTime()); + columnModified.addCell(audit.lastModifier()); + columnModifyTime.addCell(audit.lastModifiedTime()); + + 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..d561fb692ee 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,21 @@ void testListTableWithTableFormat() { output); } + @Test + void testAuditWithTableFormat() { + CommandContext mockContext = getMockContext(); + Audit mockAudit = getMockAudit(); + TableFormat.output(mockAudit, mockContext); + String output = new String(outContent.toByteArray(), StandardCharsets.UTF_8).trim(); + Assertions.assertEquals( + "+-----------+--------------------------+-----------+--------------------------+\n" + + "| Creator | Create time | Modified | Modify time |\n" + + "+-----------+--------------------------+-----------+--------------------------+\n" + + "| demo_user | 2021-01-20T02:51:51.111Z | demo_user | 2021-01-20T02:51:51.111Z |\n" + + "+-----------+--------------------------+-----------+--------------------------+", + output); + } + @Test void testOutputWithUnsupportType() { CommandContext mockContext = getMockContext(); @@ -461,4 +478,14 @@ private org.apache.gravitino.rel.Column getMockColumn( return mockColumn; } + + private Audit getMockAudit() { + 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)); + + return mockAudit; + } }