From 5dbca9a004a823644717f8482ca4af62f0f04dc2 Mon Sep 17 00:00:00 2001 From: Joshua Barr Date: Fri, 1 Nov 2024 13:53:46 -0700 Subject: [PATCH 1/3] Simplify ion-java-cli OutputFormat --- .../com/amazon/tools/cli/OutputFormat.java | 114 +++++++----------- 1 file changed, 41 insertions(+), 73 deletions(-) diff --git a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java index 15a658fcd3..948e55d252 100644 --- a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java +++ b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java @@ -4,85 +4,53 @@ import com.amazon.ion.SymbolTable; import com.amazon.ion.system.IonBinaryWriterBuilder; import com.amazon.ion.system.IonTextWriterBuilder; +import com.amazon.ion.system.IonWriterBuilder; import java.io.OutputStream; +import java.util.function.Function; +import java.util.function.Supplier; /** * Represents the different Ion output formats supported by the command line com.amazon.tools in this package. */ public enum OutputFormat { - /** - * Nicely spaced, 'prettified' text Ion. - */ - PRETTY { - @Override - public IonWriter createIonWriter(OutputStream outputStream) { - return IonTextWriterBuilder.pretty().build(outputStream); - } - - @Override - public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) { - return IonTextWriterBuilder.pretty().withImports(imports).build(outputStream); - } - }, - /** - * Minimally spaced text Ion. - */ - TEXT { - @Override - public IonWriter createIonWriter(OutputStream outputStream) { - return IonTextWriterBuilder.standard().build(outputStream); - } - - @Override - public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) { - return IonTextWriterBuilder.standard().withImports(imports).build(outputStream); - } - }, - /** - * Compact, read-optimized binary Ion. - */ - BINARY { - @Override - public IonWriter createIonWriter(OutputStream outputStream) { - return IonBinaryWriterBuilder.standard().build(outputStream); - } - - @Override - public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) { - return IonBinaryWriterBuilder.standard().withImports(imports).build(outputStream); - } - }, - /** - * Event Stream - */ - EVENTS { - @Override - public IonWriter createIonWriter(OutputStream outputStream) { - return IonTextWriterBuilder.pretty().build(outputStream); - } - - @Override - public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) { - return IonTextWriterBuilder.pretty().withImports(imports).build(outputStream); - } - }, - /** - * None - */ - NONE { - @Override - public IonWriter createIonWriter(OutputStream outputStream) { - NoOpOutputStream out = new NoOpOutputStream(); - return IonTextWriterBuilder.pretty().build(out); - } - - @Override - public IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] imports) { - return IonTextWriterBuilder.pretty().withImports(imports).build(outputStream); - } - }; + /** Nicely spaced, 'prettified' text Ion */ + PRETTY(IonTextWriterBuilder::pretty), + /** Minimally spaced text Ion */ + TEXT(IonTextWriterBuilder::standard), + /** Compact, read-optimized binary Ion */ + BINARY(IonBinaryWriterBuilder::standard), + /** Event Stream */ + EVENTS(IonTextWriterBuilder::pretty), + /** No output, /dev/null */ + NONE(IonTextWriterBuilder::standard, o -> new NoOpOutputStream()); + + OutputFormat(Supplier supplier) { + this(supplier, o -> o); + } + + OutputFormat(Supplier supplier, Function function) { + this.writerBuilderSupplier = supplier; + this.outputTransformer = function; + } + + IonWriter createIonWriter(OutputStream outputStream) { + return writerBuilderSupplier.get().build(outputTransformer.apply(outputStream)); + } + + IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable) { + IonWriterBuilder builder = writerBuilderSupplier.get(); + OutputStream out = outputTransformer.apply(outputStream); + if (builder instanceof IonTextWriterBuilder) { + return ((IonTextWriterBuilder)builder).withImports(symbolTable).build(out); + } else if (builder instanceof IonBinaryWriterBuilder) { + return ((IonBinaryWriterBuilder)builder).withImports(symbolTable).build(out); + } else { + throw new IllegalStateException("This is impossible, none of the enums can do this"); + } + } + + private final Supplier writerBuilderSupplier; + private final Function outputTransformer; - abstract IonWriter createIonWriter(OutputStream outputStream); - abstract IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable); } From 61b5f5215033e2c7ef07f6c392b8526024b4bab6 Mon Sep 17 00:00:00 2001 From: Joshua Barr Date: Thu, 12 Dec 2024 09:45:38 -0800 Subject: [PATCH 2/3] Clarify unreachable statement message --- .../src/main/java/com/amazon/tools/cli/OutputFormat.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java index 948e55d252..d9a975bedb 100644 --- a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java +++ b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java @@ -46,11 +46,10 @@ IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] sy } else if (builder instanceof IonBinaryWriterBuilder) { return ((IonBinaryWriterBuilder)builder).withImports(symbolTable).build(out); } else { - throw new IllegalStateException("This is impossible, none of the enums can do this"); + throw new IllegalStateException("Unreachable, the created IonWriterBuilders must be either binary or text"); } } private final Supplier writerBuilderSupplier; private final Function outputTransformer; - } From f075880e5e0ea90b020aee97c1b13840f3ba9f0d Mon Sep 17 00:00:00 2001 From: Joshua Barr Date: Thu, 12 Dec 2024 10:00:10 -0800 Subject: [PATCH 3/3] Private static factories instead of functions --- .../com/amazon/tools/cli/OutputFormat.java | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java index d9a975bedb..ab1882934c 100644 --- a/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java +++ b/ion-java-cli/src/main/java/com/amazon/tools/cli/OutputFormat.java @@ -4,52 +4,46 @@ import com.amazon.ion.SymbolTable; import com.amazon.ion.system.IonBinaryWriterBuilder; import com.amazon.ion.system.IonTextWriterBuilder; -import com.amazon.ion.system.IonWriterBuilder; import java.io.OutputStream; -import java.util.function.Function; -import java.util.function.Supplier; /** * Represents the different Ion output formats supported by the command line com.amazon.tools in this package. */ public enum OutputFormat { - /** Nicely spaced, 'prettified' text Ion */ - PRETTY(IonTextWriterBuilder::pretty), - /** Minimally spaced text Ion */ - TEXT(IonTextWriterBuilder::standard), - /** Compact, read-optimized binary Ion */ - BINARY(IonBinaryWriterBuilder::standard), - /** Event Stream */ - EVENTS(IonTextWriterBuilder::pretty), - /** No output, /dev/null */ - NONE(IonTextWriterBuilder::standard, o -> new NoOpOutputStream()); + /** Nicely spaced, 'prettified' text Ion */ PRETTY, + /** Minimally spaced text Ion */ TEXT, + /** Compact, read-optimized binary Ion */ BINARY, + /** Event Stream */ EVENTS, + /** No output, /dev/null */ NONE; - OutputFormat(Supplier supplier) { - this(supplier, o -> o); + IonWriter createIonWriter(OutputStream outputStream) { + return createIonWriter(this, outputStream); } - OutputFormat(Supplier supplier, Function function) { - this.writerBuilderSupplier = supplier; - this.outputTransformer = function; + IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable) { + return createIonWriter(this, outputStream, symbolTable); } - IonWriter createIonWriter(OutputStream outputStream) { - return writerBuilderSupplier.get().build(outputTransformer.apply(outputStream)); + private static IonWriter createIonWriter(OutputFormat format, OutputStream outputStream) { + switch (format) { + case TEXT: return IonTextWriterBuilder.standard().build(outputStream); + case PRETTY: return IonTextWriterBuilder.pretty().build(outputStream); + case EVENTS: return IonTextWriterBuilder.pretty().build(outputStream); + case BINARY: return IonBinaryWriterBuilder.standard().build(outputStream); + case NONE: return IonTextWriterBuilder.standard().build(new NoOpOutputStream()); + default: throw new IllegalStateException("Unsupported output format: " + format); + } } - IonWriter createIonWriterWithImports(OutputStream outputStream, SymbolTable[] symbolTable) { - IonWriterBuilder builder = writerBuilderSupplier.get(); - OutputStream out = outputTransformer.apply(outputStream); - if (builder instanceof IonTextWriterBuilder) { - return ((IonTextWriterBuilder)builder).withImports(symbolTable).build(out); - } else if (builder instanceof IonBinaryWriterBuilder) { - return ((IonBinaryWriterBuilder)builder).withImports(symbolTable).build(out); - } else { - throw new IllegalStateException("Unreachable, the created IonWriterBuilders must be either binary or text"); + private static IonWriter createIonWriter(OutputFormat format, OutputStream out, SymbolTable... symbols) { + switch (format) { + case TEXT: return IonTextWriterBuilder.standard().withImports(symbols).build(out); + case PRETTY: return IonTextWriterBuilder.pretty().withImports(symbols).build(out); + case EVENTS: return IonTextWriterBuilder.pretty().withImports(symbols).build(out); + case BINARY: return IonBinaryWriterBuilder.standard().withImports(symbols).build(out); + case NONE: return IonTextWriterBuilder.standard().withImports(symbols).build(new NoOpOutputStream()); + default: throw new IllegalStateException("Unsupported output format: " + format); } } - - private final Supplier writerBuilderSupplier; - private final Function outputTransformer; }