From 3cda9017c95105f766dfba9950d499d208c085fc Mon Sep 17 00:00:00 2001 From: Patrick Favre-Bulle Date: Sat, 19 Aug 2017 00:11:17 +0200 Subject: [PATCH] Add description for encodings and encoding list --- CHANGELOG | 1 + .../java/at/favre/tools/dice/RndTool.java | 25 +++++++++--------- .../favre/tools/dice/encode/AByteEncoder.java | 8 ++++++ .../at/favre/tools/dice/encode/AEncoder.java | 9 +++++-- .../tools/dice/encode/AlphabetEncoder.java | 5 ++++ .../tools/dice/encode/Ascii85Encoder.java | 2 +- .../tools/dice/encode/Base16Encoder.java | 7 ++++- .../tools/dice/encode/Base32Encoder.java | 7 ++++- .../tools/dice/encode/Base64Encoder.java | 7 ++++- .../tools/dice/encode/BinaryEncoder.java | 7 ++++- .../tools/dice/encode/DecimalByteEncoder.java | 2 +- .../at/favre/tools/dice/encode/Encoder.java | 15 +++++++++++ .../{Loader.java => EncoderHandler.java} | 26 ++++++++++++++++++- .../at/favre/tools/dice/ui/CLIParser.java | 3 ++- ...oaderTest.java => EncoderHandlerTest.java} | 4 +-- 15 files changed, 104 insertions(+), 24 deletions(-) create mode 100644 src/main/java/at/favre/tools/dice/encode/AByteEncoder.java rename src/main/java/at/favre/tools/dice/encode/{Loader.java => EncoderHandler.java} (60%) rename src/test/java/at/favre/tools/dice/encode/{LoaderTest.java => EncoderHandlerTest.java} (86%) diff --git a/CHANGELOG b/CHANGELOG index 4747b8c..343e15b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ * add proguard * add column output * add url encode flag +* add list of encodings ## v0.2.0 * add external seeding with random.org diff --git a/src/main/java/at/favre/tools/dice/RndTool.java b/src/main/java/at/favre/tools/dice/RndTool.java index 330d7a1..a794474 100644 --- a/src/main/java/at/favre/tools/dice/RndTool.java +++ b/src/main/java/at/favre/tools/dice/RndTool.java @@ -2,7 +2,7 @@ import at.favre.tools.dice.encode.Base32Encoder; import at.favre.tools.dice.encode.Encoder; -import at.favre.tools.dice.encode.Loader; +import at.favre.tools.dice.encode.EncoderHandler; import at.favre.tools.dice.service.RandomOrgServiceHandler; import at.favre.tools.dice.ui.Arg; import at.favre.tools.dice.ui.CLIParser; @@ -13,7 +13,6 @@ import java.nio.charset.StandardCharsets; import java.security.SecureRandom; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class RndTool { @@ -29,8 +28,16 @@ public static void main(String[] args) { } static boolean execute(Arg arguments) { - Loader loader = new Loader(); - List encoders = loader.load(); + EncoderHandler loader = new EncoderHandler(); + loader.load(); + + Encoder encoder = loader.findByName(arguments.encoding); + + if (encoder == null) { + System.err.println("Given encoder '" + arguments.encoding + "' is not available."); + System.err.println("\nAvailable encoders:\n\n" + loader.returnRegistryInfo()); + System.exit(2); + } SecureRandom secureRandom = new SecureRandom(); if (arguments.urlencode) { @@ -58,14 +65,8 @@ static boolean execute(Arg arguments) { System.out.println(); - for (Encoder encoder : encoders) { - if (Arrays.asList(encoder.names()).contains(arguments.encoding)) { - printRandoms(arguments, encoder, secureRandom); - return true; - } - } - - return false; + printRandoms(arguments, encoder, secureRandom); + return true; } private static void printRandoms(Arg arguments, Encoder encoder, SecureRandom secureRandom) { diff --git a/src/main/java/at/favre/tools/dice/encode/AByteEncoder.java b/src/main/java/at/favre/tools/dice/encode/AByteEncoder.java new file mode 100644 index 0000000..d4031ea --- /dev/null +++ b/src/main/java/at/favre/tools/dice/encode/AByteEncoder.java @@ -0,0 +1,8 @@ +package at.favre.tools.dice.encode; + +abstract class AByteEncoder implements Encoder { + @Override + public String getDescription() { + return ""; + } +} diff --git a/src/main/java/at/favre/tools/dice/encode/AEncoder.java b/src/main/java/at/favre/tools/dice/encode/AEncoder.java index c42be8b..da7f1b5 100644 --- a/src/main/java/at/favre/tools/dice/encode/AEncoder.java +++ b/src/main/java/at/favre/tools/dice/encode/AEncoder.java @@ -1,8 +1,8 @@ package at.favre.tools.dice.encode; -public abstract class AEncoder implements Encoder { +abstract class AEncoder implements Encoder { - public String encodeInternal(byte[] array, String prefix, String postfix, String sep, ByteEncoder byteEncoder) { + String encodeInternal(byte[] array, String prefix, String postfix, String sep, ByteEncoder byteEncoder) { StringBuilder sb = new StringBuilder(prefix); for (int i = 0; i < array.length; i++) { sb.append(byteEncoder.encodeByte(array[i])).append(sep).append(" "); @@ -12,6 +12,11 @@ public String encodeInternal(byte[] array, String prefix, String postfix, String return sb.toString(); } + @Override + public String getDescription() { + return ""; + } + interface ByteEncoder { String encodeByte(byte b); } diff --git a/src/main/java/at/favre/tools/dice/encode/AlphabetEncoder.java b/src/main/java/at/favre/tools/dice/encode/AlphabetEncoder.java index 5aed791..f4cf5d2 100644 --- a/src/main/java/at/favre/tools/dice/encode/AlphabetEncoder.java +++ b/src/main/java/at/favre/tools/dice/encode/AlphabetEncoder.java @@ -19,4 +19,9 @@ public String encode(byte[] array) { } return sb.toString(); } + + @Override + public String getDescription() { + return ""; + } } diff --git a/src/main/java/at/favre/tools/dice/encode/Ascii85Encoder.java b/src/main/java/at/favre/tools/dice/encode/Ascii85Encoder.java index e30438e..8ea7ac9 100644 --- a/src/main/java/at/favre/tools/dice/encode/Ascii85Encoder.java +++ b/src/main/java/at/favre/tools/dice/encode/Ascii85Encoder.java @@ -7,7 +7,7 @@ * * See https://github.com/fzakaria/ascii85 */ -public class Ascii85Encoder implements Encoder { +public class Ascii85Encoder extends AByteEncoder { @Override public String encode(byte[] array) { diff --git a/src/main/java/at/favre/tools/dice/encode/Base16Encoder.java b/src/main/java/at/favre/tools/dice/encode/Base16Encoder.java index 7a45b4c..405c642 100644 --- a/src/main/java/at/favre/tools/dice/encode/Base16Encoder.java +++ b/src/main/java/at/favre/tools/dice/encode/Base16Encoder.java @@ -6,7 +6,7 @@ /** * Encodes in to base16 (ie. hex) e.g. 6e33a8f4c9f69e91 */ -public class Base16Encoder implements Encoder { +public class Base16Encoder extends AByteEncoder { private boolean lowerCase; public Base16Encoder() { @@ -26,4 +26,9 @@ public String encode(byte[] array) { public String[] names() { return new String[]{"base16", Arg.DEFAULT_ENCODING}; } + + @Override + public String getDescription() { + return "Hex or Base16 encoding (lowercase) e.g 6e33a8f4c"; + } } diff --git a/src/main/java/at/favre/tools/dice/encode/Base32Encoder.java b/src/main/java/at/favre/tools/dice/encode/Base32Encoder.java index 40df7e9..5613d5b 100644 --- a/src/main/java/at/favre/tools/dice/encode/Base32Encoder.java +++ b/src/main/java/at/favre/tools/dice/encode/Base32Encoder.java @@ -5,7 +5,7 @@ /** * Encodes in to base32 e.g. NHSMJ5VH6P5QRAT4EXAP2BDZ5Q */ -public class Base32Encoder implements Encoder { +public class Base32Encoder extends AByteEncoder { @Override public String encode(byte[] array) { @@ -16,4 +16,9 @@ public String encode(byte[] array) { public String[] names() { return new String[]{"base32"}; } + + @Override + public String getDescription() { + return "Base32 encoding without padding e.g NHSMJ5VH6P5QRAT4EXAP2BDZ5Q"; + } } diff --git a/src/main/java/at/favre/tools/dice/encode/Base64Encoder.java b/src/main/java/at/favre/tools/dice/encode/Base64Encoder.java index 041fa4e..72be780 100644 --- a/src/main/java/at/favre/tools/dice/encode/Base64Encoder.java +++ b/src/main/java/at/favre/tools/dice/encode/Base64Encoder.java @@ -5,7 +5,7 @@ /** * Encodes in to base64 e.g. NUZDT6c7SOxz0YgRw3JGqc+BKnJM3fuH */ -public class Base64Encoder implements Encoder { +public class Base64Encoder extends AByteEncoder { @Override public String encode(byte[] array) { @@ -16,4 +16,9 @@ public String encode(byte[] array) { public String[] names() { return new String[]{"base64"}; } + + @Override + public String getDescription() { + return "Base64 encoding without padding e.g NUZDT6c7SOxz0YgRw3JGqc+BKnJM3fuH"; + } } diff --git a/src/main/java/at/favre/tools/dice/encode/BinaryEncoder.java b/src/main/java/at/favre/tools/dice/encode/BinaryEncoder.java index 9ad8e92..d31ab26 100644 --- a/src/main/java/at/favre/tools/dice/encode/BinaryEncoder.java +++ b/src/main/java/at/favre/tools/dice/encode/BinaryEncoder.java @@ -7,7 +7,7 @@ /** * Encodes in to binary representation e.g. 010010011 */ -public class BinaryEncoder implements Encoder { +public class BinaryEncoder extends AByteEncoder { private final static int GROUP_LENGTH = 8; @@ -29,4 +29,9 @@ public String encode(byte[] array) { public String[] names() { return new String[]{"binary", "base2", "bin", "bit"}; } + + @Override + public String getDescription() { + return "Binary encoding in 8 bit groups e.g 010010011 110000011"; + } } diff --git a/src/main/java/at/favre/tools/dice/encode/DecimalByteEncoder.java b/src/main/java/at/favre/tools/dice/encode/DecimalByteEncoder.java index 43dfdda..a1ad465 100644 --- a/src/main/java/at/favre/tools/dice/encode/DecimalByteEncoder.java +++ b/src/main/java/at/favre/tools/dice/encode/DecimalByteEncoder.java @@ -5,7 +5,7 @@ /** * Encodes every byte as a decimal */ -public class DecimalByteEncoder implements Encoder { +public class DecimalByteEncoder extends AByteEncoder { @Override public String encode(byte[] array) { diff --git a/src/main/java/at/favre/tools/dice/encode/Encoder.java b/src/main/java/at/favre/tools/dice/encode/Encoder.java index 9dcfb97..06b1932 100644 --- a/src/main/java/at/favre/tools/dice/encode/Encoder.java +++ b/src/main/java/at/favre/tools/dice/encode/Encoder.java @@ -1,7 +1,22 @@ package at.favre.tools.dice.encode; +/** + * Interface for encoding byte arrays to string + */ public interface Encoder { String encode(byte[] array); + /** + * The names or alias for a user select the encoder + * + * @return all available names + */ String[] names(); + + /** + * User readable description what this encoder does + * + * @return description + */ + String getDescription(); } diff --git a/src/main/java/at/favre/tools/dice/encode/Loader.java b/src/main/java/at/favre/tools/dice/encode/EncoderHandler.java similarity index 60% rename from src/main/java/at/favre/tools/dice/encode/Loader.java rename to src/main/java/at/favre/tools/dice/encode/EncoderHandler.java index bec67b1..66348c5 100644 --- a/src/main/java/at/favre/tools/dice/encode/Loader.java +++ b/src/main/java/at/favre/tools/dice/encode/EncoderHandler.java @@ -2,7 +2,7 @@ import java.util.*; -public class Loader { +public class EncoderHandler { public static final List ENCODERS = Collections.unmodifiableList(Arrays.asList( new AlphaNumericEncoder(), @@ -38,4 +38,28 @@ public List load() { return ENCODERS; } + + public Encoder findByName(String name) { + if (name != null) { + for (Encoder encoder : ENCODERS) { + if (Arrays.asList(encoder.names()).contains(name)) { + return encoder; + } + } + } + return null; + } + + public String returnRegistryInfo() { + StringBuilder sb = new StringBuilder(); + + for (Encoder encoder : ENCODERS) { + for (String name : encoder.names()) { + sb.append(name).append(", "); + } + sb.delete(sb.length() - 2, sb.length()).append("\n"); + sb.append("\tDescription: ").append(encoder.getDescription()).append("\n"); + } + return sb.toString(); + } } diff --git a/src/main/java/at/favre/tools/dice/ui/CLIParser.java b/src/main/java/at/favre/tools/dice/ui/CLIParser.java index 2309e2e..88e9104 100644 --- a/src/main/java/at/favre/tools/dice/ui/CLIParser.java +++ b/src/main/java/at/favre/tools/dice/ui/CLIParser.java @@ -1,5 +1,6 @@ package at.favre.tools.dice.ui; +import at.favre.tools.dice.encode.EncoderHandler; import at.favre.tools.dice.util.CmdUtil; import org.apache.commons.cli.*; @@ -76,7 +77,7 @@ private static Options setupOptions() { Options options = new Options(); Option count = Option.builder(ARG_COUNT).longOpt("count").argName("number").desc("How many randoms should be generated").hasArgs().build(); - Option encodeing = Option.builder(ARG_ENCODING).longOpt("encoding").argName("string").hasArgs().desc("What output encode should be used").build(); + Option encodeing = Option.builder(ARG_ENCODING).longOpt("encoding").argName("string").hasArgs().desc("What output encode should be used. Available encodings include:\n" + new EncoderHandler().returnRegistryInfo()).build(); Option seed = Option.builder(ARG_SEED).longOpt("seed").argName("string").hasArgs().desc("Uses the utf-8 byte representation to seed the SecureRandom.").build(); Option debugOpt = Option.builder(ARG_DEBUG).longOpt("debug").hasArg(false).desc("Prints additional info for debugging.").build(); Option onlineOpt = Option.builder(ARG_ONLINE).longOpt("offline").hasArg(false).desc("Skips request to Random.org to seed random generator (use when offline).").build(); diff --git a/src/test/java/at/favre/tools/dice/encode/LoaderTest.java b/src/test/java/at/favre/tools/dice/encode/EncoderHandlerTest.java similarity index 86% rename from src/test/java/at/favre/tools/dice/encode/LoaderTest.java rename to src/test/java/at/favre/tools/dice/encode/EncoderHandlerTest.java index 1ad93b1..da667e5 100644 --- a/src/test/java/at/favre/tools/dice/encode/LoaderTest.java +++ b/src/test/java/at/favre/tools/dice/encode/EncoderHandlerTest.java @@ -8,10 +8,10 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -public class LoaderTest { +public class EncoderHandlerTest { @Test public void load() throws Exception { - List encoders = new Loader().load(); + List encoders = new EncoderHandler().load(); System.out.println(Arrays.toString(encoders.toArray()));