Add JShell Accumulo Feature Blog (#274)
This commit contains a blog about
JShell Accumulo Feature for 2.1.
diff --git a/_posts/blog/2021-04-21-jshell-accumulo-feature.md b/_posts/blog/2021-04-21-jshell-accumulo-feature.md
new file mode 100644
index 0000000..b1e2007
--- /dev/null
+++ b/_posts/blog/2021-04-21-jshell-accumulo-feature.md
@@ -0,0 +1,157 @@
+---
+Title: JShell Accumulo Feature
+
+---
+
+## Overview
+
+First introduced in Java 9, [JShell][jshell-doc] is an interactive Read-Evaluate-Print-Loop (REPL)
+Java tool that interprets user's input and outputs the results. This tool provides a convenient
+way to test out and execute quick tasks with Accumulo in the terminal. This feature is a part
+of the upcoming Accumulo 2.1 release. If you're a developer and want to get involved in testing,
+[contact us][contact] or review our [contributing guide][guide].
+
+## Major Features
+* Default JShell script provides initial imports for interacting with Accumulo's API and
+provided in Accumulo's binary distribution tarball
+
+
+* On startup, JShell Accumulo will automatically import the `CLASSPATH`, load in a configured
+environment from user's `conf/accumulo-env.sh`, and invoke `conf/jshell-init.jsh`
+to allow rapid Accumulo task executions
+
+
+* JShell Accumulo can startup using default/custom JShell script and users can append any JShell
+command-line [options][jshell-option] to the startup command
+
+## Booting Up JShell Accumulo
+1) Open up a terminal and navigate to Accumulo's installation directory
+
+2) To startup JShell with **default script** use this command:
+
+```bash
+$ bin/accumulo jshell
+```
+3) To startup JShell with **custom script** use this command:
+
+```bash
+$ bin/accumulo jshell --startup file/path/to/custom_script.jsh
+```
+**Note:** One can execute the `jshell` command to startup JShell. However, doing so will require
+manually importing the `CLASSPATH` and the configured environment from `conf/accumulo-env.sh`
+and manually specifying the startup file for `conf/jshell-init.jsh` before any Accumulo tasks
+can be performed. Using one of the startup commands above will automate that process
+for convenience.
+
+
+## JShell Accumulo Default Script
+The auto-generated `jshell-init.jsh` is a customizable file located in Accumulo's installation
+`conf/` directory. Inside, `jshell-init.jsh` contains [Accumulo Java APIs][public APIs]
+formatted as import statements and [AccumuloClient][client] build implementation. On startup,
+the script automatically loads in the APIs and attempts to construct a client. Should additional
+APIs and/or code implementations be needed, simply append them to `jshell-init.jsh`.
+Alternatively, you can create a separate JShell script and specify the custom script's file path
+on startup.
+
+To construct an [AccumuloClient][client], the provided `conf/jshell-init.jsh` script finds
+and uses `accumulo-client.properties` in Accumulo's class path, and assigns the result
+to a variable called **client**.
+
+If `accumulo-client.properties` is found, a similar result will be produced below:
+
+```
+Preparing JShell for Apache Accumulo
+
+Building Accumulo client using 'jar:file:/home/accumulo/lib/accumulo-client.jar!/accumulo-client.properties'
+
+Use 'client' to interact with Accumulo
+
+| Welcome to JShell -- Version 11.0.10
+| For an introduction type: /help intro
+
+jshell>
+```
+
+If `accumulo-client.properties` is not found, an [AccumuloClient][client] will not
+auto-generate and will produce the following result below:
+
+```
+Preparing JShell for Apache Accumulo
+
+'accumulo-client.properties' was not found on the classpath
+
+| Welcome to JShell -- Version 11.0.10
+| For an introduction type: /help intro
+
+jshell>
+```
+
+## JShell Accumulo Example
+1) Booting up JShell Accumulo using default script
+
+```
+Preparing JShell for Apache Accumulo
+
+Building Accumulo client using 'file:/home/accumulo/conf/accumulo-client.properties'
+
+Use 'client' to interact with Accumulo
+
+| Welcome to JShell -- Version 11.0.10
+| For an introduction type: /help intro
+
+jshell>
+```
+
+2) Providing JShell with an Accumulo task
+
+```Java
+ // Create a table called "GothamPD".
+ client.tableOperations().create("GothamPD");
+
+ // Create a Mutation object to hold all changes to a row in a table.
+ // Each row has a unique row ID.
+ Mutation mutation = new Mutation("id0001");
+
+ // Create key/value pairs for Batman. Put them in the "hero" family.
+ mutation.put("hero", "alias", "Batman");
+ mutation.put("hero", "name", "Bruce Wayne");
+ mutation.put("hero", "wearsCape?", "true");
+
+ // Create a BatchWriter to the GothamPD table and add your mutation to it.
+ // Try w/ resources will close for us.
+ try (BatchWriter writer = client.createBatchWriter("GothamPD")) {
+ writer.addMutation(mutation);
+ }
+
+ // Read and print all rows of the "GothamPD" table.
+ // Try w/ resources will close for us.
+ try (ScannerBase scan = client.createScanner("GothamPD", Authorizations.EMPTY)) {
+ System.out.println("Gotham Police Department Persons of Interest:");
+
+ // A Scanner is an extension of java.lang.Iterable so behaves just like one.
+ scan.forEach((k, v) -> System.out.printf("Key : %-50s Value : %s\n", k, v));
+ }
+```
+
+**Note:** The fully-qualified class name for Accumulo Scanner or
+`org.apache.accumulo.core.client.Scanner` needs to be used due to conflicting issues with
+Java's built-in java.util.Scanner. However, to shorten the Accumulo Scanner's declaration, assign
+scan to `ScannerBase` type instead.
+
+3) Executing the Accumulo task above outputs:
+
+```
+mutation ==> org.apache.accumulo.core.data.Mutation@1
+Gotham Police Department Persons of Interest:
+Key : id0001 hero:alias [] 1618926204602 false Value : Batman
+Key : id0001 hero:name [] 1618926204602 false Value : Bruce Wayne
+Key : id0001 hero:wearsCape? [] 1618926204602 false Value : true
+
+jshell>
+```
+[contact]: https://accumulo.apache.org/contact-us/
+[guide]: https://accumulo.apache.org/how-to-contribute/
+[client]: https://www.javadoc.io/doc/org.apache.accumulo/accumulo-core/latest/org/apache/accumulo/core/client/AccumuloClient.html
+[jshell-doc]: https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8
+[jshell-option]: https://docs.oracle.com/javase/9/tools/jshell.htm#JSWOR-GUID-C337353B-074A-431C-993F-60C226163F00
+[public APIs]: https://accumulo.apache.org/api/