summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java')
-rw-r--r--base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java185
1 files changed, 105 insertions, 80 deletions
diff --git a/base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java b/base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java
index 64b56fc..bf8fc11 100644
--- a/base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java
+++ b/base/src/main/java/bjc/utils/cli/objects/BlockReaderCLI.java
@@ -23,6 +23,47 @@ import static bjc.utils.cli.objects.Command.CommandStatus.*;
* @author Ben Culkin
*/
public class BlockReaderCLI {
+ /**
+ * The state of the block reader.
+ *
+ * @author Ben Culkin
+ */
+ public static final class BlockReaderState {
+ /**
+ * All of the configured block readers.
+ */
+ public final Map<String, BlockReader> readers;
+ /**
+ * All of the configured I/O sources.
+ */
+ public final Map<String, Reader> sources;
+
+ /**
+ * Create a new set of state for the block reader.
+ *
+ * @param readers
+ * The set of configured block readers.
+ *
+ * @param sources
+ * The set of configured I/O sources.
+ */
+ public BlockReaderState(Map<String, BlockReader> readers, Map<String, Reader> sources) {
+ this.readers = readers;
+ this.sources = sources;
+ }
+
+ /**
+ * Create a new set of state for the block reader.
+ *
+ * @param sources
+ * The set of configured I/O sources.
+ */
+ public BlockReaderState(Map<String, Reader> sources) {
+ this.readers = new HashMap<>();
+ this.sources = sources;
+ }
+ }
+
/* Logger. */
private final Logger LOGGER = Logger.getLogger(BlockReaderCLI.class.getName());
@@ -33,17 +74,17 @@ public class BlockReaderCLI {
* Create a new CLI for configuring BlockReaders.
*
* @param srcs
- * The container of initial I/O sources.
+ * The container of initial I/O sources.
*/
public BlockReaderCLI(Map<String, Reader> srcs) {
- stat = new BlockReaderState(new HashMap<>(), srcs);
+ stat = new BlockReaderState(srcs);
}
/**
* Create a new CLI for configuring BlockReaders.
*
* @param state
- * The state object to use.
+ * The state object to use.
*/
public BlockReaderCLI(BlockReaderState state) {
stat = state;
@@ -54,7 +95,7 @@ public class BlockReaderCLI {
* Run the command line interface
*
* @param args
- * Ignored CLI args.
+ * Ignored CLI args.
*/
public static void main(String[] args) {
/* Create/configure I/O sources. */
@@ -72,60 +113,53 @@ public class BlockReaderCLI {
* Run the CLI on an input source.
*
* @param input
- * The place to read input from.
+ * The place to read input from.
*
- * @param ioSource
- * The name of the place to read input from.
+ * @param srcName
+ * The name of the place to read input from.
*
* @param interactive
- * Whether or not the source is interactive
+ * Whether or not the source is interactive
*/
- public void run(Scanner input, String ioSource, boolean interactive) {
+ public void run(Scanner input, String srcName, boolean interactive) {
int lno = 0;
- /* Print a prompt. */
- if(interactive) {
- System.out.printf("reader-conf(%d)>", lno);
- }
+ do {
+ /* Print a prompt. */
+ if (interactive) {
+ System.out.printf("reader-conf(%d)>", lno);
+ }
- while(input.hasNextLine()) {
/* Read a line. */
String ln = input.nextLine();
lno += 1;
/* Parse the command. */
- Command com = Command.fromString(ln, lno, ioSource);
+ Command com = Command.fromString(ln, lno, srcName);
/* Ignore blank commands. */
- if(com == null) continue;
+ if (com == null) continue;
/* Handle a command. */
- CommandStatus stt = handleCommand(com, interactive);
+ CommandStatus sts = handleCommand(com, interactive);
/* Exit if we finished or encountered a fatal error. */
- if(stt == FINISH || stt == ERROR) {
- return;
- }
-
- /* Print a prompt. */
- if(interactive) {
- System.out.printf("reader-conf(%d)>", lno);
- }
-
- }
+ if (sts == FINISH || sts == ERROR) { return; }
+ } while (input.hasNextLine());
}
/**
* Handle a command.
*
* @param com
- * The command to handle
+ * The command to handle
*
* @param interactive
- * Whether the current input source is interactive or not.
+ * Whether the current input source is interactive or
+ * not.
* @return The status of the executed command.
*/
public CommandStatus handleCommand(Command com, boolean interactive) {
/* Handle each command. */
- switch(com.nameCommand) {
+ switch (com.name) {
case "def-filtered":
return defFiltered(com);
case "def-layered":
@@ -142,57 +176,48 @@ public class BlockReaderCLI {
case "end":
case "exit":
case "quit":
- if(interactive) System.out.printf("Exiting reader-conf, %d readers configured in %d commands\n",
- stat.readers.size(), com.lineNo);
+ if (interactive)
+ System.out.printf("Exiting reader-conf, %d readers configured in %d commands\n",
+ stat.readers.size(), com.lno);
return FINISH;
default:
- LOGGER.severe(com.error("Unknown command '%s'\n", com.nameCommand));
+ LOGGER.severe(com.error("Unknown command '%s'\n", com.name));
return FAIL;
}
}
private CommandStatus defFiltered(Command com) {
- String remn = com.remnCommand;
-
/*
* Get the block name.
*/
- /*
- * @TODO 02/17/18 Ben Culkin :StringHandling
- * This slicing up strings by indexed characters should be abstracted into some
- * sort of class.
- */
- int idx = remn.indexOf(' ');
- if(idx == -1) {
+
+ String blockName = com.trimTo(' ');
+ if (blockName == null) {
LOGGER.severe(com.error("No name argument for def-filtered.\n"));
return FAIL;
}
- String blockName = remn.substring(0, idx).trim();
- remn = remn.substring(idx).trim();
/*
* Check there isn't a reader already bound to this name.
*/
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader named %s\n", blockName));
}
/*
* Get the reader name.
*/
- /* :StringHandling */
- idx = remn.indexOf(' ');
- if(idx == -1) {
+
+ String readerName = com.trimTo(' ');
+ if (readerName == null) {
LOGGER.severe(com.error("No reader-name argument for def-filtered.\n"));
return FAIL;
}
- String readerName = remn.substring(0, idx).trim();
- remn = remn.substring(idx).trim();
/*
* Check there is a reader bound to that name.
*/
- if(!stat.readers.containsKey(readerName)) {
+ if (!stat.readers.containsKey(readerName)) {
LOGGER.severe(com.error("No source named %s\n", readerName));
return FAIL;
}
@@ -200,12 +225,12 @@ public class BlockReaderCLI {
/*
* Get the pattern.
*/
- if(remn.equals("")) {
+ if (com.remn.equals("")) {
LOGGER.severe(com.error("No filter argument for def-filtered\n"));
return FAIL;
}
- String filter = remn;
+ String filter = com.remn;
try {
Pattern pat = Pattern.compile(filter);
@@ -219,7 +244,7 @@ public class BlockReaderCLI {
BlockReader reader = new FilteredBlockReader(stat.readers.get(readerName), pred);
stat.readers.put(blockName, reader);
- } catch(PatternSyntaxException psex) {
+ } catch (PatternSyntaxException psex) {
LOGGER.severe(com.error("Invalid regular expression '%s' for filter. (%s)\n", filter,
psex.getMessage()));
return FAIL;
@@ -229,22 +254,22 @@ public class BlockReaderCLI {
}
private CommandStatus defPushback(Command com) {
- String[] parts = com.remnCommand.split(" ");
+ String[] parts = com.remn.split(" ");
- if(parts.length != 2) {
+ if (parts.length != 2) {
LOGGER.severe(com.error(
"Incorrect number of arguments to def-pushback. Requires a block name and a reader name\n"));
return FAIL;
}
String blockName = parts[0];
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader %s\n", blockName));
return FAIL;
}
String readerName = parts[1];
- if(!stat.readers.containsKey(readerName)) {
+ if (!stat.readers.containsKey(readerName)) {
LOGGER.severe(com.error("No reader named %s\n", readerName));
return FAIL;
}
@@ -256,9 +281,9 @@ public class BlockReaderCLI {
}
private CommandStatus defToggled(Command com) {
- String[] parts = com.remnCommand.split(" ");
+ String[] parts = com.remn.split(" ");
- if(parts.length != 3) {
+ if (parts.length != 3) {
LOGGER.severe(com.error(
"Incorrect number of arguments to def-toggled. Requires a block name and two reader names\n"));
return FAIL;
@@ -268,19 +293,19 @@ public class BlockReaderCLI {
* Get the block name.
*/
String blockName = parts[0];
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader named %s\n", blockName));
}
/*
* Make sure the component readers exist.
*/
- if(!stat.readers.containsKey(parts[1])) {
+ if (!stat.readers.containsKey(parts[1])) {
LOGGER.severe(com.error("No reader named %s\n", parts[1]));
return FAIL;
}
- if(!stat.readers.containsKey(parts[2])) {
+ if (!stat.readers.containsKey(parts[2])) {
LOGGER.severe(com.error("No reader named %s\n", parts[2]));
return FAIL;
}
@@ -292,9 +317,9 @@ public class BlockReaderCLI {
}
private CommandStatus defLayered(Command com) {
- String[] parts = com.remnCommand.split(" ");
+ String[] parts = com.remn.split(" ");
- if(parts.length != 3) {
+ if (parts.length != 3) {
LOGGER.severe(com.error(
"Incorrect number of arguments to def-layered. Requires a block name and two reader names\n"));
return FAIL;
@@ -304,19 +329,19 @@ public class BlockReaderCLI {
* Get the block name.
*/
String blockName = parts[0];
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader named %s\n", blockName));
}
/*
* Make sure the component readers exist.
*/
- if(!stat.readers.containsKey(parts[1])) {
+ if (!stat.readers.containsKey(parts[1])) {
LOGGER.severe(com.error("No reader named %s\n", parts[1]));
return FAIL;
}
- if(!stat.readers.containsKey(parts[2])) {
+ if (!stat.readers.containsKey(parts[2])) {
LOGGER.severe(com.error("No reader named %s\n", parts[2]));
return FAIL;
}
@@ -328,9 +353,9 @@ public class BlockReaderCLI {
}
private CommandStatus defSerial(Command com) {
- String[] parts = com.remnCommand.split(" ");
+ String[] parts = com.remn.split(" ");
- if(parts.length < 2) {
+ if (parts.length < 2) {
LOGGER.severe(com.error(
"Not enough arguments to def-serial. Requires at least a block name and at least one reader name\n"));
return FAIL;
@@ -343,7 +368,7 @@ public class BlockReaderCLI {
/*
* Check there isn't a reader already bound to this name.
*/
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader named %s\n", blockName));
}
@@ -351,13 +376,13 @@ public class BlockReaderCLI {
* Get all of the component readers.
*/
BlockReader[] readerArr = new BlockReader[parts.length - 1];
- for(int i = 1; i < parts.length; i++) {
+ for (int i = 1; i < parts.length; i++) {
String readerName = parts[i];
/*
* Check there is a reader bound to that name.
*/
- if(!stat.readers.containsKey(readerName)) {
+ if (!stat.readers.containsKey(readerName)) {
LOGGER.severe(com.error("No reader named %s\n", readerName));
return FAIL;
}
@@ -373,14 +398,14 @@ public class BlockReaderCLI {
}
private CommandStatus defSimple(Command com) {
- String remn = com.remnCommand;
+ String remn = com.remn;
/*
* Get the block name.
*/
/* :StringHandling */
int idx = remn.indexOf(' ');
- if(idx == -1) {
+ if (idx == -1) {
LOGGER.severe(com.error("No name argument for def-simple.\n"));
return FAIL;
}
@@ -390,7 +415,7 @@ public class BlockReaderCLI {
/*
* Check there isn't a reader already bound to this name.
*/
- if(stat.readers.containsKey(blockName)) {
+ if (stat.readers.containsKey(blockName)) {
LOGGER.warning(com.warn("Shadowing existing reader named %s\n", blockName));
}
@@ -399,7 +424,7 @@ public class BlockReaderCLI {
*/
/* :StringHandling */
idx = remn.indexOf(' ');
- if(idx == -1) {
+ if (idx == -1) {
LOGGER.severe(com.error("No source-name argument for def-simple.\n"));
return FAIL;
}
@@ -409,7 +434,7 @@ public class BlockReaderCLI {
/*
* Check there is a source bound to that name.
*/
- if(!stat.sources.containsKey(sourceName)) {
+ if (!stat.sources.containsKey(sourceName)) {
LOGGER.severe(com.error("No source named %s\n", sourceName));
return FAIL;
}
@@ -417,7 +442,7 @@ public class BlockReaderCLI {
/*
* Get the pattern.
*/
- if(remn.equals("")) {
+ if (remn.equals("")) {
LOGGER.severe(com.error("No delimiter argument for def-simple\n"));
return FAIL;
}
@@ -429,7 +454,7 @@ public class BlockReaderCLI {
BlockReader reader = new SimpleBlockReader(delim, stat.sources.get(sourceName));
stat.readers.put(blockName, reader);
- } catch(PatternSyntaxException psex) {
+ } catch (PatternSyntaxException psex) {
LOGGER.severe(com.error("Invalid regular expression '%s' for delimiter. (%s)\n", delim,
psex.getMessage()));
return FAIL;